import { memo } from 'react'; import { useRecoilValue } from 'recoil'; import { useForm } from 'react-hook-form'; import { useParams } from 'react-router-dom'; import { useGetMessagesByConvoId } from 'librechat-data-provider/react-query'; import type { ChatFormValues } from '~/common'; import { ChatContext, AddedChatContext, useFileMapContext, ChatFormProvider } from '~/Providers'; import { useChatHelpers, useAddedResponse, useSSE } from '~/hooks'; import MessagesView from './Messages/MessagesView'; import { Spinner } from '~/components/svg'; import Presentation from './Presentation'; import ChatForm from './Input/ChatForm'; import { buildTree } from '~/utils'; import Landing from './Landing'; import Header from './Header'; import Footer from './Footer'; import store from '~/store'; function ChatView({ index = 0 }: { index?: number }) { const { conversationId } = useParams(); const rootSubmission = useRecoilValue(store.submissionByIndex(index)); const addedSubmission = useRecoilValue(store.submissionByIndex(index + 1)); const fileMap = useFileMapContext(); const { data: messagesTree = null, isLoading } = useGetMessagesByConvoId(conversationId ?? '', { select: (data) => { const dataTree = buildTree({ messages: data, fileMap }); return dataTree?.length === 0 ? null : dataTree ?? null; }, enabled: !!fileMap, }); const chatHelpers = useChatHelpers(index, conversationId); const addedChatHelpers = useAddedResponse({ rootIndex: index }); useSSE(rootSubmission, chatHelpers, false); useSSE(addedSubmission, addedChatHelpers, true); const methods = useForm({ defaultValues: { text: '' }, }); let content: JSX.Element | null | undefined; if (isLoading && conversationId !== 'new') { content = (
); } else if (messagesTree && messagesTree.length !== 0) { content = } />; } else { content = } />; } return ( {content}
); } export default memo(ChatView);