UNPKG

@assistant-ui/react

Version:

TypeScript/React library for AI Chat

115 lines 3.94 kB
"use client"; import { resource, tapMemo, tapState, tapInlineResource, } from "@assistant-ui/tap"; import { tapLookupResources } from "./util-hooks/tapLookupResources.js"; import { tapApi } from "../utils/tap-store/index.js"; import { NoOpComposerClient } from "./NoOpComposerClient.js"; const ThreadMessagePartClient = resource(({ part }) => { const state = tapMemo(() => { return { ...part, status: { type: "complete" }, }; }, [part]); return tapApi({ getState: () => state, addToolResult: () => { throw new Error("Not supported"); }, resumeToolCall: () => { throw new Error("Not supported"); }, }, { key: state.type === "tool-call" ? `toolCallId-${state.toolCallId}` : undefined, }); }); const ThreadMessageAttachmentClient = resource(({ attachment }) => { return tapApi({ getState: () => attachment, remove: () => { throw new Error("Not supported"); }, }, { key: attachment.id, }); }); export const ThreadMessageClient = resource(({ message, index, isLast = true, branchNumber = 1, branchCount = 1, }) => { const [isCopiedState, setIsCopied] = tapState(false); const [isHoveringState, setIsHovering] = tapState(false); const parts = tapLookupResources(message.content.map((part, idx) => [ "toolCallId" in part && part.toolCallId != null ? `toolCallId-${part.toolCallId}` : `index-${idx}`, ThreadMessagePartClient({ part }), ])); const attachments = tapLookupResources(message.attachments?.map((attachment) => [ attachment.id, ThreadMessageAttachmentClient({ attachment }), ]) ?? []); const composerState = tapInlineResource(NoOpComposerClient({ type: "edit" })); const state = tapMemo(() => { return { ...message, parts: parts.state, composer: composerState.state, parentId: null, index, isLast, branchNumber, branchCount, speech: undefined, submittedFeedback: message.metadata.submittedFeedback, isCopied: isCopiedState, isHovering: isHoveringState, }; }, [message, index, isCopiedState, isHoveringState, isLast]); return tapApi({ getState: () => state, composer: composerState.api, part: (selector) => { if ("index" in selector) { return parts.api({ index: selector.index }); } else { return parts.api({ key: `toolCallId-${selector.toolCallId}` }); } }, attachment: (selector) => { if ("id" in selector) { return attachments.api({ key: selector.id }); } else { return attachments.api(selector); } }, reload: () => { throw new Error("Not supported in ThreadMessageProvider"); }, speak: () => { throw new Error("Not supported in ThreadMessageProvider"); }, stopSpeaking: () => { throw new Error("Not supported in ThreadMessageProvider"); }, submitFeedback: () => { throw new Error("Not supported in ThreadMessageProvider"); }, switchToBranch: () => { throw new Error("Not supported in ThreadMessageProvider"); }, getCopyText: () => { return message.content .map((part) => { if ("text" in part && typeof part.text === "string") { return part.text; } return ""; }) .join("\n"); }, setIsCopied, setIsHovering, }); }); //# sourceMappingURL=ThreadMessageClient.js.map