import { memo, Suspense, useMemo } from 'react'; import { useRecoilValue } from 'recoil'; import { DelayedRender } from '@librechat/client'; import type { TMessage } from 'librechat-data-provider'; import type { TMessageContentProps, TDisplayProps } from '~/common'; import Error from '~/components/Messages/Content/Error'; import Thinking from '~/components/Artifacts/Thinking'; import { useMessageContext } from '~/Providers'; import MarkdownLite from './MarkdownLite'; import EditMessage from './EditMessage'; import { useLocalize } from '~/hooks'; import Container from './Container'; import Markdown from './Markdown'; import { cn } from '~/utils'; import store from '~/store'; export const ErrorMessage = ({ text, message, className = '', }: Pick & { message?: TMessage; }) => { const localize = useLocalize(); if (text === 'Error connecting to server, try refreshing the page.') { console.log('error message', message); return (

} >
{localize('com_ui_error_connection')}
); } return (
); }; const DisplayMessage = ({ text, isCreatedByUser, message, showCursor }: TDisplayProps) => { const { isSubmitting = false, isLatestMessage = false } = useMessageContext(); const enableUserMsgMarkdown = useRecoilValue(store.enableUserMsgMarkdown); const showCursorState = useMemo( () => showCursor === true && isSubmitting, [showCursor, isSubmitting], ); let content: React.ReactElement; if (!isCreatedByUser) { content = ; } else if (enableUserMsgMarkdown) { content = ; } else { content = <>{text}; } return (
{content}
); }; // Unfinished Message Component export const UnfinishedMessage = ({ message }: { message: TMessage }) => ( ); const MessageContent = ({ text, edit, error, unfinished, isSubmitting, isLast, ...props }: TMessageContentProps) => { const { message } = props; const { messageId } = message; const { thinkingContent, regularContent } = useMemo(() => { const thinkingMatch = text.match(/:::thinking([\s\S]*?):::/); return { thinkingContent: thinkingMatch ? thinkingMatch[1].trim() : '', regularContent: thinkingMatch ? text.replace(/:::thinking[\s\S]*?:::/, '').trim() : text, }; }, [text]); const showRegularCursor = useMemo(() => isLast && isSubmitting, [isLast, isSubmitting]); const unfinishedMessage = useMemo( () => !isSubmitting && unfinished ? ( ) : null, [isSubmitting, unfinished, message], ); if (error) { return ; } else if (edit) { return ; } return ( <> {thinkingContent.length > 0 && ( {thinkingContent} )} {unfinishedMessage} ); }; export default memo(MessageContent);