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(() => { // reset siblingIdx when the tree changes, mostly when a new message is submitting. 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 ( ); } else if (message.content) { return ( ); } return ( ); }