|
'use client' |
|
import type { FC } from 'react' |
|
import React, { useCallback, useEffect, useState } from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import s from './index.module.css' |
|
import NoData from './no-data' |
|
import Firecrawl from './firecrawl' |
|
import JinaReader from './jina-reader' |
|
import cn from '@/utils/classnames' |
|
import { useModalContext } from '@/context/modal-context' |
|
import type { CrawlOptions, CrawlResultItem } from '@/models/datasets' |
|
import { fetchDataSources } from '@/service/datasets' |
|
import { type DataSourceItem, DataSourceProvider } from '@/models/common' |
|
|
|
type Props = { |
|
onPreview: (payload: CrawlResultItem) => void |
|
checkedCrawlResult: CrawlResultItem[] |
|
onCheckedCrawlResultChange: (payload: CrawlResultItem[]) => void |
|
onCrawlProviderChange: (provider: DataSourceProvider) => void |
|
onJobIdChange: (jobId: string) => void |
|
crawlOptions: CrawlOptions |
|
onCrawlOptionsChange: (payload: CrawlOptions) => void |
|
} |
|
|
|
const Website: FC<Props> = ({ |
|
onPreview, |
|
checkedCrawlResult, |
|
onCheckedCrawlResultChange, |
|
onCrawlProviderChange, |
|
onJobIdChange, |
|
crawlOptions, |
|
onCrawlOptionsChange, |
|
}) => { |
|
const { t } = useTranslation() |
|
const { setShowAccountSettingModal } = useModalContext() |
|
const [isLoaded, setIsLoaded] = useState(false) |
|
const [selectedProvider, setSelectedProvider] = useState<DataSourceProvider>(DataSourceProvider.jinaReader) |
|
const [sources, setSources] = useState<DataSourceItem[]>([]) |
|
|
|
useEffect(() => { |
|
onCrawlProviderChange(selectedProvider) |
|
}, [selectedProvider, onCrawlProviderChange]) |
|
|
|
const checkSetApiKey = useCallback(async () => { |
|
const res = await fetchDataSources() as any |
|
setSources(res.sources) |
|
|
|
|
|
const availableProviders = res.sources.filter((item: DataSourceItem) => |
|
[DataSourceProvider.jinaReader, DataSourceProvider.fireCrawl].includes(item.provider), |
|
) |
|
|
|
if (availableProviders.length > 0) |
|
setSelectedProvider(availableProviders[0].provider) |
|
}, []) |
|
|
|
useEffect(() => { |
|
checkSetApiKey().then(() => { |
|
setIsLoaded(true) |
|
}) |
|
|
|
}, []) |
|
const handleOnConfig = useCallback(() => { |
|
setShowAccountSettingModal({ |
|
payload: 'data-source', |
|
onCancelCallback: checkSetApiKey, |
|
}) |
|
}, [checkSetApiKey, setShowAccountSettingModal]) |
|
|
|
if (!isLoaded) |
|
return null |
|
|
|
return ( |
|
<div> |
|
<div className="mb-4"> |
|
<div className="font-medium text-gray-700 mb-2 h-6"> |
|
{t('datasetCreation.stepOne.website.chooseProvider')} |
|
</div> |
|
<div className="flex space-x-2"> |
|
<button |
|
className={`px-4 py-2 text-sm font-medium rounded-md flex items-center justify-center ${ |
|
selectedProvider === DataSourceProvider.jinaReader |
|
? 'bg-primary-50 text-primary-600' |
|
: 'bg-gray-100 text-gray-600 hover:bg-gray-200' |
|
}`} |
|
onClick={() => setSelectedProvider(DataSourceProvider.jinaReader)} |
|
> |
|
<span className={cn(s.jinaLogo, 'mr-2')} /> |
|
<span>Jina Reader</span> |
|
</button> |
|
<button |
|
className={`px-4 py-2 text-sm font-medium rounded-md ${ |
|
selectedProvider === DataSourceProvider.fireCrawl |
|
? 'bg-primary-50 text-primary-600' |
|
: 'bg-gray-100 text-gray-600 hover:bg-gray-200' |
|
}`} |
|
onClick={() => setSelectedProvider(DataSourceProvider.fireCrawl)} |
|
> |
|
🔥 Firecrawl |
|
</button> |
|
</div> |
|
</div> |
|
|
|
{ |
|
selectedProvider === DataSourceProvider.fireCrawl |
|
? sources.find(source => source.provider === DataSourceProvider.fireCrawl) |
|
? ( |
|
<Firecrawl |
|
onPreview={onPreview} |
|
checkedCrawlResult={checkedCrawlResult} |
|
onCheckedCrawlResultChange={onCheckedCrawlResultChange} |
|
onJobIdChange={onJobIdChange} |
|
crawlOptions={crawlOptions} |
|
onCrawlOptionsChange={onCrawlOptionsChange} |
|
/> |
|
) |
|
: ( |
|
<NoData onConfig={handleOnConfig} provider={selectedProvider} /> |
|
) |
|
: sources.find(source => source.provider === DataSourceProvider.jinaReader) |
|
? ( |
|
<JinaReader |
|
onPreview={onPreview} |
|
checkedCrawlResult={checkedCrawlResult} |
|
onCheckedCrawlResultChange={onCheckedCrawlResultChange} |
|
onJobIdChange={onJobIdChange} |
|
crawlOptions={crawlOptions} |
|
onCrawlOptionsChange={onCrawlOptionsChange} |
|
/> |
|
) |
|
: ( |
|
<NoData onConfig={handleOnConfig} provider={selectedProvider} /> |
|
) |
|
} |
|
</div> |
|
) |
|
} |
|
export default React.memo(Website) |
|
|