mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-20 02:10:15 +01:00
* ci: add spec for validateImageRequest * chore: install nanoid and run npm audit fix * refactor: optimize and further anonymize shared links data * ci: add SharedLink specs * feat: anonymize asst_id's * ci: tests actually failing, to revisit later * fix: do not anonymize authenticated shared links query * refactor: Update ShareView component styling * refactor: remove nested ternary * refactor: no nested ternaries * fix(ShareView): eslint warnings * fix(eslint): remove nested terns
74 lines
2.7 KiB
TypeScript
74 lines
2.7 KiB
TypeScript
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<ChatFormValues>({
|
|
defaultValues: { text: '' },
|
|
});
|
|
|
|
let content: JSX.Element | null | undefined;
|
|
if (isLoading && conversationId !== 'new') {
|
|
content = (
|
|
<div className="flex h-screen items-center justify-center">
|
|
<Spinner className="opacity-0" />
|
|
</div>
|
|
);
|
|
} else if (messagesTree && messagesTree.length !== 0) {
|
|
content = <MessagesView messagesTree={messagesTree} Header={<Header />} />;
|
|
} else {
|
|
content = <Landing Header={<Header />} />;
|
|
}
|
|
|
|
return (
|
|
<ChatFormProvider {...methods}>
|
|
<ChatContext.Provider value={chatHelpers}>
|
|
<AddedChatContext.Provider value={addedChatHelpers}>
|
|
<Presentation useSidePanel={true}>
|
|
{content}
|
|
<div className="w-full border-t-0 pl-0 pt-2 dark:border-white/20 md:w-[calc(100%-.5rem)] md:border-t-0 md:border-transparent md:pl-0 md:pt-0 md:dark:border-transparent">
|
|
<ChatForm index={index} />
|
|
<Footer />
|
|
</div>
|
|
</Presentation>
|
|
</AddedChatContext.Provider>
|
|
</ChatContext.Provider>
|
|
</ChatFormProvider>
|
|
);
|
|
}
|
|
|
|
export default memo(ChatView);
|