import { BodyText } from '@servicetitan/design-system'; import { ChatMessageModelFile, ChatMessageModelText, ChatMessageModelWelcome, IChatMessageProps, useCustomizationChat, } from '@servicetitan/titan-chat-ui-common'; import { observer } from 'mobx-react'; import { FC, PropsWithChildren, ReactNode } from 'react'; import { MessageContentFile } from '../message-content/message-content-file'; import { MessageContentText } from '../message-content/message-content-text'; import { ChatMessageTemplateAgent } from './chat-message-template-agent'; import { ChatMessageTemplateUser } from './chat-message-template-user'; /** * ChatMessage component provides a default way to render chat messages in the chat UI and contains only most generic * components and templates/customizations rendering */ export const ChatMessage: FC = observer( ({ message, omitAvatar, omitTimestamp }) => { const { messageTemplates, messages } = useCustomizationChat(); const messageCustomization = messages?.find(c => c.predicate(message)); const isAgent = message.participant.isAgent; const isSystem = Boolean(messageCustomization?.isSystem); let messageContentNode: ReactNode | undefined; if (messageCustomization?.component) { messageContentNode = ; } else { // Default message content rendering switch (message.type) { case 'message': case 'welcome': messageContentNode = ( ); break; case 'file': messageContentNode = ( ); break; default: { messageContentNode = Unknown message type: {message.type}; } } } if (!messageContentNode || messageCustomization?.isIgnored) { return null; } if (isSystem) { return messageContentNode; } let ComponentTemplate: FC>; if (isAgent) { const template = messageTemplates?.agent; ComponentTemplate = template?.predicate(message) ? template.component : ChatMessageTemplateAgent; } else { const template = messageTemplates?.user; ComponentTemplate = template?.predicate(message) ? template.component : ChatMessageTemplateUser; } return ( {messageContentNode} ); } );