Refactor datasets service toward TanStack Query (#29008)

Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com>
This commit is contained in:
yyh
2025-12-09 13:44:45 +08:00
committed by -LAN-
parent 57d244de69
commit 18601d8b38
12 changed files with 270 additions and 152 deletions

View File

@@ -1,23 +1,86 @@
import type { MutationOptions } from '@tanstack/react-query'
import { useInfiniteQuery, useMutation, useQuery } from '@tanstack/react-query'
import {
keepPreviousData,
useInfiniteQuery,
useMutation,
useQuery,
useQueryClient,
} from '@tanstack/react-query'
import qs from 'qs'
import type {
DataSet,
DataSetListResponse,
DatasetListRequest,
ErrorDocsResponse,
ExternalAPIListResponse,
FetchDatasetsParams,
HitTestingRecordsResponse,
IndexingStatusBatchRequest,
IndexingStatusBatchResponse,
ProcessRuleResponse,
RelatedAppResponse,
} from '@/models/datasets'
import type { ApiKeysListResponse } from '@/models/app'
import { get, post } from '../base'
import { useInvalid } from '../use-base'
import qs from 'qs'
import type { CommonResponse } from '@/models/common'
const NAME_SPACE = 'dataset'
const DatasetListKey = [NAME_SPACE, 'list']
const normalizeDatasetsParams = (params: Partial<FetchDatasetsParams['params']> = {}) => {
const {
page = 1,
limit,
ids,
tag_ids,
include_all,
keyword,
} = params
return {
page,
...(limit ? { limit } : {}),
...(ids?.length ? { ids } : {}),
...(tag_ids?.length ? { tag_ids } : {}),
...(include_all !== undefined ? { include_all } : {}),
...(keyword ? { keyword } : {}),
}
}
type UseInfiniteDatasetsOptions = {
enabled?: boolean
refetchOnMount?: boolean | 'always'
staleTime?: number
refetchOnReconnect?: boolean
refetchOnWindowFocus?: boolean
}
export const useInfiniteDatasets = (
params: Partial<FetchDatasetsParams['params']>,
options?: UseInfiniteDatasetsOptions,
) => {
const normalizedParams = normalizeDatasetsParams(params)
const buildUrl = (pageParam: number | undefined) => {
const queryString = qs.stringify({
...normalizedParams,
page: pageParam ?? normalizedParams.page,
}, { indices: false })
return `/datasets?${queryString}`
}
return useInfiniteQuery<DataSetListResponse>({
queryKey: [...DatasetListKey, 'infinite', normalizedParams],
queryFn: ({ pageParam = normalizedParams.page }) => get<DataSetListResponse>(buildUrl(pageParam as number | undefined)),
getNextPageParam: lastPage => lastPage.has_more ? lastPage.page + 1 : undefined,
initialPageParam: normalizedParams.page,
staleTime: 0,
refetchOnMount: 'always',
...options,
})
}
export const useDatasetList = (params: DatasetListRequest) => {
const { initialPage, tag_ids, limit, include_all, keyword } = params
return useInfiniteQuery({
@@ -70,10 +133,12 @@ export const useIndexingStatusBatch = (
})
}
export const useProcessRule = (documentId: string) => {
export const useProcessRule = (documentId?: string) => {
return useQuery<ProcessRuleResponse>({
queryKey: [NAME_SPACE, 'process-rule', documentId],
queryFn: () => get<ProcessRuleResponse>('/datasets/process-rule', { params: { document_id: documentId } }),
enabled: !!documentId,
refetchOnWindowFocus: false,
})
}
@@ -97,3 +162,57 @@ export const useDisableDatasetServiceApi = () => {
mutationFn: (datasetId: string) => post<CommonResponse>(`/datasets/${datasetId}/api-keys/disable`),
})
}
export const useDatasetApiKeys = (options?: { enabled?: boolean }) => {
return useQuery<ApiKeysListResponse>({
queryKey: [NAME_SPACE, 'api-keys'],
queryFn: () => get<ApiKeysListResponse>('/datasets/api-keys'),
enabled: options?.enabled ?? true,
})
}
export const useInvalidateDatasetApiKeys = () => {
const queryClient = useQueryClient()
return () => {
queryClient.invalidateQueries({
queryKey: [NAME_SPACE, 'api-keys'],
})
}
}
export const useExternalKnowledgeApiList = (options?: { enabled?: boolean }) => {
return useQuery<ExternalAPIListResponse>({
queryKey: [NAME_SPACE, 'external-knowledge-api'],
queryFn: () => get<ExternalAPIListResponse>('/datasets/external-knowledge-api'),
enabled: options?.enabled ?? true,
})
}
export const useInvalidateExternalKnowledgeApiList = () => {
const queryClient = useQueryClient()
return () => {
queryClient.invalidateQueries({
queryKey: [NAME_SPACE, 'external-knowledge-api'],
})
}
}
export const useDatasetTestingRecords = (
datasetId?: string,
params?: { page: number; limit: number },
) => {
return useQuery<HitTestingRecordsResponse>({
queryKey: [NAME_SPACE, 'testing-records', datasetId, params],
queryFn: () => get<HitTestingRecordsResponse>(`/datasets/${datasetId}/queries`, { params }),
enabled: !!datasetId && !!params,
placeholderData: keepPreviousData,
})
}
export const useDatasetErrorDocs = (datasetId?: string) => {
return useQuery<ErrorDocsResponse>({
queryKey: [NAME_SPACE, 'error-docs', datasetId],
queryFn: () => get<ErrorDocsResponse>(`/datasets/${datasetId}/error-docs`),
enabled: !!datasetId,
})
}