| 'use client' |
|
|
| import { useCallback } from 'react' |
| import { useTranslation } from 'react-i18next' |
| import { useParams, useRouter } from 'next/navigation' |
| import { |
| RiBook2Fill, |
| RiBook2Line, |
| } from '@remixicon/react' |
| import useSWR from 'swr' |
| import useSWRInfinite from 'swr/infinite' |
| import { flatten } from 'lodash-es' |
| import Nav from '../nav' |
| import type { NavItem } from '../nav/nav-selector' |
| import { fetchDatasetDetail, fetchDatasets } from '@/service/datasets' |
| import type { DataSetListResponse } from '@/models/datasets' |
|
|
| const getKey = (pageIndex: number, previousPageData: DataSetListResponse) => { |
| if (!pageIndex || previousPageData.has_more) |
| return { url: 'datasets', params: { page: pageIndex + 1, limit: 30 } } |
| return null |
| } |
|
|
| const DatasetNav = () => { |
| const { t } = useTranslation() |
| const router = useRouter() |
| const { datasetId } = useParams() |
| const { data: currentDataset } = useSWR( |
| datasetId |
| ? { |
| url: 'fetchDatasetDetail', |
| datasetId, |
| } |
| : null, |
| apiParams => fetchDatasetDetail(apiParams.datasetId as string)) |
| const { data: datasetsData, setSize } = useSWRInfinite(datasetId ? getKey : () => null, fetchDatasets, { revalidateFirstPage: false, revalidateAll: true }) |
| const datasetItems = flatten(datasetsData?.map(datasetData => datasetData.data)) |
|
|
| const handleLoadmore = useCallback(() => { |
| setSize(size => size + 1) |
| }, [setSize]) |
|
|
| return ( |
| <Nav |
| icon={<RiBook2Line className='w-4 h-4' />} |
| activeIcon={<RiBook2Fill className='w-4 h-4' />} |
| text={t('common.menus.datasets')} |
| activeSegment='datasets' |
| link='/datasets' |
| curNav={currentDataset as Omit<NavItem, 'link'>} |
| navs={datasetItems.map(dataset => ({ |
| id: dataset.id, |
| name: dataset.name, |
| link: dataset.provider === 'external' ? `/datasets/${dataset.id}/hitTesting` : `/datasets/${dataset.id}/documents`, |
| icon: dataset.icon, |
| icon_background: dataset.icon_background, |
| })) as NavItem[]} |
| createText={t('common.menus.newDataset')} |
| onCreate={() => router.push('/datasets/create')} |
| onLoadmore={handleLoadmore} |
| /> |
| ) |
| } |
| |
| export default DatasetNav |
| |