import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; import { MessageType } from '@/constants/chat'; import { useOneNamespaceEffectsLoading } from '@/hooks/storeHooks'; import { useSelectUserInfo } from '@/hooks/userSettingHook'; import { IReference, Message } from '@/interfaces/database/chat'; import { Avatar, Button, Flex, Input, Popover } from 'antd'; import classNames from 'classnames'; import { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; import reactStringReplace from 'react-string-replace'; import { useFetchConversation, useSendMessage } from '../hooks'; import { IClientConversation } from '../interface'; import { InfoCircleOutlined } from '@ant-design/icons'; import Markdown from 'react-markdown'; import { visitParents } from 'unist-util-visit-parents'; import styles from './index.less'; const rehypeWrapReference = () => { return function wrapTextTransform(tree: any) { visitParents(tree, 'text', (node, ancestors) => { if (ancestors.at(-1).tagName !== 'custom-typography') { node.type = 'element'; node.tagName = 'custom-typography'; node.properties = {}; node.children = [{ type: 'text', value: node.value }]; } }); }; }; const MessageItem = ({ item }: { item: Message; references: IReference[] }) => { const userInfo = useSelectUserInfo(); const popoverContent = useMemo( () => (

Content

Content

), [], ); const renderReference = useCallback( (text: string) => { return reactStringReplace(text, /#{2}\d{1,}\${2}/g, (match, i) => { return ( ); }); }, [popoverContent], ); return (
{item.role === MessageType.User ? ( userInfo.avatar ?? ( ) ) : ( )} {item.role === MessageType.Assistant ? 'Resume Assistant' : 'You'}
renderReference(children), } as any } > {item.content}
); }; const ChatContainer = () => { const [value, setValue] = useState(''); const conversation: IClientConversation = useFetchConversation(); const { sendMessage } = useSendMessage(); const loading = useOneNamespaceEffectsLoading('chatModel', [ 'completeConversation', 'getConversation', ]); const handlePressEnter = () => { setValue(''); sendMessage(value); }; const handleInputChange: ChangeEventHandler = (e) => { setValue(e.target.value); }; return (
{conversation?.message?.map((message) => ( ))}
Send } onPressEnter={handlePressEnter} onChange={handleInputChange} />
); }; export default ChatContainer;