import React, { useCallback, useMemo } from 'react'; import { useMessageActions } from '~/hooks'; import type { TMessage } from 'librechat-data-provider'; import type { TMessageProps } from '~/common'; import MessageContent from '~/components/Chat/Messages/Content/MessageContent'; 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 { Plugin } from '~/components/Messages/Content'; import SubRow from '~/components/Chat/Messages/SubRow'; import { cn } from '~/utils'; type MessageRenderProps = { message?: TMessage; isCard?: boolean; isMultiMessage?: boolean; isSubmittingFamily?: boolean; } & Pick< TMessageProps, 'currentEditId' | 'setCurrentEditId' | 'siblingIdx' | 'setSiblingIdx' | 'siblingCount' >; const MessageRender = React.memo( ({ isCard, siblingIdx, siblingCount, message: msg, setSiblingIdx, currentEditId, isMultiMessage, setCurrentEditId, isSubmittingFamily, }: MessageRenderProps) => { const { ask, edit, index, assistant, enterEdit, conversation, messageLabel, isSubmitting, latestMessage, handleContinue, copyToClipboard, setLatestMessage, regenerateMessage, } = useMessageActions({ message: msg, currentEditId, isMultiMessage, setCurrentEditId, }); const handleRegenerateMessage = useCallback(() => regenerateMessage(), [regenerateMessage]); const { isCreatedByUser, error, unfinished } = msg ?? {}; const isLast = useMemo( () => !msg?.children?.length && (msg?.depth === latestMessage?.depth || msg?.depth === -1), [msg?.children, msg?.depth, latestMessage?.depth], ); if (!msg) { return null; } const isLatestCard = isCard && !isSubmittingFamily && msg.messageId === latestMessage?.messageId; const clickHandler = isLast && isCard && !isSubmittingFamily && msg.messageId !== latestMessage?.messageId ? () => setLatestMessage(msg) : undefined; return (
{isLatestCard && (
)}
{messageLabel}
{msg?.plugin && } ({}))} />
{!msg?.children?.length && (isSubmittingFamily || isSubmitting) ? ( ) : ( )}
); }, ); export default MessageRender;