import { useMemo, memo } from 'react'; import { getEndpointField } from 'librechat-data-provider'; import type { Assistant, Agent } from 'librechat-data-provider'; import type { TMessageIcon } from '~/common'; import ConvoIconURL from '~/components/Endpoints/ConvoIconURL'; import { useGetEndpointsQuery } from '~/data-provider'; import { getIconEndpoint } from '~/utils'; import Icon from '~/components/Endpoints/Icon'; type MessageIconProps = { iconData?: TMessageIcon; assistant?: Assistant; agent?: Agent; }; /** * Compares only the fields MessageIcon actually renders. * `agent.id` / `assistant.id` are intentionally omitted because * this component renders display properties only, not identity-derived content. */ export function arePropsEqual(prev: MessageIconProps, next: MessageIconProps): boolean { const checks: [unknown, unknown][] = [ [prev.iconData?.endpoint, next.iconData?.endpoint], [prev.iconData?.model, next.iconData?.model], [prev.iconData?.iconURL, next.iconData?.iconURL], [prev.iconData?.modelLabel, next.iconData?.modelLabel], [prev.iconData?.isCreatedByUser, next.iconData?.isCreatedByUser], [prev.agent?.name, next.agent?.name], [prev.agent?.avatar?.filepath, next.agent?.avatar?.filepath], [prev.assistant?.name, next.assistant?.name], [prev.assistant?.metadata?.avatar, next.assistant?.metadata?.avatar], ]; for (const [prevVal, nextVal] of checks) { if (prevVal !== nextVal) { return false; } } return true; } const MessageIcon = memo(({ iconData, assistant, agent }: MessageIconProps) => { const { data: endpointsConfig } = useGetEndpointsQuery(); const agentName = agent?.name ?? ''; const agentAvatar = agent?.avatar?.filepath ?? ''; const assistantName = assistant?.name ?? ''; const assistantAvatar = assistant?.metadata?.avatar ?? ''; let avatarURL = ''; if (assistant) { avatarURL = assistantAvatar; } else if (agent) { avatarURL = agentAvatar; } const iconURL = iconData?.iconURL; const endpoint = useMemo( () => getIconEndpoint({ endpointsConfig, iconURL, endpoint: iconData?.endpoint }), [endpointsConfig, iconURL, iconData?.endpoint], ); const endpointIconURL = useMemo( () => getEndpointField(endpointsConfig, endpoint, 'iconURL'), [endpointsConfig, endpoint], ); if (iconData?.isCreatedByUser !== true && iconURL != null && iconURL.includes('http')) { return ( ); } return ( ); }, arePropsEqual); MessageIcon.displayName = 'MessageIcon'; export default MessageIcon;