| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | '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)    // If users have configured one of the providers, select it.    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)    })    // eslint-disable-next-line react-hooks/exhaustive-deps  }, [])  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)
 |