'use client' import type { ReactNode } from 'react' import type { useDatasetList } from '@/service/knowledge/use-dataset' import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' import Loading from '@/app/components/base/loading' import { useInvalidDatasetList } from '@/service/knowledge/use-dataset' import DatasetCard from './dataset-card' import DatasetCardSkeleton from './dataset-card-skeleton' type Props = Readonly<{ datasetList: ReturnType['data'] | null fetchNextPage: ReturnType['fetchNextPage'] hasNextPage: ReturnType['hasNextPage'] isFetching: ReturnType['isFetching'] isFetchingNextPage: ReturnType['isFetchingNextPage'] isLoading: ReturnType['isLoading'] isPlaceholderData: ReturnType['isPlaceholderData'] emptyElement?: ReactNode onOpenTagManagement?: () => void }> const Datasets = ({ datasetList, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage, isLoading, isPlaceholderData, emptyElement, onOpenTagManagement = () => { }, }: Props) => { const { t } = useTranslation() const invalidDatasetList = useInvalidDatasetList() const anchorRef = useRef(null) const observerRef = useRef(null) const pages = datasetList?.pages ?? [] const datasets = pages.flatMap(({ data }) => data) const showDatasetSkeleton = !isFetchingNextPage && (isLoading || (isPlaceholderData && isFetching && datasets.length === 0)) useEffect(() => { document.title = `${t('knowledge', { ns: 'dataset' })} - Dify` }, [t]) useEffect(() => { if (anchorRef.current) { observerRef.current = new IntersectionObserver((entries) => { if (entries[0]!.isIntersecting && hasNextPage && !isFetching && !isPlaceholderData) fetchNextPage() }, { rootMargin: '100px', }) observerRef.current.observe(anchorRef.current) } return () => observerRef.current?.disconnect() }, [anchorRef, hasNextPage, isFetching, isPlaceholderData, fetchNextPage]) const hasAnyDataset = (datasetList?.pages[0]?.total ?? 0) > 0 || !!datasetList?.pages.some(({ data }) => data.length > 0) return ( <> ) } export default Datasets