balibabu
Fix: Every time you switch the page number of a chunk, the PDF document will be reloaded. #4046 (#4047)
7056954
| import { ResponseGetType, ResponseType } from '@/interfaces/database/base'; | |
| import { IChunk, IKnowledgeFile } from '@/interfaces/database/knowledge'; | |
| import kbService from '@/services/knowledge-service'; | |
| import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; | |
| import { useDebounce } from 'ahooks'; | |
| import { PaginationProps, message } from 'antd'; | |
| import { useCallback, useState } from 'react'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { | |
| useGetPaginationWithRouter, | |
| useHandleSearchChange, | |
| } from './logic-hooks'; | |
| import { | |
| useGetKnowledgeSearchParams, | |
| useSetPaginationParams, | |
| } from './route-hook'; | |
| export interface IChunkListResult { | |
| searchString?: string; | |
| handleInputChange?: React.ChangeEventHandler<HTMLInputElement>; | |
| pagination: PaginationProps; | |
| setPagination?: (pagination: { page: number; pageSize: number }) => void; | |
| available: number | undefined; | |
| handleSetAvailable: (available: number | undefined) => void; | |
| } | |
| export const useFetchNextChunkList = (): ResponseGetType<{ | |
| data: IChunk[]; | |
| total: number; | |
| documentInfo: IKnowledgeFile; | |
| }> & | |
| IChunkListResult => { | |
| const { pagination, setPagination } = useGetPaginationWithRouter(); | |
| const { documentId } = useGetKnowledgeSearchParams(); | |
| const { searchString, handleInputChange } = useHandleSearchChange(); | |
| const [available, setAvailable] = useState<number | undefined>(); | |
| const debouncedSearchString = useDebounce(searchString, { wait: 500 }); | |
| const { data, isFetching: loading } = useQuery({ | |
| queryKey: [ | |
| 'fetchChunkList', | |
| documentId, | |
| pagination.current, | |
| pagination.pageSize, | |
| debouncedSearchString, | |
| available, | |
| ], | |
| placeholderData: (previousData) => | |
| previousData ?? { data: [], total: 0, documentInfo: {} }, // https://github.com/TanStack/query/issues/8183 | |
| gcTime: 0, | |
| queryFn: async () => { | |
| const { data } = await kbService.chunk_list({ | |
| doc_id: documentId, | |
| page: pagination.current, | |
| size: pagination.pageSize, | |
| available_int: available, | |
| keywords: searchString, | |
| }); | |
| if (data.code === 0) { | |
| const res = data.data; | |
| return { | |
| data: res.chunks, | |
| total: res.total, | |
| documentInfo: res.doc, | |
| }; | |
| } | |
| return ( | |
| data?.data ?? { | |
| data: [], | |
| total: 0, | |
| documentInfo: {}, | |
| } | |
| ); | |
| }, | |
| }); | |
| const onInputChange: React.ChangeEventHandler<HTMLInputElement> = useCallback( | |
| (e) => { | |
| setPagination({ page: 1 }); | |
| handleInputChange(e); | |
| }, | |
| [handleInputChange, setPagination], | |
| ); | |
| const handleSetAvailable = useCallback( | |
| (a: number | undefined) => { | |
| setPagination({ page: 1 }); | |
| setAvailable(a); | |
| }, | |
| [setAvailable, setPagination], | |
| ); | |
| return { | |
| data, | |
| loading, | |
| pagination, | |
| setPagination, | |
| searchString, | |
| handleInputChange: onInputChange, | |
| available, | |
| handleSetAvailable, | |
| }; | |
| }; | |
| export const useSelectChunkList = () => { | |
| const queryClient = useQueryClient(); | |
| const data = queryClient.getQueriesData<{ | |
| data: IChunk[]; | |
| total: number; | |
| documentInfo: IKnowledgeFile; | |
| }>({ queryKey: ['fetchChunkList'] }); | |
| return data?.at(-1)?.[1]; | |
| }; | |
| export const useDeleteChunk = () => { | |
| const queryClient = useQueryClient(); | |
| const { setPaginationParams } = useSetPaginationParams(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['deleteChunk'], | |
| mutationFn: async (params: { chunkIds: string[]; doc_id: string }) => { | |
| const { data } = await kbService.rm_chunk(params); | |
| if (data.code === 0) { | |
| setPaginationParams(1); | |
| queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] }); | |
| } | |
| return data?.code; | |
| }, | |
| }); | |
| return { data, loading, deleteChunk: mutateAsync }; | |
| }; | |
| export const useSwitchChunk = () => { | |
| const { t } = useTranslation(); | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['switchChunk'], | |
| mutationFn: async (params: { | |
| chunk_ids?: string[]; | |
| available_int?: number; | |
| doc_id: string; | |
| }) => { | |
| const { data } = await kbService.switch_chunk(params); | |
| if (data.code === 0) { | |
| message.success(t('message.modified')); | |
| queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] }); | |
| } | |
| return data?.code; | |
| }, | |
| }); | |
| return { data, loading, switchChunk: mutateAsync }; | |
| }; | |
| export const useCreateChunk = () => { | |
| const { t } = useTranslation(); | |
| const queryClient = useQueryClient(); | |
| const { | |
| data, | |
| isPending: loading, | |
| mutateAsync, | |
| } = useMutation({ | |
| mutationKey: ['createChunk'], | |
| mutationFn: async (payload: any) => { | |
| let service = kbService.create_chunk; | |
| if (payload.chunk_id) { | |
| service = kbService.set_chunk; | |
| } | |
| const { data } = await service(payload); | |
| if (data.code === 0) { | |
| message.success(t('message.created')); | |
| queryClient.invalidateQueries({ queryKey: ['fetchChunkList'] }); | |
| } | |
| return data?.code; | |
| }, | |
| }); | |
| return { data, loading, createChunk: mutateAsync }; | |
| }; | |
| export const useFetchChunk = (chunkId?: string): ResponseType<any> => { | |
| const { data } = useQuery({ | |
| queryKey: ['fetchChunk'], | |
| enabled: !!chunkId, | |
| initialData: {}, | |
| queryFn: async () => { | |
| const data = await kbService.get_chunk({ | |
| chunk_id: chunkId, | |
| }); | |
| return data; | |
| }, | |
| }); | |
| return data; | |
| }; | |
| export const useFetchKnowledgeGraph = ( | |
| documentId: string, | |
| ): ResponseType<any> => { | |
| const { data } = useQuery({ | |
| queryKey: ['fetchKnowledgeGraph', documentId], | |
| initialData: true, | |
| enabled: !!documentId, | |
| gcTime: 0, | |
| queryFn: async () => { | |
| const data = await kbService.knowledge_graph({ | |
| doc_id: documentId, | |
| }); | |
| return data; | |
| }, | |
| }); | |
| return data; | |
| }; | |