core/apps/webapp/app/components/conversation/conversation-item.client.tsx
Harshith Mullapudi f39c7cc6d0
feat: remove trigger and run base on bullmq (#126)
* feat: remove trigger and run base on bullmq
* fix: telemetry and trigger deploymen
* feat: add Ollama container and update ingestion status for unchanged documents
* feat: add logger to bullmq workers
* 1. Remove chat and deep-search from trigger
2. Add ai/sdk for chat UI
3. Added a better model manager

* refactor: simplify clustered graph query and add stop conditions for AI responses

* fix: streaming

* fix: docker docs

---------

Co-authored-by: Manoj <saimanoj58@gmail.com>
2025-10-26 12:56:12 +05:30

65 lines
1.9 KiB
TypeScript

import { EditorContent, useEditor } from "@tiptap/react";
import { useEffect, memo } from "react";
import { cn } from "~/lib/utils";
import { extensionsForConversation } from "./editor-extensions";
import { skillExtension } from "../editor/skill-extension";
import { type UIMessage } from "ai";
interface AIConversationItemProps {
message: UIMessage;
}
function getMessage(message: string) {
let finalMessage = message.replace("<final_response>", "");
finalMessage = finalMessage.replace("</final_response>", "");
finalMessage = finalMessage.replace("<question_response>", "");
finalMessage = finalMessage.replace("</question_response>", "");
return finalMessage;
}
const ConversationItemComponent = ({ message }: AIConversationItemProps) => {
const isUser = message.role === "user" || false;
const textPart = message.parts.find((part) => part.type === "text");
const editor = useEditor({
extensions: [...extensionsForConversation, skillExtension],
editable: false,
content: textPart ? getMessage(textPart.text) : "",
});
useEffect(() => {
if (textPart) {
editor?.commands.setContent(getMessage(textPart.text));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [message]);
if (!message) {
return null;
}
return (
<div className={cn("flex gap-2 px-4 pb-2", isUser && "my-4 justify-end")}>
<div
className={cn(
"flex flex-col",
isUser && "bg-primary/20 max-w-[500px] rounded-md p-3",
)}
>
<EditorContent editor={editor} className="editor-container" />
</div>
</div>
);
};
// Memoize to prevent unnecessary re-renders
export const ConversationItem = memo(
ConversationItemComponent,
(prevProps, nextProps) => {
// Only re-render if the conversation history ID or message changed
return prevProps.message === nextProps.message;
},
);