index.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useCallback } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { useParams, useRouter } from 'next/navigation'
  4. import useSWR from 'swr'
  5. import useSWRInfinite from 'swr/infinite'
  6. import { flatten } from 'lodash-es'
  7. import Nav from '../nav'
  8. import { fetchDataDetail, fetchDatasets } from '@/service/datasets'
  9. import { Database01 } from '@/app/components/base/icons/src/vender/line/development'
  10. import { Database02 } from '@/app/components/base/icons/src/vender/solid/development'
  11. import type { DataSetListResponse } from '@/models/datasets'
  12. const getKey = (pageIndex: number, previousPageData: DataSetListResponse) => {
  13. if (!pageIndex || previousPageData.has_more)
  14. return { url: 'datasets', params: { page: pageIndex + 1, limit: 30 } }
  15. return null
  16. }
  17. const DatasetNav = () => {
  18. const { t } = useTranslation()
  19. const router = useRouter()
  20. const { datasetId } = useParams()
  21. const { data: currentDataset } = useSWR(datasetId || null, fetchDataDetail)
  22. const { data: datasetsData, setSize } = useSWRInfinite(datasetId ? getKey : () => null, fetchDatasets, { revalidateFirstPage: true })
  23. const datasetItems = flatten(datasetsData?.map(datasetData => datasetData.data))
  24. const handleLoadmore = useCallback(() => {
  25. setSize(size => size + 1)
  26. }, [setSize])
  27. return (
  28. <Nav
  29. icon={<Database01 className='w-4 h-4' />}
  30. activeIcon={<Database02 className='w-4 h-4' />}
  31. text={t('common.menus.datasets')}
  32. activeSegment='datasets'
  33. link='/datasets'
  34. curNav={currentDataset}
  35. navs={datasetItems.map(dataset => ({
  36. id: dataset.id,
  37. name: dataset.name,
  38. link: `/datasets/${dataset.id}/documents`,
  39. icon: dataset.icon,
  40. icon_background: dataset.icon_background,
  41. }))}
  42. createText={t('common.menus.newDataset')}
  43. onCreate={() => router.push('/datasets/create')}
  44. onLoadmore={handleLoadmore}
  45. />
  46. )
  47. }
  48. export default DatasetNav