diff --git a/web/app/components/datasets/documents/index.tsx b/web/app/components/datasets/documents/index.tsx index 06825f60ad..8c2bb32887 100644 --- a/web/app/components/datasets/documents/index.tsx +++ b/web/app/components/datasets/documents/index.tsx @@ -1,11 +1,10 @@ 'use client' import type { FC } from 'react' import React, { useCallback, useEffect, useMemo, useState } from 'react' -import useSWR from 'swr' import { useTranslation } from 'react-i18next' import { useRouter } from 'next/navigation' import { useDebounce, useDebounceFn } from 'ahooks' -import { groupBy, omit } from 'lodash-es' +import { groupBy } from 'lodash-es' import { PlusIcon } from '@heroicons/react/24/solid' import { RiDraftLine, RiExternalLinkLine } from '@remixicon/react' import AutoDisabledDocument from '../common/document-status-with-action/auto-disabled-document' @@ -15,16 +14,16 @@ import Loading from '@/app/components/base/loading' import Button from '@/app/components/base/button' import Input from '@/app/components/base/input' import { get } from '@/service/base' -import { createDocument, fetchDocuments } from '@/service/datasets' +import { createDocument } from '@/service/datasets' import { useDatasetDetailContext } from '@/context/dataset-detail' import { NotionPageSelectorModal } from '@/app/components/base/notion-page-selector' import type { NotionPage } from '@/models/common' import type { CreateDocumentReq } from '@/models/datasets' -import { DataSourceType } from '@/models/datasets' +import { DataSourceType, ProcessMode } from '@/models/datasets' import IndexFailed from '@/app/components/datasets/common/document-status-with-action/index-failed' import { useProviderContext } from '@/context/provider-context' import cn from '@/utils/classnames' -import { useInvalidDocumentDetailKey } from '@/service/knowledge/use-document' +import { useDocumentList, useInvalidDocumentDetailKey, useInvalidDocumentList } from '@/service/knowledge/use-document' import { useInvalid } from '@/service/use-base' import { useChildSegmentListKey, useSegmentListKey } from '@/service/knowledge/use-segment' import useEditDocumentMetadata from '../metadata/hooks/use-edit-dataset-metadata' @@ -81,7 +80,7 @@ type IDocumentsProps = { } export const fetcher = (url: string) => get(url, {}, {}) -const DEFAULT_LIMIT = 15 +const DEFAULT_LIMIT = 10 const Documents: FC = ({ datasetId }) => { const { t } = useTranslation() @@ -102,33 +101,33 @@ const Documents: FC = ({ datasetId }) => { const debouncedSearchValue = useDebounce(searchValue, { wait: 500 }) - const query = useMemo(() => { - return { page: currPage + 1, limit, keyword: debouncedSearchValue, fetch: isDataSourceNotion ? true : '' } - }, [currPage, debouncedSearchValue, isDataSourceNotion, limit]) - - const { data: documentsRes, mutate, isLoading: isListLoading } = useSWR( - { - action: 'fetchDocuments', - datasetId, - params: query, + const { data: documentsRes, isFetching: isListLoading } = useDocumentList({ + datasetId, + query: { + page: currPage + 1, + limit, + keyword: debouncedSearchValue, }, - apiParams => fetchDocuments(omit(apiParams, 'action')), - { refreshInterval: (isDataSourceNotion && timerCanRun) ? 2500 : 0 }, - ) + refetchInterval: (isDataSourceNotion && timerCanRun) ? 2500 : 0, + }) + + const invalidDocumentList = useInvalidDocumentList(datasetId) - const [isMuting, setIsMuting] = useState(false) useEffect(() => { - if (!isListLoading && isMuting) - setIsMuting(false) - }, [isListLoading, isMuting]) + if (documentsRes) { + const totalPages = Math.ceil(documentsRes.total / limit) + if (totalPages < currPage + 1) + setCurrPage(totalPages === 0 ? 0 : totalPages - 1) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [documentsRes]) const invalidDocumentDetail = useInvalidDocumentDetailKey() const invalidChunkList = useInvalid(useSegmentListKey) const invalidChildChunkList = useInvalid(useChildSegmentListKey) const handleUpdate = useCallback(() => { - setIsMuting(true) - mutate() + invalidDocumentList() invalidDocumentDetail() setTimeout(() => { invalidChunkList() @@ -178,8 +177,6 @@ const Documents: FC = ({ datasetId }) => { router.push(`/datasets/${datasetId}/documents/create`) } - const isLoading = isListLoading // !documentsRes && !error - const handleSaveNotionPageSelected = async (selectedPages: NotionPage[]) => { const workspacesMap = groupBy(selectedPages, 'workspace_id') const workspaces = Object.keys(workspacesMap).map((workspaceId) => { @@ -212,7 +209,7 @@ const Documents: FC = ({ datasetId }) => { indexing_technique: dataset?.indexing_technique, process_rule: { rules: {}, - mode: 'automatic', + mode: ProcessMode.general, }, } as CreateDocumentReq @@ -220,7 +217,7 @@ const Documents: FC = ({ datasetId }) => { datasetId, body: params, }) - mutate() + invalidDocumentList() setTimerCanRun(true) // mutateDatasetIndexingStatus(undefined, { revalidate: true }) setNotionPageSelectorModalVisible(false) @@ -251,7 +248,7 @@ const Documents: FC = ({ datasetId }) => { } = useEditDocumentMetadata({ datasetId, dataset, - onUpdateDocList: mutate, + onUpdateDocList: invalidDocumentList, }) return ( @@ -311,7 +308,7 @@ const Documents: FC = ({ datasetId }) => { )} - {(isLoading && !isMuting) + {isListLoading ? : total > 0 ? = ({ return (
-
+
diff --git a/web/service/knowledge/use-document.ts b/web/service/knowledge/use-document.ts index 5bced9286e..6dabe7d872 100644 --- a/web/service/knowledge/use-document.ts +++ b/web/service/knowledge/use-document.ts @@ -11,7 +11,7 @@ import type { CommonResponse } from '@/models/common' const NAME_SPACE = 'knowledge/document' -const useDocumentListKey = [NAME_SPACE, 'documentList'] +export const useDocumentListKey = [NAME_SPACE, 'documentList'] export const useDocumentList = (payload: { datasetId: string query: { diff --git a/web/service/knowledge/use-metadata.ts b/web/service/knowledge/use-metadata.ts index 6d9566fe06..5e9186f539 100644 --- a/web/service/knowledge/use-metadata.ts +++ b/web/service/knowledge/use-metadata.ts @@ -1,6 +1,6 @@ import type { BuiltInMetadataItem, MetadataBatchEditToServer, MetadataItemWithValueLength } from '@/app/components/datasets/metadata/types' import { del, get, patch, post } from '../base' -import { mutate } from 'swr' +import { useDocumentListKey, useInvalidDocumentList } from './use-document' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useInvalid } from '../use-base' import type { DocumentDetailResponse } from '@/models/datasets' @@ -44,14 +44,14 @@ export const useInvalidAllDocumentMetaData = (datasetId: string) => { const useInvalidAllMetaData = (datasetId: string) => { const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId) + const invalidDocumentList = useInvalidDocumentList(datasetId) const invalidateAllDocumentMetaData = useInvalidAllDocumentMetaData(datasetId) + return async () => { // meta data in dataset await invalidDatasetMetaData() // meta data in document list - mutate( - (key: any) => typeof key === 'object' && key.action === 'fetchDocuments' && key.datasetId === datasetId, - ) + invalidDocumentList() // meta data in single document await invalidateAllDocumentMetaData() // meta data in document } @@ -118,9 +118,13 @@ export const useBatchUpdateDocMetadata = () => { queryKey: [NAME_SPACE, 'dataset', payload.dataset_id], }) // meta data in document list - mutate( - (key: any) => typeof key === 'object' && key.action === 'fetchDocuments' && key.datasetId === payload.dataset_id, - ) + await queryClient.invalidateQueries({ + queryKey: [NAME_SPACE, 'dataset', payload.dataset_id], + }) + await queryClient.invalidateQueries({ + queryKey: [...useDocumentListKey, payload.dataset_id], + }) + // meta data in single document await Promise.all(documentIds.map(documentId => queryClient.invalidateQueries( {
e.stopPropagation()}> - + {embeddingAvailable && ( + + )} #