| import { useCallback } from 'react'; | |
| import { useSetRecoilState, useResetRecoilState, useRecoilCallback, useRecoilValue } from 'recoil'; | |
| import type { | |
| TConversation, | |
| TMessagesAtom, | |
| TSubmission, | |
| TPreset, | |
| TModelsConfig, | |
| } from 'librechat-data-provider'; | |
| import { buildDefaultConvo, getDefaultEndpoint } from '~/utils'; | |
| import store from '~/store'; | |
| const useConversation = () => { | |
| const setConversation = useSetRecoilState(store.conversation); | |
| const setMessages = useSetRecoilState<TMessagesAtom>(store.messages); | |
| const setSubmission = useSetRecoilState<TSubmission | null>(store.submission); | |
| const resetLatestMessage = useResetRecoilState(store.latestMessage); | |
| const endpointsConfig = useRecoilValue(store.endpointsConfig); | |
| const switchToConversation = useRecoilCallback( | |
| ({ snapshot }) => | |
| async ( | |
| conversation: TConversation, | |
| messages: TMessagesAtom = null, | |
| preset: TPreset | null = null, | |
| modelsData?: TModelsConfig, | |
| ) => { | |
| const modelsConfig = modelsData ?? snapshot.getLoadable(store.modelsConfig).contents; | |
| const { endpoint = null } = conversation; | |
| if (endpoint === null) { | |
| const defaultEndpoint = getDefaultEndpoint({ | |
| convoSetup: preset ?? conversation, | |
| endpointsConfig, | |
| }); | |
| const models = modelsConfig?.[defaultEndpoint] ?? []; | |
| conversation = buildDefaultConvo({ | |
| conversation, | |
| lastConversationSetup: preset as TConversation, | |
| endpoint: defaultEndpoint, | |
| models, | |
| }); | |
| } | |
| setConversation(conversation); | |
| setMessages(messages); | |
| setSubmission({} as TSubmission); | |
| resetLatestMessage(); | |
| }, | |
| [endpointsConfig], | |
| ); | |
| const newConversation = useCallback( | |
| (template = {}, preset?: TPreset, modelsData?: TModelsConfig) => { | |
| switchToConversation( | |
| { | |
| conversationId: 'new', | |
| title: 'New Chat', | |
| ...template, | |
| endpoint: null, | |
| createdAt: '', | |
| updatedAt: '', | |
| }, | |
| [], | |
| preset, | |
| modelsData, | |
| ); | |
| }, | |
| [switchToConversation], | |
| ); | |
| const searchPlaceholderConversation = useCallback(() => { | |
| switchToConversation( | |
| { | |
| conversationId: 'search', | |
| title: 'Search', | |
| endpoint: null, | |
| createdAt: '', | |
| updatedAt: '', | |
| }, | |
| [], | |
| ); | |
| }, [switchToConversation]); | |
| return { | |
| switchToConversation, | |
| newConversation, | |
| searchPlaceholderConversation, | |
| }; | |
| }; | |
| export default useConversation; | |