| import { v4 } from 'uuid'; |
| import { useCallback } from 'react'; |
| import { useRecoilValue, useSetRecoilState } from 'recoil'; |
| import { Constants, replaceSpecialVars } from 'librechat-data-provider'; |
| import { useChatContext, useChatFormContext, useAddedChatContext } from '~/Providers'; |
| import { useAuthContext } from '~/hooks/AuthContext'; |
| import store from '~/store'; |
|
|
| const appendIndex = (index: number, value?: string) => { |
| if (!value) { |
| return value; |
| } |
| return `${value}${Constants.COMMON_DIVIDER}${index}`; |
| }; |
|
|
| export default function useSubmitMessage() { |
| const { user } = useAuthContext(); |
| const methods = useChatFormContext(); |
| const { ask, index, getMessages, setMessages, latestMessage } = useChatContext(); |
| const { addedIndex, ask: askAdditional, conversation: addedConvo } = useAddedChatContext(); |
|
|
| const autoSendPrompts = useRecoilValue(store.autoSendPrompts); |
| const activeConvos = useRecoilValue(store.allConversationsSelector); |
| const setActivePrompt = useSetRecoilState(store.activePromptByIndex(index)); |
|
|
| const submitMessage = useCallback( |
| (data?: { text: string }) => { |
| if (!data) { |
| return console.warn('No data provided to submitMessage'); |
| } |
| const rootMessages = getMessages(); |
| const isLatestInRootMessages = rootMessages?.some( |
| (message) => message.messageId === latestMessage?.messageId, |
| ); |
| if (!isLatestInRootMessages && latestMessage) { |
| setMessages([...(rootMessages || []), latestMessage]); |
| } |
|
|
| const hasAdded = addedIndex && activeConvos[addedIndex] && addedConvo; |
| const isNewMultiConvo = |
| hasAdded && |
| activeConvos.every((convoId) => convoId === Constants.NEW_CONVO) && |
| !rootMessages?.length; |
| const overrideConvoId = isNewMultiConvo ? v4() : undefined; |
| const overrideUserMessageId = hasAdded ? v4() : undefined; |
| const rootIndex = addedIndex - 1; |
| const clientTimestamp = new Date().toISOString(); |
|
|
| ask({ |
| text: data.text, |
| overrideConvoId: appendIndex(rootIndex, overrideConvoId), |
| overrideUserMessageId: appendIndex(rootIndex, overrideUserMessageId), |
| clientTimestamp, |
| }); |
|
|
| if (hasAdded) { |
| askAdditional( |
| { |
| text: data.text, |
| overrideConvoId: appendIndex(addedIndex, overrideConvoId), |
| overrideUserMessageId: appendIndex(addedIndex, overrideUserMessageId), |
| clientTimestamp, |
| }, |
| { overrideMessages: rootMessages }, |
| ); |
| } |
| methods.reset(); |
| }, |
| [ |
| ask, |
| methods, |
| addedIndex, |
| addedConvo, |
| setMessages, |
| getMessages, |
| activeConvos, |
| askAdditional, |
| latestMessage, |
| ], |
| ); |
|
|
| const submitPrompt = useCallback( |
| (text: string) => { |
| const parsedText = replaceSpecialVars({ text, user }); |
| if (autoSendPrompts) { |
| submitMessage({ text: parsedText }); |
| return; |
| } |
|
|
| const currentText = methods.getValues('text'); |
| const newText = currentText.trim().length > 1 ? `\n${parsedText}` : parsedText; |
| setActivePrompt(newText); |
| }, |
| [autoSendPrompts, submitMessage, setActivePrompt, methods, user], |
| ); |
|
|
| return { submitMessage, submitPrompt }; |
| } |
|
|