| import { useRecoilState } from 'recoil'; |
| import { useEffect, useCallback } from 'react'; |
| import { isAssistantsEndpoint } from 'librechat-data-provider'; |
| import type { TMessage } from 'librechat-data-provider'; |
| import type { TMessageProps } from '~/common'; |
| import MessageContent from '~/components/Messages/MessageContent'; |
| import MessageParts from './MessageParts'; |
| import Message from './Message'; |
| import store from '~/store'; |
|
|
| export default function MultiMessage({ |
| // messageId is used recursively here |
| messageId, |
| messagesTree, |
| currentEditId, |
| setCurrentEditId, |
| }: TMessageProps) { |
| const [siblingIdx, setSiblingIdx] = useRecoilState(store.messagesSiblingIdxFamily(messageId)); |
|
|
| const setSiblingIdxRev = useCallback( |
| (value: number) => { |
| setSiblingIdx((messagesTree?.length ?? 0) - value - 1); |
| }, |
| [messagesTree?.length, setSiblingIdx], |
| ); |
|
|
| useEffect(() => { |
| |
| setSiblingIdx(0); |
| }, [messagesTree?.length, setSiblingIdx]); |
|
|
| useEffect(() => { |
| if (messagesTree?.length && siblingIdx >= messagesTree.length) { |
| setSiblingIdx(0); |
| } |
| }, [siblingIdx, messagesTree?.length, setSiblingIdx]); |
|
|
| if (!(messagesTree && messagesTree.length)) { |
| return null; |
| } |
|
|
| const message = messagesTree[messagesTree.length - siblingIdx - 1] as TMessage | undefined; |
|
|
| if (!message) { |
| return null; |
| } |
|
|
| if (isAssistantsEndpoint(message.endpoint) && message.content) { |
| return ( |
| <MessageParts |
| key={message.messageId} |
| message={message} |
| currentEditId={currentEditId} |
| setCurrentEditId={setCurrentEditId} |
| siblingIdx={messagesTree.length - siblingIdx - 1} |
| siblingCount={messagesTree.length} |
| setSiblingIdx={setSiblingIdxRev} |
| /> |
| ); |
| } else if (message.content) { |
| return ( |
| <MessageContent |
| key={message.messageId} |
| message={message} |
| currentEditId={currentEditId} |
| setCurrentEditId={setCurrentEditId} |
| siblingIdx={messagesTree.length - siblingIdx - 1} |
| siblingCount={messagesTree.length} |
| setSiblingIdx={setSiblingIdxRev} |
| /> |
| ); |
| } |
|
|
| return ( |
| <Message |
| key={message.messageId} |
| message={message} |
| currentEditId={currentEditId} |
| setCurrentEditId={setCurrentEditId} |
| siblingIdx={messagesTree.length - siblingIdx - 1} |
| siblingCount={messagesTree.length} |
| setSiblingIdx={setSiblingIdxRev} |
| /> |
| ); |
| } |
|
|