index.tsx 2.0 KB

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