mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-04 04:43:09 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
'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
 |