import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; import NewDocumentLink from '@/components/new-document-link'; import DocumentPreviewer from '@/components/pdf-previewer'; import { MessageType } from '@/constants/chat'; import { useSelectFileThumbnails } from '@/hooks/knowledgeHook'; import { useSelectUserInfo } from '@/hooks/userSettingHook'; import { IReference, Message } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; import { Avatar, Button, Drawer, Flex, Input, List, Skeleton, Spin, } from 'antd'; import classNames from 'classnames'; import { useMemo } from 'react'; import { useClickDrawer, useFetchConversationOnMount, useGetFileIcon, useGetSendButtonDisabled, useSelectConversationLoading, useSendMessage, } from '../hooks'; import MarkdownContent from '../markdown-content'; import SvgIcon from '@/components/svg-icon'; import { useTranslate } from '@/hooks/commonHooks'; import { getExtension, isPdf } from '@/utils/documentUtils'; import styles from './index.less'; const MessageItem = ({ item, reference, clickDocumentButton, }: { item: Message; reference: IReference; clickDocumentButton: (documentId: string, chunk: IChunk) => void; }) => { const userInfo = useSelectUserInfo(); const fileThumbnails = useSelectFileThumbnails(); const isAssistant = item.role === MessageType.Assistant; const referenceDocumentList = useMemo(() => { return reference?.doc_aggs ?? []; }, [reference?.doc_aggs]); return (
{item.role === MessageType.User ? ( ) : ( )} {isAssistant ? '' : userInfo.nickname}
{item.content !== '' ? ( ) : ( )}
{isAssistant && referenceDocumentList.length > 0 && ( { const fileThumbnail = fileThumbnails[item.doc_id]; const fileExtension = getExtension(item.doc_name); return ( {fileThumbnail ? ( ) : ( )} {item.doc_name} ); }} /> )}
); }; const ChatContainer = () => { const { ref, currentConversation: conversation, addNewestConversation, removeLatestMessage, } = useFetchConversationOnMount(); const { handleInputChange, handlePressEnter, value, loading: sendLoading, } = useSendMessage(conversation, addNewestConversation, removeLatestMessage); const { visible, hideModal, documentId, selectedChunk, clickDocumentButton } = useClickDrawer(); const disabled = useGetSendButtonDisabled(); useGetFileIcon(); const loading = useSelectConversationLoading(); const { t } = useTranslate('chat'); return ( <>
{conversation?.message?.map((message) => { const assistantMessages = conversation?.message ?.filter((x) => x.role === MessageType.Assistant) .slice(1); const referenceIndex = assistantMessages.findIndex( (x) => x.id === message.id, ); const reference = conversation.reference[referenceIndex]; return ( ); })}
{t('send')} } onPressEnter={handlePressEnter} onChange={handleInputChange} /> ); }; export default ChatContainer;