| '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 | |