mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 02:42:59 +00:00 
			
		
		
		
	 d069c668f8
			
		
	
	
		d069c668f8
		
			
		
	
	
	
	
		
			
			Co-authored-by: StyleZhang <jasonapring2015@outlook.com> Co-authored-by: Garfield Dai <dai.hai@foxmail.com> Co-authored-by: chenhe <guchenhe@gmail.com> Co-authored-by: jyong <jyong@dify.ai> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Yeuoly <admin@srmxy.cn>
		
			
				
	
	
		
			148 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 'use client'
 | |
| import React, { useCallback, useEffect, useState } from 'react'
 | |
| import { useTranslation } from 'react-i18next'
 | |
| import AppUnavailable from '../../base/app-unavailable'
 | |
| import StepsNavBar from './steps-nav-bar'
 | |
| import StepOne from './step-one'
 | |
| import StepTwo from './step-two'
 | |
| import StepThree from './step-three'
 | |
| import { DataSourceType } from '@/models/datasets'
 | |
| import type { DataSet, FileItem, createDocumentResponse } from '@/models/datasets'
 | |
| import { fetchDataSource } from '@/service/common'
 | |
| import { fetchDatasetDetail } from '@/service/datasets'
 | |
| import type { NotionPage } from '@/models/common'
 | |
| import { useModalContext } from '@/context/modal-context'
 | |
| import { useDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
 | |
| 
 | |
| type DatasetUpdateFormProps = {
 | |
|   datasetId?: string
 | |
| }
 | |
| 
 | |
| const DatasetUpdateForm = ({ datasetId }: DatasetUpdateFormProps) => {
 | |
|   const { t } = useTranslation()
 | |
|   const { setShowAccountSettingModal } = useModalContext()
 | |
|   const [hasConnection, setHasConnection] = useState(true)
 | |
|   const [dataSourceType, setDataSourceType] = useState<DataSourceType>(DataSourceType.FILE)
 | |
|   const [step, setStep] = useState(1)
 | |
|   const [indexingTypeCache, setIndexTypeCache] = useState('')
 | |
|   const [fileList, setFiles] = useState<FileItem[]>([])
 | |
|   const [result, setResult] = useState<createDocumentResponse | undefined>()
 | |
|   const [hasError, setHasError] = useState(false)
 | |
|   const { data: embeddingsDefaultModel } = useDefaultModel(2)
 | |
| 
 | |
|   const [notionPages, setNotionPages] = useState<NotionPage[]>([])
 | |
|   const updateNotionPages = (value: NotionPage[]) => {
 | |
|     setNotionPages(value)
 | |
|   }
 | |
| 
 | |
|   const updateFileList = (preparedFiles: FileItem[]) => {
 | |
|     setFiles(preparedFiles)
 | |
|   }
 | |
| 
 | |
|   const updateFile = (fileItem: FileItem, progress: number, list: FileItem[]) => {
 | |
|     const targetIndex = list.findIndex(file => file.fileID === fileItem.fileID)
 | |
|     list[targetIndex] = {
 | |
|       ...list[targetIndex],
 | |
|       progress,
 | |
|     }
 | |
|     setFiles([...list])
 | |
|     // use follow code would cause dirty list update problem
 | |
|     // const newList = list.map((file) => {
 | |
|     //   if (file.fileID === fileItem.fileID) {
 | |
|     //     return {
 | |
|     //       ...fileItem,
 | |
|     //       progress,
 | |
|     //     }
 | |
|     //   }
 | |
|     //   return file
 | |
|     // })
 | |
|     // setFiles(newList)
 | |
|   }
 | |
|   const updateIndexingTypeCache = (type: string) => {
 | |
|     setIndexTypeCache(type)
 | |
|   }
 | |
|   const updateResultCache = (res?: createDocumentResponse) => {
 | |
|     setResult(res)
 | |
|   }
 | |
| 
 | |
|   const nextStep = useCallback(() => {
 | |
|     setStep(step + 1)
 | |
|   }, [step, setStep])
 | |
| 
 | |
|   const changeStep = useCallback((delta: number) => {
 | |
|     setStep(step + delta)
 | |
|   }, [step, setStep])
 | |
| 
 | |
|   const checkNotionConnection = async () => {
 | |
|     const { data } = await fetchDataSource({ url: '/data-source/integrates' })
 | |
|     const hasConnection = data.filter(item => item.provider === 'notion') || []
 | |
|     setHasConnection(hasConnection.length > 0)
 | |
|   }
 | |
| 
 | |
|   useEffect(() => {
 | |
|     checkNotionConnection()
 | |
|   }, [])
 | |
| 
 | |
|   const [detail, setDetail] = useState<DataSet | null>(null)
 | |
|   useEffect(() => {
 | |
|     (async () => {
 | |
|       if (datasetId) {
 | |
|         try {
 | |
|           const detail = await fetchDatasetDetail(datasetId)
 | |
|           setDetail(detail)
 | |
|         }
 | |
|         catch (e) {
 | |
|           setHasError(true)
 | |
|         }
 | |
|       }
 | |
|     })()
 | |
|   }, [datasetId])
 | |
| 
 | |
|   if (hasError)
 | |
|     return <AppUnavailable code={500} unknownReason={t('datasetCreation.error.unavailable') as string} />
 | |
| 
 | |
|   return (
 | |
|     <div className='flex' style={{ height: 'calc(100vh - 56px)' }}>
 | |
|       <div className="flex flex-col w-11 sm:w-56 overflow-y-auto bg-white border-r border-gray-200 shrink-0">
 | |
|         <StepsNavBar step={step} datasetId={datasetId} />
 | |
|       </div>
 | |
|       <div className="grow bg-white">
 | |
|         {step === 1 && <StepOne
 | |
|           hasConnection={hasConnection}
 | |
|           onSetting={() => setShowAccountSettingModal({ payload: 'data-source' })}
 | |
|           datasetId={datasetId}
 | |
|           dataSourceType={dataSourceType}
 | |
|           dataSourceTypeDisable={!!detail?.data_source_type}
 | |
|           changeType={setDataSourceType}
 | |
|           files={fileList}
 | |
|           updateFile={updateFile}
 | |
|           updateFileList={updateFileList}
 | |
|           notionPages={notionPages}
 | |
|           updateNotionPages={updateNotionPages}
 | |
|           onStepChange={nextStep}
 | |
|         />}
 | |
|         {(step === 2 && (!datasetId || (datasetId && !!detail))) && <StepTwo
 | |
|           hasSetAPIKEY={!!embeddingsDefaultModel}
 | |
|           onSetting={() => setShowAccountSettingModal({ payload: 'provider' })}
 | |
|           indexingType={detail?.indexing_technique}
 | |
|           datasetId={datasetId}
 | |
|           dataSourceType={dataSourceType}
 | |
|           files={fileList.map(file => file.file)}
 | |
|           notionPages={notionPages}
 | |
|           onStepChange={changeStep}
 | |
|           updateIndexingTypeCache={updateIndexingTypeCache}
 | |
|           updateResultCache={updateResultCache}
 | |
|         />}
 | |
|         {step === 3 && <StepThree
 | |
|           datasetId={datasetId}
 | |
|           datasetName={detail?.name}
 | |
|           indexingType={detail?.indexing_technique || indexingTypeCache}
 | |
|           creationCache={result}
 | |
|         />}
 | |
|       </div>
 | |
|     </div>
 | |
|   )
 | |
| }
 | |
| 
 | |
| export default DatasetUpdateForm
 |