| 'use client' |
| import React, { useCallback, useEffect, useState } from 'react' |
| import { useTranslation } from 'react-i18next' |
| import AppUnavailable from '../../base/app-unavailable' |
| import { ModelTypeEnum } from '../../header/account-setting/model-provider-page/declarations' |
| 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 { CrawlOptions, CrawlResultItem, DataSet, FileItem, createDocumentResponse } from '@/models/datasets' |
| import { fetchDataSource } from '@/service/common' |
| import { fetchDatasetDetail } from '@/service/datasets' |
| import { DataSourceProvider, 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 DEFAULT_CRAWL_OPTIONS: CrawlOptions = { |
| crawl_sub_pages: true, |
| only_main_content: true, |
| includes: '', |
| excludes: '', |
| limit: 10, |
| max_depth: '', |
| use_sitemap: true, |
| } |
|
|
| 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(ModelTypeEnum.textEmbedding) |
|
|
| const [notionPages, setNotionPages] = useState<NotionPage[]>([]) |
| const updateNotionPages = (value: NotionPage[]) => { |
| setNotionPages(value) |
| } |
|
|
| const [websitePages, setWebsitePages] = useState<CrawlResultItem[]>([]) |
| const [crawlOptions, setCrawlOptions] = useState<CrawlOptions>(DEFAULT_CRAWL_OPTIONS) |
|
|
| const updateFileList = (preparedFiles: FileItem[]) => { |
| setFiles(preparedFiles) |
| } |
| const [websiteCrawlProvider, setWebsiteCrawlProvider] = useState<DataSourceProvider>(DataSourceProvider.fireCrawl) |
| const [websiteCrawlJobId, setWebsiteCrawlJobId] = useState('') |
|
|
| const updateFile = (fileItem: FileItem, progress: number, list: FileItem[]) => { |
| const targetIndex = list.findIndex(file => file.fileID === fileItem.fileID) |
| list[targetIndex] = { |
| ...list[targetIndex], |
| progress, |
| } |
| setFiles([...list]) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| } |
| 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"> |
| <div className={step === 1 ? 'block h-full' : 'hidden'}> |
| <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} |
| websitePages={websitePages} |
| updateWebsitePages={setWebsitePages} |
| onWebsiteCrawlProviderChange={setWebsiteCrawlProvider} |
| onWebsiteCrawlJobIdChange={setWebsiteCrawlJobId} |
| crawlOptions={crawlOptions} |
| onCrawlOptionsChange={setCrawlOptions} |
| /> |
| </div> |
| {(step === 2 && (!datasetId || (datasetId && !!detail))) && <StepTwo |
| isAPIKeySet={!!embeddingsDefaultModel} |
| onSetting={() => setShowAccountSettingModal({ payload: 'provider' })} |
| indexingType={detail?.indexing_technique} |
| datasetId={datasetId} |
| dataSourceType={dataSourceType} |
| files={fileList.map(file => file.file)} |
| notionPages={notionPages} |
| websitePages={websitePages} |
| websiteCrawlProvider={websiteCrawlProvider} |
| websiteCrawlJobId={websiteCrawlJobId} |
| onStepChange={changeStep} |
| updateIndexingTypeCache={updateIndexingTypeCache} |
| updateResultCache={updateResultCache} |
| crawlOptions={crawlOptions} |
| />} |
| {step === 3 && <StepThree |
| datasetId={datasetId} |
| datasetName={detail?.name} |
| indexingType={detail?.indexing_technique || indexingTypeCache} |
| creationCache={result} |
| />} |
| </div> |
| </div> |
| ) |
| } |
|
|
| export default DatasetUpdateForm |
|
|