import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; import { MessageType } from '@/constants/chat'; import { useSetModalState, useTranslate } from '@/hooks/common-hooks'; import { useSelectFileThumbnails } from '@/hooks/knowledge-hooks'; import { IReference } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; import classNames from 'classnames'; import { memo, useCallback, useEffect, useMemo, useState } from 'react'; import { useFetchDocumentInfosByIds, useFetchDocumentThumbnailsByIds, } from '@/hooks/document-hooks'; import { IMessage } from '@/pages/chat/interface'; import MarkdownContent from '@/pages/chat/markdown-content'; import { getExtension, isImage } from '@/utils/document-util'; import { Avatar, Button, Flex, List, Space, Typography } from 'antd'; import FileIcon from '../file-icon'; import IndentedTreeModal from '../indented-tree/modal'; import NewDocumentLink from '../new-document-link'; import { AssistantGroupButton, UserGroupButton } from './group-button'; import styles from './index.less'; const { Text } = Typography; interface IProps { item: IMessage; reference: IReference; loading?: boolean; nickname?: string; avatar?: string; clickDocumentButton?: (documentId: string, chunk: IChunk) => void; index: number; } const MessageItem = ({ item, reference, loading = false, avatar = '', clickDocumentButton, index, }: IProps) => { const isAssistant = item.role === MessageType.Assistant; const isUser = item.role === MessageType.User; const { t } = useTranslate('chat'); const fileThumbnails = useSelectFileThumbnails(); const { data: documentList, setDocumentIds } = useFetchDocumentInfosByIds(); const { data: documentThumbnails, setDocumentIds: setIds } = useFetchDocumentThumbnailsByIds(); const { visible, hideModal, showModal } = useSetModalState(); const [clickedDocumentId, setClickedDocumentId] = useState(''); 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]); const handleUserDocumentClick = useCallback( (id: string) => () => { setClickedDocumentId(id); showModal(); }, [showModal], ); useEffect(() => { const ids = item?.doc_ids ?? []; if (ids.length) { setDocumentIds(ids); const documentIds = ids.filter((x) => !(x in fileThumbnails)); if (documentIds.length) { setIds(documentIds); } } }, [item.doc_ids, setDocumentIds, setIds, fileThumbnails]); return (
{item.role === MessageType.User ? ( ) : ( )} {isAssistant ? ( index !== 0 && ( ) ) : ( )} {/* {isAssistant ? '' : nickname} */}
{isAssistant && referenceDocumentList.length > 0 && ( { return ( {item.doc_name} ); }} /> )} {isUser && documentList.length > 0 && ( { // TODO: const fileThumbnail = documentThumbnails[item.id] || fileThumbnails[item.id]; const fileExtension = getExtension(item.name); return ( {isImage(fileExtension) ? ( {item.name} ) : ( )} ); }} /> )}
{visible && ( )}
); }; export default memo(MessageItem);