diff --git a/web/src/components/next-message-item/index.tsx b/web/src/components/next-message-item/index.tsx index c87539c6b..dd7fc104f 100644 --- a/web/src/components/next-message-item/index.tsx +++ b/web/src/components/next-message-item/index.tsx @@ -12,28 +12,20 @@ import { useState, } from 'react'; -import { - useFetchDocumentInfosByIds, - useFetchDocumentThumbnailsByIds, -} from '@/hooks/document-hooks'; import { IRegenerateMessage, IRemoveMessageById } from '@/hooks/logic-hooks'; import { INodeEvent } from '@/hooks/use-send-message'; import { cn } from '@/lib/utils'; import { WorkFlowTimeline } from '@/pages/agent/log-sheet/workFlowTimeline'; import { IMessage } from '@/pages/chat/interface'; -import { getExtension, isImage } from '@/utils/document-util'; -import { Avatar, Button, Flex, List, Space, Typography } from 'antd'; import { isEmpty } from 'lodash'; -import FileIcon from '../file-icon'; import IndentedTreeModal from '../indented-tree/modal'; -import NewDocumentLink from '../new-document-link'; import MarkdownContent from '../next-markdown-content'; +import { RAGFlowAvatar } from '../ragflow-avatar'; import { useTheme } from '../theme-provider'; import { AssistantGroupButton, UserGroupButton } from './group-button'; import styles from './index.less'; import { ReferenceDocumentList } from './reference-document-list'; - -const { Text } = Typography; +import { UploadedMessageFiles } from './uploaded-message-files'; interface IProps extends Partial, @@ -79,9 +71,6 @@ function MessageItem({ 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 { visible, hideModal, showModal } = useSetModalState(); const [clickedDocumentId, setClickedDocumentId] = useState(''); @@ -91,29 +80,10 @@ function MessageItem({ return Object.values(docs); }, [reference?.doc_aggs]); - const handleUserDocumentClick = useCallback( - (id: string) => () => { - setClickedDocumentId(id); - showModal(); - }, - [showModal], - ); - 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]); - useEffect(() => { if (typeof setCurrentMessageId === 'function') { setCurrentMessageId(item.id); @@ -139,15 +109,15 @@ function MessageItem({ > {visibleAvatar && (item.role === MessageType.User ? ( - + ) : avatarDialog ? ( - + ) : ( ))} - - +
+
{isAssistant ? ( {isAssistant ? '' : nickname} */} - +
)} - {isUser && documentList.length > 0 && ( - { - // TODO: - // const fileThumbnail = - // documentThumbnails[item.id] || documentThumbnails[item.id]; - const fileExtension = getExtension(item.name); - return ( - - - - - {isImage(fileExtension) ? ( - - {item.name} - - ) : ( - - )} - - - ); - }} - /> + {isUser && ( + )} - +
{visible && ( diff --git a/web/src/components/next-message-item/uploaded-message-files.tsx b/web/src/components/next-message-item/uploaded-message-files.tsx new file mode 100644 index 000000000..924d05a8c --- /dev/null +++ b/web/src/components/next-message-item/uploaded-message-files.tsx @@ -0,0 +1,36 @@ +import { getExtension } from '@/utils/document-util'; +import { formatBytes } from '@/utils/file-util'; +import { memo } from 'react'; +import SvgIcon from '../svg-icon'; + +interface IProps { + files?: File[]; +} +export function InnerUploadedMessageFiles({ files = [] }: IProps) { + return ( +
+ {files?.map((file, idx) => ( +
+ {file.type.startsWith('image/') ? ( + {file.name} + ) : ( + + )} +
+
{file.name}
+

{formatBytes(file.size)}

+
+
+ ))} +
+ ); +} + +export const UploadedMessageFiles = memo(InnerUploadedMessageFiles); diff --git a/web/src/interfaces/database/chat.ts b/web/src/interfaces/database/chat.ts index 3fea6fc35..021ecaf2a 100644 --- a/web/src/interfaces/database/chat.ts +++ b/web/src/interfaces/database/chat.ts @@ -74,6 +74,7 @@ export interface Message { id?: string; audio_binary?: string; data?: any; + files?: File[]; } export interface IReferenceChunk { diff --git a/web/src/pages/agent/chat/box.tsx b/web/src/pages/agent/chat/box.tsx index 731774a62..8a25c12a1 100644 --- a/web/src/pages/agent/chat/box.tsx +++ b/web/src/pages/agent/chat/box.tsx @@ -76,7 +76,7 @@ const AgentChatBox = () => { useCallback( async (files, options) => { const ret = await uploadCanvasFile({ files, options }); - appendUploadResponseList(ret.data); + appendUploadResponseList(ret.data, files); }, [appendUploadResponseList, uploadCanvasFile], ); diff --git a/web/src/pages/agent/chat/use-send-agent-message.ts b/web/src/pages/agent/chat/use-send-agent-message.ts index 4edaee92b..cf1ef9ea7 100644 --- a/web/src/pages/agent/chat/use-send-agent-message.ts +++ b/web/src/pages/agent/chat/use-send-agent-message.ts @@ -152,17 +152,21 @@ export function useSetUploadResponseData() { const [uploadResponseList, setUploadResponseList] = useState< UploadResponseDataType[] >([]); + const [fileList, setFileList] = useState([]); - const append = useCallback((data: UploadResponseDataType) => { + const append = useCallback((data: UploadResponseDataType, files: File[]) => { setUploadResponseList((prev) => [...prev, data]); + setFileList((pre) => [...pre, ...files]); }, []); const clear = useCallback(() => { setUploadResponseList([]); + setFileList([]); }, []); return { uploadResponseList, + fileList, setUploadResponseList, appendUploadResponseList: append, clearUploadResponseList: clear, @@ -198,6 +202,7 @@ export const useSendAgentMessage = ( appendUploadResponseList, clearUploadResponseList, uploadResponseList, + fileList, } = useSetUploadResponseData(); const sendMessage = useCallback( @@ -259,18 +264,19 @@ export const useSendAgentMessage = ( const handlePressEnter = useCallback(() => { if (trim(value) === '') return; const id = uuid(); + const msgBody = { + id, + content: value.trim(), + role: MessageType.User, + }; if (done) { setValue(''); sendMessage({ - message: { id, content: value.trim(), role: MessageType.User }, + message: msgBody, }); } - addNewestOneQuestion({ - content: value, - id, - role: MessageType.User, - }); - }, [value, done, addNewestOneQuestion, setValue, sendMessage]); + addNewestOneQuestion({ ...msgBody, files: fileList }); + }, [value, done, addNewestOneQuestion, fileList, setValue, sendMessage]); useEffect(() => { const { content, id } = findMessageFromList(answerList); diff --git a/web/src/pages/next-chats/share/index.tsx b/web/src/pages/next-chats/share/index.tsx index d76be2e5a..0a02464bd 100644 --- a/web/src/pages/next-chats/share/index.tsx +++ b/web/src/pages/next-chats/share/index.tsx @@ -36,8 +36,6 @@ const ChatContainer = () => { addEventList, setCurrentMessageId, currentEventListWithoutMessageById, - clearEventList, - currentMessageId, } = useCacheChatLog(); const { handlePressEnter, @@ -76,7 +74,7 @@ const ChatContainer = () => { useCallback( async (files, options) => { const ret = await uploadCanvasFile({ files, options }); - appendUploadResponseList(ret.data); + appendUploadResponseList(ret.data, files); }, [appendUploadResponseList, uploadCanvasFile], );