選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.tsx 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 type { NavItem } from '../nav/nav-selector'
  14. import { fetchDatasetDetail, fetchDatasets } from '@/service/datasets'
  15. import type { DataSetListResponse } from '@/models/datasets'
  16. import { basePath } from '@/utils/var'
  17. const getKey = (pageIndex: number, previousPageData: DataSetListResponse) => {
  18. if (!pageIndex || previousPageData.has_more)
  19. return { url: 'datasets', params: { page: pageIndex + 1, limit: 30 } }
  20. return null
  21. }
  22. const DatasetNav = () => {
  23. const { t } = useTranslation()
  24. const router = useRouter()
  25. const { datasetId } = useParams()
  26. const { data: currentDataset } = useSWR(
  27. datasetId
  28. ? {
  29. url: 'fetchDatasetDetail',
  30. datasetId,
  31. }
  32. : null,
  33. apiParams => fetchDatasetDetail(apiParams.datasetId as string))
  34. const { data: datasetsData, setSize } = useSWRInfinite(datasetId ? getKey : () => null, fetchDatasets, { revalidateFirstPage: false, revalidateAll: true })
  35. const datasetItems = flatten(datasetsData?.map(datasetData => datasetData.data))
  36. const handleLoadmore = useCallback(() => {
  37. setSize(size => size + 1)
  38. }, [setSize])
  39. return (
  40. <Nav
  41. icon={<RiBook2Line className='h-4 w-4' />}
  42. activeIcon={<RiBook2Fill className='h-4 w-4' />}
  43. text={t('common.menus.datasets')}
  44. activeSegment='datasets'
  45. link='/datasets'
  46. curNav={currentDataset as Omit<NavItem, 'link'>}
  47. navs={datasetItems.map(dataset => ({
  48. id: dataset.id,
  49. name: dataset.name,
  50. link: dataset.provider === 'external' ? `/datasets/${dataset.id}/hitTesting` : `/datasets/${dataset.id}/documents`,
  51. icon: dataset.icon,
  52. icon_background: dataset.icon_background,
  53. })) as NavItem[]}
  54. createText={t('common.menus.newDataset')}
  55. onCreate={() => router.push(`${basePath}/datasets/create`)}
  56. onLoadmore={handleLoadmore}
  57. />
  58. )
  59. }
  60. export default DatasetNav