| import { useCallback } from 'react'; |
| import { useQueryClient } from '@tanstack/react-query'; |
| import { QueryKeys } from 'librechat-data-provider'; |
| import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; |
| import type { TMessage } from 'librechat-data-provider'; |
| import useChatFunctions from '~/hooks/Chat/useChatFunctions'; |
| import store from '~/store'; |
|
|
| |
| export default function useAddedHelpers({ |
| rootIndex = 0, |
| currentIndex, |
| paramId, |
| }: { |
| rootIndex?: number; |
| currentIndex: number; |
| paramId?: string; |
| }) { |
| const queryClient = useQueryClient(); |
|
|
| const clearAllSubmissions = store.useClearSubmissionState(); |
| const [files, setFiles] = useRecoilState(store.filesByIndex(rootIndex)); |
| const latestMessage = useRecoilValue(store.latestMessageFamily(rootIndex)); |
| const setLatestMultiMessage = useSetRecoilState(store.latestMessageFamily(currentIndex)); |
|
|
| const { useCreateConversationAtom } = store; |
| const { conversation, setConversation } = useCreateConversationAtom(currentIndex); |
| const [isSubmitting, setIsSubmitting] = useRecoilState(store.isSubmittingFamily(currentIndex)); |
|
|
| const setSiblingIdx = useSetRecoilState( |
| store.messagesSiblingIdxFamily(latestMessage?.parentMessageId ?? null), |
| ); |
|
|
| const queryParam = paramId === 'new' ? paramId : conversation?.conversationId ?? paramId ?? ''; |
|
|
| const setMessages = useCallback( |
| (messages: TMessage[]) => { |
| queryClient.setQueryData<TMessage[]>( |
| [QueryKeys.messages, queryParam, currentIndex], |
| messages, |
| ); |
| const latestMultiMessage = messages[messages.length - 1]; |
| if (latestMultiMessage) { |
| setLatestMultiMessage({ ...latestMultiMessage, depth: -1 }); |
| } |
| }, |
| [queryParam, queryClient, currentIndex, setLatestMultiMessage], |
| ); |
|
|
| const getMessages = useCallback(() => { |
| return queryClient.getQueryData<TMessage[]>([QueryKeys.messages, queryParam, currentIndex]); |
| }, [queryParam, queryClient, currentIndex]); |
|
|
| const setSubmission = useSetRecoilState(store.submissionByIndex(currentIndex)); |
|
|
| const { ask, regenerate } = useChatFunctions({ |
| index: currentIndex, |
| files, |
| setFiles, |
| getMessages, |
| setMessages, |
| isSubmitting, |
| conversation, |
| setSubmission, |
| latestMessage, |
| }); |
|
|
| const continueGeneration = () => { |
| if (!latestMessage) { |
| console.error('Failed to regenerate the message: latestMessage not found.'); |
| return; |
| } |
|
|
| const messages = getMessages(); |
|
|
| const parentMessage = messages?.find( |
| (element) => element.messageId == latestMessage.parentMessageId, |
| ); |
|
|
| if (parentMessage && parentMessage.isCreatedByUser) { |
| ask({ ...parentMessage }, { isContinued: true, isRegenerate: true, isEdited: true }); |
| } else { |
| console.error( |
| 'Failed to regenerate the message: parentMessage not found, or not created by user.', |
| ); |
| } |
| }; |
|
|
| const stopGenerating = () => clearAllSubmissions(); |
|
|
| const handleStopGenerating = (e: React.MouseEvent<HTMLButtonElement>) => { |
| e.preventDefault(); |
| stopGenerating(); |
| }; |
|
|
| const handleRegenerate = (e: React.MouseEvent<HTMLButtonElement>) => { |
| e.preventDefault(); |
| const parentMessageId = latestMessage?.parentMessageId; |
| if (!parentMessageId) { |
| console.error('Failed to regenerate the message: parentMessageId not found.'); |
| return; |
| } |
| regenerate({ parentMessageId }); |
| }; |
|
|
| const handleContinue = (e: React.MouseEvent<HTMLButtonElement>) => { |
| e.preventDefault(); |
| continueGeneration(); |
| setSiblingIdx(0); |
| }; |
|
|
| return { |
| ask, |
| regenerate, |
| getMessages, |
| setMessages, |
| conversation, |
| isSubmitting, |
| setSiblingIdx, |
| latestMessage, |
| stopGenerating, |
| handleContinue, |
| setConversation, |
| setIsSubmitting, |
| handleRegenerate, |
| handleStopGenerating, |
| }; |
| } |
|
|