import { useRecoilValue } from 'recoil'; import { useCallback, useMemo, memo } from 'react'; import type { TMessage, TMessageContentParts } from 'librechat-data-provider'; import type { TMessageProps } from '~/common'; import ContentParts from '~/components/Chat/Messages/Content/ContentParts'; import PlaceholderRow from '~/components/Chat/Messages/ui/PlaceholderRow'; import SiblingSwitch from '~/components/Chat/Messages/SiblingSwitch'; import HoverButtons from '~/components/Chat/Messages/HoverButtons'; import Icon from '~/components/Chat/Messages/MessageIcon'; import SubRow from '~/components/Chat/Messages/SubRow'; import { useMessageActions } from '~/hooks'; import { cn, logger } from '~/utils'; import store from '~/store'; type ContentRenderProps = { message?: TMessage; isCard?: boolean; isMultiMessage?: boolean; isSubmittingFamily?: boolean; } & Pick< TMessageProps, 'currentEditId' | 'setCurrentEditId' | 'siblingIdx' | 'setSiblingIdx' | 'siblingCount' >; const ContentRender = memo( ({ isCard, siblingIdx, siblingCount, message: msg, setSiblingIdx, currentEditId, isMultiMessage, setCurrentEditId, isSubmittingFamily, }: ContentRenderProps) => { const { // ask, edit, index, agent, assistant, enterEdit, conversation, messageLabel, isSubmitting, latestMessage, handleContinue, copyToClipboard, setLatestMessage, regenerateMessage, } = useMessageActions({ message: msg, currentEditId, isMultiMessage, setCurrentEditId, }); const fontSize = useRecoilValue(store.fontSize); const handleRegenerateMessage = useCallback(() => regenerateMessage(), [regenerateMessage]); // const { isCreatedByUser, error, unfinished } = msg ?? {}; const isLast = useMemo( () => !(msg?.children?.length ?? 0) && (msg?.depth === latestMessage?.depth || msg?.depth === -1), [msg?.children, msg?.depth, latestMessage?.depth], ); if (!msg) { return null; } const isLatestMessage = msg.messageId === latestMessage?.messageId; const showCardRender = isLast && !(isSubmittingFamily === true) && isCard === true; const isLatestCard = isCard === true && !(isSubmittingFamily === true) && isLatestMessage; const clickHandler = showCardRender && !isLatestMessage ? () => { logger.log(`Message Card click: Setting ${msg.messageId} as latest message`); logger.dir(msg); setLatestMessage(msg); } : undefined; return (
{ if ((e.key === 'Enter' || e.key === ' ') && clickHandler) { clickHandler(); } }} role={showCardRender ? 'button' : undefined} tabIndex={showCardRender ? 0 : undefined} > {isLatestCard === true && (
)}

{messageLabel}

} />
{!(msg.children?.length ?? 0) && (isSubmittingFamily === true || isSubmitting) ? ( ) : ( )}
); }, ); export default ContentRender;