import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; import { MessageType } from '@/constants/chat'; import { useTranslate } from '@/hooks/commonHooks'; import { IReference, Message } from '@/interfaces/database/chat'; import { Avatar, Button, Flex, Input, List, Spin } from 'antd'; import classNames from 'classnames'; import NewDocumentLink from '@/components/new-document-link'; import SvgIcon from '@/components/svg-icon'; import { useGetDocumentUrl } from '@/hooks/documentHooks'; import { useSelectFileThumbnails } from '@/hooks/knowledgeHook'; import { getExtension, isPdf } from '@/utils/documentUtils'; import { forwardRef, useMemo } from 'react'; import MarkdownContent from '../markdown-content'; import { useCreateSharedConversationOnMount, useSelectCurrentSharedConversation, useSendSharedMessage, } from '../shared-hooks'; import { buildMessageItemReference } from '../utils'; import styles from './index.less'; import {useSendButtonDisabled} from "@/pages/chat/hooks"; const MessageItem = ({ item, reference, loading = false, }: { item: Message; reference: IReference; loading?: boolean; }) => { const isAssistant = item.role === MessageType.Assistant; const { t } = useTranslate('chat'); const fileThumbnails = useSelectFileThumbnails(); const getDocumentUrl = useGetDocumentUrl(); 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 ? '' : 'You'}
{}} content={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 { t } = useTranslate('chat'); const { conversationId } = useCreateSharedConversationOnMount(); const { currentConversation: conversation, addNewestConversation, removeLatestMessage, ref, loading, setCurrentConversation, addNewestAnswer, } = useSelectCurrentSharedConversation(conversationId); const { handlePressEnter, handleInputChange, value, loading: sendLoading, } = useSendSharedMessage( conversation, addNewestConversation, removeLatestMessage, setCurrentConversation, addNewestAnswer, ); const sendDisabled = useSendButtonDisabled(value); return ( <>
{conversation?.message?.map((message, i) => { return ( ); })}
{t('send')} } onPressEnter={handlePressEnter} onChange={handleInputChange} /> ); }; export default forwardRef(ChatContainer);