import React, { useMemo } from 'react'; import { useRecoilValue } from 'recoil'; import type { TMessageContentParts } from 'librechat-data-provider'; import type { TMessageProps, TMessageIcon } from '~/common'; import MessageIcon from '~/components/Chat/Messages/MessageIcon'; import { useMessageHelpers, useLocalize } from '~/hooks'; import ContentParts from './Content/ContentParts'; import SiblingSwitch from './SiblingSwitch'; import MultiMessage from './MultiMessage'; import HoverButtons from './HoverButtons'; import SubRow from './SubRow'; import { cn } from '~/utils'; import store from '~/store'; export default function Message(props: TMessageProps) { const localize = useLocalize(); const { message, siblingIdx, siblingCount, setSiblingIdx, currentEditId, setCurrentEditId } = props; const { edit, index, agent, isLast, enterEdit, assistant, handleScroll, conversation, isSubmitting, latestMessage, handleContinue, copyToClipboard, regenerateMessage, } = useMessageHelpers(props); const fontSize = useRecoilValue(store.fontSize); const maximizeChatSpace = useRecoilValue(store.maximizeChatSpace); const { children, messageId = null, isCreatedByUser } = message ?? {}; const name = useMemo(() => { let result = ''; if (isCreatedByUser === true) { result = localize('com_user_message'); } else if (assistant) { result = assistant.name ?? localize('com_ui_assistant'); } else if (agent) { result = agent.name ?? localize('com_ui_agent'); } return result; }, [assistant, agent, isCreatedByUser, localize]); const iconData: TMessageIcon = useMemo( () => ({ endpoint: message?.endpoint ?? conversation?.endpoint, model: message?.model ?? conversation?.model, iconURL: message?.iconURL ?? conversation?.iconURL, modelLabel: name, isCreatedByUser: message?.isCreatedByUser, }), [ name, conversation?.endpoint, conversation?.iconURL, conversation?.model, message?.model, message?.iconURL, message?.endpoint, message?.isCreatedByUser, ], ); if (!message) { return null; } const baseClasses = { common: 'group mx-auto flex flex-1 gap-3 transition-all duration-300 transform-gpu', chat: maximizeChatSpace ? 'w-full max-w-full md:px-5 lg:px-1 xl:px-5' : 'md:max-w-[47rem] xl:max-w-[55rem]', }; return ( <>