UNPKG

@assistant-ui/react

Version:

Typescript/React library for AI Chat

77 lines (76 loc) 3.24 kB
"use client"; // src/primitives/thread/ThreadMessages.tsx import { memo, useMemo } from "react"; import { useThread, useThreadRuntime } from "../../context/react/ThreadContext.mjs"; import { MessageRuntimeProvider } from "../../context/providers/MessageRuntimeProvider.mjs"; import { useEditComposer, useMessage } from "../../context/index.mjs"; import { jsx } from "react/jsx-runtime"; var isComponentsSame = (prev, next) => { return prev.Message === next.Message && prev.EditComposer === next.EditComposer && prev.UserEditComposer === next.UserEditComposer && prev.AssistantEditComposer === next.AssistantEditComposer && prev.SystemEditComposer === next.SystemEditComposer && prev.UserMessage === next.UserMessage && prev.AssistantMessage === next.AssistantMessage && prev.SystemMessage === next.SystemMessage; }; var DEFAULT_SYSTEM_MESSAGE = () => null; var getComponent = (components, role, isEditing) => { switch (role) { case "user": if (isEditing) { return components.UserEditComposer ?? components.EditComposer ?? components.UserMessage ?? components.Message; } else { return components.UserMessage ?? components.Message; } case "assistant": if (isEditing) { return components.AssistantEditComposer ?? components.EditComposer ?? components.AssistantMessage ?? components.Message; } else { return components.AssistantMessage ?? components.Message; } case "system": if (isEditing) { return components.SystemEditComposer ?? components.EditComposer ?? components.SystemMessage ?? components.Message; } else { return components.SystemMessage ?? DEFAULT_SYSTEM_MESSAGE; } default: const _exhaustiveCheck = role; throw new Error(`Unknown message role: ${_exhaustiveCheck}`); } }; var ThreadMessageComponent = ({ components }) => { const role = useMessage((m) => m.role); const isEditing = useEditComposer((c) => c.isEditing); const Component = getComponent(components, role, isEditing); return /* @__PURE__ */ jsx(Component, {}); }; var ThreadMessageImpl = ({ messageIndex, components }) => { const threadRuntime = useThreadRuntime(); const runtime = useMemo( () => threadRuntime.getMesssageByIndex(messageIndex), [threadRuntime, messageIndex] ); return /* @__PURE__ */ jsx(MessageRuntimeProvider, { runtime, children: /* @__PURE__ */ jsx(ThreadMessageComponent, { components }) }); }; var ThreadMessage = memo( ThreadMessageImpl, (prev, next) => prev.messageIndex === next.messageIndex && isComponentsSame(prev.components, next.components) ); var ThreadPrimitiveMessagesImpl = ({ components }) => { const messagesLength = useThread((t) => t.messages.length); if (messagesLength === 0) return null; return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ jsx(ThreadMessage, { messageIndex: index, components }, index)); }; ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages"; var ThreadPrimitiveMessages = memo( ThreadPrimitiveMessagesImpl, (prev, next) => isComponentsSame(prev.components, next.components) ); export { ThreadPrimitiveMessages, ThreadPrimitiveMessagesImpl }; //# sourceMappingURL=ThreadMessages.mjs.map