import { useEffect, useRef, useCallback } from 'react'; import { isAssistantsEndpoint } from 'librechat-data-provider'; import type { TMessageProps } from '~/common'; import { useChatContext, useAssistantsMapContext } from '~/Providers'; import useCopyToClipboard from './useCopyToClipboard'; export default function useMessageHelpers(props: TMessageProps) { const latestText = useRef(''); const { message, currentEditId, setCurrentEditId } = props; const { ask, regenerate, isSubmitting, conversation, latestMessage, setAbortScroll, handleContinue, setLatestMessage, } = useChatContext(); const assistantMap = useAssistantsMapContext(); const { text, content, children, messageId = null, isCreatedByUser } = message ?? {}; const edit = messageId === currentEditId; const isLast = !children?.length; useEffect(() => { let contentChanged = message?.content ? message?.content?.length !== latestText.current : message?.text !== latestText.current; if (!isLast) { contentChanged = false; } if (!message) { return; } else if (isLast && conversation?.conversationId !== 'new' && contentChanged) { setLatestMessage({ ...message }); latestText.current = message?.content ? message.content.length : message.text; } }, [isLast, message, setLatestMessage, conversation?.conversationId]); const enterEdit = useCallback( (cancel?: boolean) => setCurrentEditId && setCurrentEditId(cancel ? -1 : messageId), [messageId, setCurrentEditId], ); const handleScroll = useCallback(() => { if (isSubmitting) { setAbortScroll(true); } else { setAbortScroll(false); } }, [isSubmitting, setAbortScroll]); const assistant = isAssistantsEndpoint(conversation?.endpoint) && assistantMap?.[conversation?.endpoint ?? '']?.[message?.model ?? '']; const regenerateMessage = () => { if ((isSubmitting && isCreatedByUser) || !message) { return; } regenerate(message); }; const copyToClipboard = useCopyToClipboard({ text, content }); return { ask, edit, isLast, assistant, enterEdit, conversation, isSubmitting, handleScroll, latestMessage, handleContinue, copyToClipboard, regenerateMessage, }; }