|
'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 |
|
|