balibabu
fix: Fixed the issue of error reporting when uploading files in the chat box #2897 (#2898)
a4c4dfd
| import { IDocumentInfo } from '@/interfaces/database/document'; | |
| import { IChunk } from '@/interfaces/database/knowledge'; | |
| import { IChangeParserConfigRequestBody } from '@/interfaces/request/document'; | |
| import i18n from '@/locales/config'; | |
| import chatService from '@/services/chat-service'; | |
| import kbService from '@/services/knowledge-service'; | |
| import { api_host } from '@/utils/api'; | |
| import { buildChunkHighlights } from '@/utils/document-util'; | |
| import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; | |
| import { UploadFile, message } from 'antd'; | |
| import { get } from 'lodash'; | |
| import { useCallback, useMemo, useState } from 'react'; | |
| import { IHighlight } from 'react-pdf-highlighter'; | |
| import { | |
| useGetPaginationWithRouter, | |
| useHandleSearchChange, | |
| } from './logic-hooks'; | |
| import { | |
| useGetKnowledgeSearchParams, | |
| useSetPaginationParams, | |
| } from './route-hook'; | |
| export const useGetDocumentUrl = (documentId?: string) => { | |
| const getDocumentUrl = useCallback( | |
| (id?: string) => { | |
| return `${api_host}/document/get/${documentId || id}`; | |
| }, | |
| [documentId], | |
| ); | |
| return getDocumentUrl; | |
| }; | |
| export const useGetChunkHighlights = (selectedChunk: IChunk) => { | |
| const [size, setSize] = useState({ width: 849, height: 1200 }); | |
| const highlights: IHighlight[] = useMemo(() => { | |
| return buildChunkHighlights(selectedChunk, size); | |
| }, [selectedChunk, size]); | |
| const setWidthAndHeight = (width: number, height: number) => { | |
| setSize((pre) => { | |
| if (pre.height !== height || pre.width !== width) { | |
| return { height, width }; | |
| } | |
| return pre; | |
| }); | |
| }; | |
| return { highlights, setWidthAndHeight }; | |
| }; | |
| export const useFetchNextDocumentList = () => { | |
| const { knowledgeId } = useGetKnowledgeSearchParams(); | |
| const { searchString, handleInputChange } = useHandleSearchChange(); | |
| const { pagination, setPagination } = useGetPaginationWithRouter(); | |
| const { data, isFetching: loading } = useQuery<{ | |
| docs: IDocumentInfo[]; | |
| total: number; | |
| }>({ | |
| queryKey: ['fetchDocumentList', searchString, pagination], | |
| initialData: { docs: [], total: 0 }, | |
| refetchInterval: 15000, | |
| queryFn: async () => { | |
| const ret = await kbService.get_document_list({ | |
| kb_id: knowledgeId, | |
| keywords: searchString, | |
| page_size: pagination.pageSize, | |
| page: pagination.current, | |
| }); | |
| if (ret.data.retcode === 0) { | |
| return ret.data.data; | |
| } | |
| return { | |
| docs: [], | |
| total: 0, | |
| }; | |
| }, | |
| }); | |
| const onInputChange: React.ChangeEventHandler<HTMLInputElement> = useCallback( | |
| (e) => { | |
| setPagination({ page: 1 }); | |
| handleInputChange(e); | |
| }, | |
| [handleInputChange, setPagination], | |
| ); | |
| return { | |
| loading, | |
| searchString, | |
| documents: data.docs, | |
| pagination: { ...pagination, total: data?.total }, | |
| handleInputChange: onInputChange, | |
| setPagination, | |
| }; | |
| }; | |
| export const useSetNextDocumentStatus = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['updateDocumentStatus'], | |
| mutationFn: async ({ | |
| status, | |
| documentId, | |
| }: { | |
| status: boolean; | |
| documentId: string; | |
| }) => { | |
| const { data } = await kbService.document_change_status({ | |
| doc_id: documentId, | |
| status: Number(status), | |
| }); | |
| if (data.retcode === 0) { | |
| message.success(i18n.t('message.modified')); | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| } | |
| return data; | |
| }, | |
| }); | |
| return { setDocumentStatus: mutateAsync, data, loading }; | |
| }; | |
| export const useSaveNextDocumentName = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['saveDocumentName'], | |
| mutationFn: async ({ | |
| name, | |
| documentId, | |
| }: { | |
| name: string; | |
| documentId: string; | |
| }) => { | |
| const { data } = await kbService.document_rename({ | |
| doc_id: documentId, | |
| name: name, | |
| }); | |
| if (data.retcode === 0) { | |
| message.success(i18n.t('message.renamed')); | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| } | |
| return data.retcode; | |
| }, | |
| }); | |
| return { loading, saveName: mutateAsync, data }; | |
| }; | |
| export const useCreateNextDocument = () => { | |
| const { knowledgeId } = useGetKnowledgeSearchParams(); | |
| const { setPaginationParams, page } = useSetPaginationParams(); | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['createDocument'], | |
| mutationFn: async (name: string) => { | |
| const { data } = await kbService.document_create({ | |
| name, | |
| kb_id: knowledgeId, | |
| }); | |
| if (data.retcode === 0) { | |
| if (page === 1) { | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| } else { | |
| setPaginationParams(); // fetch document list | |
| } | |
| message.success(i18n.t('message.created')); | |
| } | |
| return data.retcode; | |
| }, | |
| }); | |
| return { createDocument: mutateAsync, loading, data }; | |
| }; | |
| export const useSetNextDocumentParser = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['setDocumentParser'], | |
| mutationFn: async ({ | |
| parserId, | |
| documentId, | |
| parserConfig, | |
| }: { | |
| parserId: string; | |
| documentId: string; | |
| parserConfig: IChangeParserConfigRequestBody; | |
| }) => { | |
| const { data } = await kbService.document_change_parser({ | |
| parser_id: parserId, | |
| doc_id: documentId, | |
| parser_config: parserConfig, | |
| }); | |
| if (data.retcode === 0) { | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| message.success(i18n.t('message.modified')); | |
| } | |
| return data.retcode; | |
| }, | |
| }); | |
| return { setDocumentParser: mutateAsync, data, loading }; | |
| }; | |
| export const useUploadNextDocument = () => { | |
| const queryClient = useQueryClient(); | |
| const { knowledgeId } = useGetKnowledgeSearchParams(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['uploadDocument'], | |
| mutationFn: async (fileList: UploadFile[]) => { | |
| const formData = new FormData(); | |
| formData.append('kb_id', knowledgeId); | |
| fileList.forEach((file: any) => { | |
| formData.append('file', file); | |
| }); | |
| try { | |
| const ret = await kbService.document_upload(formData); | |
| const retcode = get(ret, 'data.retcode'); | |
| if (retcode === 0) { | |
| message.success(i18n.t('message.uploaded')); | |
| } | |
| if (retcode === 0 || retcode === 500) { | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| } | |
| return ret?.data; | |
| } catch (error) { | |
| console.warn(error); | |
| return {}; | |
| } | |
| }, | |
| }); | |
| return { uploadDocument: mutateAsync, loading, data }; | |
| }; | |
| export const useNextWebCrawl = () => { | |
| const { knowledgeId } = useGetKnowledgeSearchParams(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['webCrawl'], | |
| mutationFn: async ({ name, url }: { name: string; url: string }) => { | |
| const formData = new FormData(); | |
| formData.append('name', name); | |
| formData.append('url', url); | |
| formData.append('kb_id', knowledgeId); | |
| const ret = await kbService.web_crawl(formData); | |
| const retcode = get(ret, 'data.retcode'); | |
| if (retcode === 0) { | |
| message.success(i18n.t('message.uploaded')); | |
| } | |
| return retcode; | |
| }, | |
| }); | |
| return { | |
| data, | |
| loading, | |
| webCrawl: mutateAsync, | |
| }; | |
| }; | |
| export const useRunNextDocument = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['runDocumentByIds'], | |
| mutationFn: async ({ | |
| documentIds, | |
| run, | |
| }: { | |
| documentIds: string[]; | |
| run: number; | |
| }) => { | |
| const ret = await kbService.document_run({ | |
| doc_ids: documentIds, | |
| run, | |
| }); | |
| const retcode = get(ret, 'data.retcode'); | |
| if (retcode === 0) { | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| message.success(i18n.t('message.operated')); | |
| } | |
| return retcode; | |
| }, | |
| }); | |
| return { runDocumentByIds: mutateAsync, loading, data }; | |
| }; | |
| export const useFetchDocumentInfosByIds = () => { | |
| const [ids, setDocumentIds] = useState<string[]>([]); | |
| const { data } = useQuery<IDocumentInfo[]>({ | |
| queryKey: ['fetchDocumentInfos', ids], | |
| enabled: ids.length > 0, | |
| initialData: [], | |
| queryFn: async () => { | |
| const { data } = await kbService.document_infos({ doc_ids: ids }); | |
| if (data.retcode === 0) { | |
| return data.data; | |
| } | |
| return []; | |
| }, | |
| }); | |
| return { data, setDocumentIds }; | |
| }; | |
| export const useFetchDocumentThumbnailsByIds = () => { | |
| const [ids, setDocumentIds] = useState<string[]>([]); | |
| const { data } = useQuery<Record<string, string>>({ | |
| queryKey: ['fetchDocumentThumbnails', ids], | |
| enabled: ids.length > 0, | |
| initialData: {}, | |
| queryFn: async () => { | |
| const { data } = await kbService.document_thumbnails({ doc_ids: ids }); | |
| if (data.retcode === 0) { | |
| return data.data; | |
| } | |
| return {}; | |
| }, | |
| }); | |
| return { data, setDocumentIds }; | |
| }; | |
| export const useRemoveNextDocument = () => { | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['removeDocument'], | |
| mutationFn: async (documentIds: string | string[]) => { | |
| const { data } = await kbService.document_rm({ doc_id: documentIds }); | |
| if (data.retcode === 0) { | |
| message.success(i18n.t('message.deleted')); | |
| queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] }); | |
| } | |
| return data.retcode; | |
| }, | |
| }); | |
| return { data, loading, removeDocument: mutateAsync }; | |
| }; | |
| export const useDeleteDocument = () => { | |
| // const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['deleteDocument'], | |
| mutationFn: async (documentIds: string[]) => { | |
| const data = await kbService.document_delete({ doc_ids: documentIds }); | |
| // if (data.retcode === 0) { | |
| // queryClient.invalidateQueries({ queryKey: ['fetchFlowList'] }); | |
| // } | |
| return data; | |
| }, | |
| }); | |
| return { data, loading, deleteDocument: mutateAsync }; | |
| }; | |
| export const useUploadAndParseDocument = (uploadMethod: string) => { | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['uploadAndParseDocument'], | |
| mutationFn: async ({ | |
| conversationId, | |
| fileList, | |
| }: { | |
| conversationId: string; | |
| fileList: UploadFile[]; | |
| }) => { | |
| try { | |
| const formData = new FormData(); | |
| formData.append('conversation_id', conversationId); | |
| fileList.forEach((file: UploadFile) => { | |
| formData.append('file', file as any); | |
| }); | |
| if (uploadMethod === 'upload_and_parse') { | |
| const data = await kbService.upload_and_parse(formData); | |
| return data?.data; | |
| } | |
| const data = await chatService.uploadAndParseExternal(formData); | |
| return data?.data; | |
| } catch (error) { | |
| console.log('🚀 ~ useUploadAndParseDocument ~ error:', error); | |
| } | |
| }, | |
| }); | |
| return { data, loading, uploadAndParseDocument: mutateAsync }; | |
| }; | |