diff --git a/web/src/components/message-item/index.less b/web/src/components/message-item/index.less index cb6090d2e..fd7b8ca55 100644 --- a/web/src/components/message-item/index.less +++ b/web/src/components/message-item/index.less @@ -22,6 +22,26 @@ background-color: rgba(249, 250, 251, 1); word-break: break-all; } + .messageTextBase() { + padding: 6px 10px; + border-radius: 8px; + & > p { + margin: 0; + } + } + .messageText { + .chunkText(); + .messageTextBase(); + background-color: #e6f4ff; + word-break: break-all; + } + .messageUserText { + .chunkText(); + .messageTextBase(); + background-color: rgb(248, 247, 247); + word-break: break-all; + text-align: justify; + } .messageEmpty { width: 300px; } diff --git a/web/src/components/message-item/index.tsx b/web/src/components/message-item/index.tsx index a5064b391..c8f2f4c44 100644 --- a/web/src/components/message-item/index.tsx +++ b/web/src/components/message-item/index.tsx @@ -3,7 +3,6 @@ import { MessageType } from '@/constants/chat'; import { useTranslate } from '@/hooks/commonHooks'; import { useGetDocumentUrl } from '@/hooks/documentHooks'; import { useSelectFileThumbnails } from '@/hooks/knowledgeHook'; -import { useSelectUserInfo } from '@/hooks/userSettingHook'; import { IReference, Message } from '@/interfaces/database/chat'; import { IChunk } from '@/interfaces/database/knowledge'; import classNames from 'classnames'; @@ -16,23 +15,27 @@ import NewDocumentLink from '../new-document-link'; import SvgIcon from '../svg-icon'; import styles from './index.less'; +interface IProps { + item: Message; + reference: IReference; + loading?: boolean; + nickname?: string; + avatar?: string; + clickDocumentButton?: (documentId: string, chunk: IChunk) => void; +} + const MessageItem = ({ item, reference, loading = false, + avatar = '', + nickname = '', clickDocumentButton, -}: { - item: Message; - reference: IReference; - loading?: boolean; - clickDocumentButton: (documentId: string, chunk: IChunk) => void; -}) => { - const userInfo = useSelectUserInfo(); +}: IProps) => { + const isAssistant = item.role === MessageType.Assistant; + const { t } = useTranslate('chat'); const fileThumbnails = useSelectFileThumbnails(); const getDocumentUrl = useGetDocumentUrl(); - const { t } = useTranslate('chat'); - - const isAssistant = item.role === MessageType.Assistant; const referenceDocumentList = useMemo(() => { return reference?.doc_aggs ?? []; @@ -68,7 +71,7 @@ const MessageItem = ({ @@ -76,8 +79,12 @@ const MessageItem = ({ )} - {isAssistant ? '' : userInfo.nickname} -
+ {isAssistant ? '' : nickname} +
{ dsl?: DSL; avatar?: string; }) => { - const { data } = await flowService.setCanvas(params); + const { data = {} } = await flowService.setCanvas(params); if (data.retcode === 0) { message.success( i18n.t(`message.${params?.id ? 'modified' : 'created'}`), diff --git a/web/src/hooks/logicHooks.ts b/web/src/hooks/logicHooks.ts index a386d1343..b3402552b 100644 --- a/web/src/hooks/logicHooks.ts +++ b/web/src/hooks/logicHooks.ts @@ -189,7 +189,10 @@ export const useSendMessageWithSse = ( const d = val?.data; if (typeof d !== 'boolean') { console.info('data:', d); - setAnswer(d); + setAnswer({ + ...d, + conversationId: body?.conversation_id, + }); } } catch (e) { console.warn(e); diff --git a/web/src/interfaces/database/chat.ts b/web/src/interfaces/database/chat.ts index e96bb7c8b..c30fa3453 100644 --- a/web/src/interfaces/database/chat.ts +++ b/web/src/interfaces/database/chat.ts @@ -77,6 +77,7 @@ export interface IReference { export interface IAnswer { answer: string; reference: IReference; + conversationId?: string; } export interface Docagg { diff --git a/web/src/pages/chat/chat-container/index.less b/web/src/pages/chat/chat-container/index.less index 34c751790..8430b1ef6 100644 --- a/web/src/pages/chat/chat-container/index.less +++ b/web/src/pages/chat/chat-container/index.less @@ -5,82 +5,3 @@ padding-right: 24px; } } - -.messageItem { - padding: 24px 0; - .messageItemSection { - display: inline-block; - } - .messageItemSectionLeft { - width: 70%; - } - .messageItemSectionRight { - width: 40%; - } - .messageItemContent { - display: inline-flex; - gap: 20px; - } - .messageItemContentReverse { - flex-direction: row-reverse; - } - .messageTextBase() { - padding: 6px 10px; - border-radius: 8px; - & > p { - margin: 0; - } - } - .messageText { - .chunkText(); - .messageTextBase(); - background-color: #e6f4ff; - word-break: break-all; - } - .messageUserText { - .chunkText(); - .messageTextBase(); - background-color: rgb(248, 247, 247); - word-break: break-all; - text-align: justify; - } - .messageEmpty { - width: 300px; - } - // .referenceIcon { - // padding: 0 6px; - // } - .thumbnailImg { - max-width: 20px; - } -} - -.messageItemLeft { - text-align: left; -} - -.messageItemRight { - text-align: right; -} - -// .referencePopoverWrapper { -// max-width: 50vw; -// } - -// .referenceChunkImage { -// width: 10vw; -// object-fit: contain; -// } - -// .referenceImagePreview { -// max-width: 45vw; -// max-height: 45vh; -// } -// .chunkContentText { -// .chunkText; -// max-height: 45vh; -// overflow-y: auto; -// } -// .documentLink { -// padding: 0; -// } diff --git a/web/src/pages/chat/chat-container/index.tsx b/web/src/pages/chat/chat-container/index.tsx index 28803ce54..78f88c16e 100644 --- a/web/src/pages/chat/chat-container/index.tsx +++ b/web/src/pages/chat/chat-container/index.tsx @@ -1,140 +1,22 @@ -import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; -import NewDocumentLink from '@/components/new-document-link'; +import MessageItem from '@/components/message-item'; 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, Spin } from 'antd'; -import classNames from 'classnames'; -import { useMemo } from 'react'; +import { useTranslate } from '@/hooks/commonHooks'; +import { Button, Drawer, Flex, Input, Spin } from 'antd'; import { useClickDrawer, useFetchConversationOnMount, useGetFileIcon, useGetSendButtonDisabled, - useSelectConversationLoading, useSendButtonDisabled, + useSelectConversationLoading, + useSendButtonDisabled, useSendMessage, } from '../hooks'; -import MarkdownContent from '../markdown-content'; - -import SvgIcon from '@/components/svg-icon'; -import { useTranslate } from '@/hooks/commonHooks'; -import { useGetDocumentUrl } from '@/hooks/documentHooks'; -import { getExtension, isPdf } from '@/utils/documentUtils'; import { buildMessageItemReference } from '../utils'; + +import { useSelectUserInfo } from '@/hooks/userSettingHook'; import styles from './index.less'; -const MessageItem = ({ - item, - reference, - loading = false, - clickDocumentButton, -}: { - item: Message; - reference: IReference; - loading?: boolean; - clickDocumentButton: (documentId: string, chunk: IChunk) => void; -}) => { - const userInfo = useSelectUserInfo(); - const fileThumbnails = useSelectFileThumbnails(); - const getDocumentUrl = useGetDocumentUrl(); - const { t } = useTranslate('chat'); - - const isAssistant = item.role === MessageType.Assistant; - - 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 ? '' : userInfo.nickname} -
- -
- {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, @@ -161,6 +43,7 @@ const ChatContainer = () => { useGetFileIcon(); const loading = useSelectConversationLoading(); const { t } = useTranslate('chat'); + const userInfo = useSelectUserInfo(); return ( <> @@ -178,6 +61,8 @@ const ChatContainer = () => { } key={message.id} item={message} + nickname={userInfo.nickname} + avatar={userInfo.avatar} reference={buildMessageItemReference(conversation, message)} clickDocumentButton={clickDocumentButton} > diff --git a/web/src/pages/chat/hooks.ts b/web/src/pages/chat/hooks.ts index 60724e79e..1ccb5f2ef 100644 --- a/web/src/pages/chat/hooks.ts +++ b/web/src/pages/chat/hooks.ts @@ -326,7 +326,7 @@ export const useSelectDerivedConversationList = () => { return pre; }); - }, [conversationList, dialogId, prologue]); + }, [conversationList, dialogId, prologue, t]); useEffect(() => { addTemporaryConversation(); @@ -402,7 +402,7 @@ export const useSelectCurrentConversation = () => { role: MessageType.Assistant, content: answer, id: uuid(), - reference: [], + reference: {}, } as IMessage, ], }; @@ -433,7 +433,6 @@ export const useSelectCurrentConversation = () => { }, []); const removeLatestMessage = useCallback(() => { - console.info('removeLatestMessage'); setCurrentConversation((pre) => { const nextMessages = pre.message?.slice(0, -2) ?? []; return { @@ -484,7 +483,6 @@ export const useScrollToBottom = (currentConversation: IClientConversation) => { const ref = useRef(null); const scrollToBottom = useCallback(() => { - console.info('useScrollToBottom'); if (currentConversation.id) { ref.current?.scrollIntoView({ behavior: 'instant' }); } @@ -588,7 +586,6 @@ export const useSendMessage = ( [ conversation?.message, conversationId, - // fetchConversation, handleClickConversation, removeLatestMessage, setValue, @@ -612,12 +609,10 @@ export const useSendMessage = ( ); useEffect(() => { - if (answer.answer) { + if (answer.answer && answer?.conversationId === conversationId) { addNewestAnswer(answer); - console.info('true?'); - console.info('send msg:', answer.answer); } - }, [answer, addNewestAnswer]); + }, [answer, addNewestAnswer, conversationId]); const handlePressEnter = useCallback(() => { if (trim(value) === '') return; @@ -639,15 +634,9 @@ export const useSendMessage = ( }; export const useGetFileIcon = () => { - // const req = require.context('@/assets/svg/file-icon'); - // const ret = req.keys().map(req); - // console.info(ret); - // useEffect(() => {}, []); - const getFileIcon = (filename: string) => { const ext: string = getFileExtension(filename); const iconPath = fileIconMap[ext as keyof typeof fileIconMap]; - // const x = require(`@/assets/svg/file-icon/${iconPath}`); return `@/assets/svg/file-icon/${iconPath}`; }; diff --git a/web/src/pages/chat/markdown-content/index.tsx b/web/src/pages/chat/markdown-content/index.tsx index e67755734..e196372e4 100644 --- a/web/src/pages/chat/markdown-content/index.tsx +++ b/web/src/pages/chat/markdown-content/index.tsx @@ -28,7 +28,7 @@ const MarkdownContent = ({ }: { content: string; reference: IReference; - clickDocumentButton: (documentId: string, chunk: IChunk) => void; + clickDocumentButton?: (documentId: string, chunk: IChunk) => void; }) => { const fileThumbnails = useSelectFileThumbnails(); @@ -37,7 +37,7 @@ const MarkdownContent = ({ if (!isPdf) { return; } - clickDocumentButton(documentId, chunk); + clickDocumentButton?.(documentId, chunk); }, [clickDocumentButton], ); diff --git a/web/src/pages/chat/share/index.less b/web/src/pages/chat/share/index.less index 05122118d..7ed0c9d99 100644 --- a/web/src/pages/chat/share/index.less +++ b/web/src/pages/chat/share/index.less @@ -11,57 +11,3 @@ padding-right: 6px; } } - -.messageItem { - padding: 24px 0; - .messageItemSection { - display: inline-block; - } - .messageItemSectionLeft { - width: 70%; - } - .messageItemSectionRight { - width: 40%; - } - .messageItemContent { - display: inline-flex; - gap: 20px; - } - .messageItemContentReverse { - flex-direction: row-reverse; - } - .messageTextBase() { - padding: 6px 10px; - border-radius: 8px; - & > p { - margin: 0; - } - } - .messageText { - .chunkText(); - .messageTextBase(); - background-color: #e6f4ff; - word-break: break-all; - } - .messageUserText { - .chunkText(); - .messageTextBase(); - background-color: rgb(248, 247, 247); - word-break: break-all; - text-align: justify; - } - .messageEmpty { - width: 300px; - } - .thumbnailImg { - max-width: 20px; - } -} - -.messageItemLeft { - text-align: left; -} - -.messageItemRight { - text-align: right; -} diff --git a/web/src/pages/chat/share/large.tsx b/web/src/pages/chat/share/large.tsx index 110402a9b..901e4bd17 100644 --- a/web/src/pages/chat/share/large.tsx +++ b/web/src/pages/chat/share/large.tsx @@ -1,129 +1,17 @@ -import { ReactComponent as AssistantIcon } from '@/assets/svg/assistant.svg'; +import MessageItem from '@/components/message-item'; 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 { useSendButtonDisabled } from '@/pages/chat/hooks'; +import { Button, Flex, Input, Spin } from 'antd'; +import { forwardRef } from 'react'; 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'); @@ -163,6 +51,7 @@ const ChatContainer = () => { { @@ -31,6 +32,7 @@ const FlowChatBox = () => { useClickDrawer(); useGetFileIcon(); const { t } = useTranslate('chat'); + const userInfo = useSelectUserInfo(); return ( <> @@ -47,6 +49,8 @@ const FlowChatBox = () => { currentMessages.length - 1 === i } key={message.id} + nickname={userInfo.nickname} + avatar={userInfo.avatar} item={message} reference={buildMessageItemReference( { message: currentMessages, reference },