import { useRecoilValue } from 'recoil'; import { useEffect, useRef, useCallback, useMemo, useState } from 'react'; import type { TMessage } from 'librechat-data-provider'; import { useChatContext, useAddedChatContext } from '~/Providers'; import { getLatestText, getLengthAndFirstFiveChars } from '~/utils'; import store from '~/store'; export default function useMessageProcess({ message }: { message?: TMessage | null }) { const latestText = useRef(''); const hasNoChildren = useMemo(() => !message?.children?.length, [message]); const [siblingMessage, setSiblingMessage] = useState(null); const { index, conversation, latestMessage, setAbortScroll, setLatestMessage, isSubmitting: isSubmittingRoot, } = useChatContext(); const { isSubmitting: isSubmittingAdditional } = useAddedChatContext(); const latestMultiMessage = useRecoilValue(store.latestMessageFamily(index + 1)); const isSubmittingFamily = useMemo( () => isSubmittingRoot || isSubmittingAdditional, [isSubmittingRoot, isSubmittingAdditional], ); useEffect(() => { if (conversation?.conversationId === 'new') { return; } if (!message) { return; } if (!hasNoChildren) { return; } const text = getLatestText(message); const textKey = `${message?.messageId ?? ''}${getLengthAndFirstFiveChars(text)}`; if (textKey === latestText.current) { return; } latestText.current = textKey; setLatestMessage({ ...message }); }, [hasNoChildren, message, setLatestMessage, conversation?.conversationId]); const handleScroll = useCallback(() => { if (isSubmittingFamily) { setAbortScroll(true); } else { setAbortScroll(false); } }, [isSubmittingFamily, setAbortScroll]); const showSibling = useMemo( () => (hasNoChildren && latestMultiMessage && !latestMultiMessage?.children?.length) || siblingMessage, [hasNoChildren, latestMultiMessage, siblingMessage], ); useEffect(() => { if ( hasNoChildren && latestMultiMessage && latestMultiMessage.conversationId === message?.conversationId ) { const newSibling = Object.assign({}, latestMultiMessage, { parentMessageId: message?.parentMessageId, depth: message?.depth, }); setSiblingMessage(newSibling); } }, [hasNoChildren, latestMultiMessage, message, setSiblingMessage, latestMessage]); return { showSibling, handleScroll, conversation, siblingMessage, setSiblingMessage, isSubmittingFamily, latestMultiMessage, }; }