index.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 'use client'
  2. import { useCallback } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import { useParams, useRouter } from 'next/navigation'
  5. import useSWR from 'swr'
  6. import useSWRInfinite from 'swr/infinite'
  7. import { flatten } from 'lodash-es'
  8. import Nav from '../nav'
  9. import { Knowledge, KnowledgeActive } from '../../base/icons/src/public/header-nav/knowledge'
  10. import { fetchDatasetDetail, fetchDatasets } from '@/service/datasets'
  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(
  22. datasetId
  23. ? {
  24. url: 'fetchDatasetDetail',
  25. datasetId,
  26. }
  27. : null,
  28. apiParams => fetchDatasetDetail(apiParams.datasetId))
  29. const { data: datasetsData, setSize } = useSWRInfinite(datasetId ? getKey : () => null, fetchDatasets, { revalidateFirstPage: false, revalidateAll: true })
  30. const datasetItems = flatten(datasetsData?.map(datasetData => datasetData.data))
  31. const handleLoadmore = useCallback(() => {
  32. setSize(size => size + 1)
  33. }, [setSize])
  34. return (
  35. <Nav
  36. icon={<Knowledge className='w-4 h-4' />}
  37. activeIcon={<KnowledgeActive className='w-4 h-4' />}
  38. text={t('common.menus.datasets')}
  39. activeSegment='datasets'
  40. link='/datasets'
  41. curNav={currentDataset}
  42. navs={datasetItems.map(dataset => ({
  43. id: dataset.id,
  44. name: dataset.name,
  45. link: `/datasets/${dataset.id}/documents`,
  46. icon: dataset.icon,
  47. icon_background: dataset.icon_background,
  48. }))}
  49. createText={t('common.menus.newDataset')}
  50. onCreate={() => router.push('/datasets/create')}
  51. onLoadmore={handleLoadmore}
  52. />
  53. )
  54. }
  55. export default DatasetNav