import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; import { MessageType } from '@/constants/chat'; import { IReference, IReferenceChunk } from '@/interfaces/database/chat'; import classNames from 'classnames'; import { memo, useCallback, useEffect, useMemo } from 'react'; import { useFetchDocumentInfosByIds, useFetchDocumentThumbnailsByIds, } from '@/hooks/document-hooks'; import { IRegenerateMessage, IRemoveMessageById } from '@/hooks/logic-hooks'; import { cn } from '@/lib/utils'; import { IMessage } from '@/pages/chat/interface'; import MarkdownContent from '@/pages/chat/markdown-content'; import { Avatar, Flex, Space } from 'antd'; import { ReferenceDocumentList } from '../next-message-item/reference-document-list'; import { InnerUploadedMessageFiles } from '../next-message-item/uploaded-message-files'; import { useTheme } from '../theme-provider'; import { AssistantGroupButton, UserGroupButton } from './group-button'; import styles from './index.less'; interface IProps extends Partial, IRegenerateMessage { item: IMessage; reference: IReference; loading?: boolean; sendLoading?: boolean; visibleAvatar?: boolean; nickname?: string; avatar?: string; avatarDialog?: string | null; clickDocumentButton?: (documentId: string, chunk: IReferenceChunk) => void; index: number; showLikeButton?: boolean; showLoudspeaker?: boolean; } const MessageItem = ({ item, reference, loading = false, avatar, avatarDialog, sendLoading = false, clickDocumentButton, index, removeMessageById, regenerateMessage, showLikeButton = true, showLoudspeaker = true, visibleAvatar = true, }: IProps) => { const { theme } = useTheme(); const isAssistant = item.role === MessageType.Assistant; const isUser = item.role === MessageType.User; const { data: documentList, setDocumentIds } = useFetchDocumentInfosByIds(); const { data: documentThumbnails, setDocumentIds: setIds } = useFetchDocumentThumbnailsByIds(); const referenceDocumentList = useMemo(() => { return reference?.doc_aggs ?? []; }, [reference?.doc_aggs]); const handleRegenerateMessage = useCallback(() => { regenerateMessage?.(item); }, [regenerateMessage, item]); useEffect(() => { const ids = item?.doc_ids ?? []; if (ids.length) { setDocumentIds(ids); const documentIds = ids.filter((x) => !(x in documentThumbnails)); if (documentIds.length) { setIds(documentIds); } } }, [item.doc_ids, setDocumentIds, setIds, documentThumbnails]); return (
{visibleAvatar && (item.role === MessageType.User ? ( ) : avatarDialog ? ( ) : ( ))} {isAssistant ? ( index !== 0 && ( ) ) : ( )} {/* {isAssistant ? '' : nickname} */}
{isAssistant && referenceDocumentList.length > 0 && ( )} {isUser && documentList.length > 0 && ( )}
); }; export default memo(MessageItem);