import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; import { MessageType } from '@/constants/chat'; import { useTranslate } from '@/hooks/common-hooks'; import { useSelectFileThumbnails } from '@/hooks/knowledge-hooks'; import { IReference, Message } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; import classNames from 'classnames'; import { useMemo } from 'react'; import MarkdownContent from '@/pages/chat/markdown-content'; import { getExtension } from '@/utils/document-util'; import { Avatar, Flex, List } from 'antd'; import NewDocumentLink from '../new-document-link'; import SvgIcon from '../svg-icon'; import styles from './index.less'; interface IProps { item: Message; reference: IReference; loading?: boolean; nickname?: string; avatar?: string; clickDocumentButton?: (documentId: string, chunk: IChunk) => void; } const MessageItem = ({ item, reference, loading = false, avatar = '', nickname = '', clickDocumentButton, }: IProps) => { const isAssistant = item.role === MessageType.Assistant; const { t } = useTranslate('chat'); const fileThumbnails = useSelectFileThumbnails(); const referenceDocumentList = useMemo(() => { return reference?.doc_aggs ?? []; }, [reference?.doc_aggs]); const content = useMemo(() => { let text = item.content; if (text === '') { text = t('searching'); } return loading ? text?.concat('~~2$$') : text; }, [item.content, loading, t]); return (
{item.role === MessageType.User ? ( ) : ( )} {isAssistant ? '' : nickname}
{isAssistant && referenceDocumentList.length > 0 && ( { const fileThumbnail = fileThumbnails[item.doc_id]; const fileExtension = getExtension(item.doc_name); return ( {fileThumbnail ? ( ) : ( )} {item.doc_name} ); }} /> )}
); }; export default MessageItem;