| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 | 
							- 'use client'
 - import type { FC } from 'react'
 - import React, { useCallback, useEffect, useState } from 'react'
 - import { useTranslation } from 'react-i18next'
 - import Panel from '../panel'
 - import { DataSourceType } from '../panel/types'
 - import ConfigFirecrawlModal from './config-firecrawl-modal'
 - import ConfigWatercrawlModal from './config-watercrawl-modal'
 - import ConfigJinaReaderModal from './config-jina-reader-modal'
 - import cn from '@/utils/classnames'
 - import s from '@/app/components/datasets/create/website/index.module.css'
 - import { fetchDataSources, removeDataSourceApiKeyBinding } from '@/service/datasets'
 - 
 - import type { DataSourceItem } from '@/models/common'
 - import { DataSourceProvider } from '@/models/common'
 - import { useAppContext } from '@/context/app-context'
 - import Toast from '@/app/components/base/toast'
 - 
 - type Props = {
 -   provider: DataSourceProvider
 - }
 - 
 - const DataSourceWebsite: FC<Props> = ({ provider }) => {
 -   const { t } = useTranslation()
 -   const { isCurrentWorkspaceManager } = useAppContext()
 -   const [sources, setSources] = useState<DataSourceItem[]>([])
 -   const checkSetApiKey = useCallback(async () => {
 -     const res = await fetchDataSources() as any
 -     const list = res.sources
 -     setSources(list)
 -   }, [])
 - 
 -   useEffect(() => {
 -     checkSetApiKey()
 -     // eslint-disable-next-line react-hooks/exhaustive-deps
 -   }, [])
 - 
 -   const [configTarget, setConfigTarget] = useState<DataSourceProvider | null>(null)
 -   const showConfig = useCallback((provider: DataSourceProvider) => {
 -     setConfigTarget(provider)
 -   }, [setConfigTarget])
 - 
 -   const hideConfig = useCallback(() => {
 -     setConfigTarget(null)
 -   }, [setConfigTarget])
 - 
 -   const handleAdded = useCallback(() => {
 -     checkSetApiKey()
 -     hideConfig()
 -   }, [checkSetApiKey, hideConfig])
 - 
 -   const getIdByProvider = (provider: DataSourceProvider): string | undefined => {
 -     const source = sources.find(item => item.provider === provider)
 -     return source?.id
 -   }
 - 
 -   const getProviderName = (provider: DataSourceProvider): string => {
 -     if (provider === DataSourceProvider.fireCrawl)
 -       return 'Firecrawl'
 - 
 -     if (provider === DataSourceProvider.waterCrawl)
 -       return 'WaterCrawl'
 - 
 -     return 'Jina Reader'
 -   }
 - 
 -   const handleRemove = useCallback((provider: DataSourceProvider) => {
 -     return async () => {
 -       const dataSourceId = getIdByProvider(provider)
 -       if (dataSourceId) {
 -         await removeDataSourceApiKeyBinding(dataSourceId)
 -         setSources(sources.filter(item => item.provider !== provider))
 -         Toast.notify({
 -           type: 'success',
 -           message: t('common.api.remove'),
 -         })
 -       }
 -     }
 -   }, [sources, t])
 - 
 -   return (
 -     <>
 -       <Panel
 -         type={DataSourceType.website}
 -         provider={provider}
 -         isConfigured={sources.find(item => item.provider === provider) !== undefined}
 -         onConfigure={() => showConfig(provider)}
 -         readOnly={!isCurrentWorkspaceManager}
 -         configuredList={sources.filter(item => item.provider === provider).map(item => ({
 -           id: item.id,
 -           logo: ({ className }: { className: string }) => {
 -             if (item.provider === DataSourceProvider.fireCrawl) {
 -               return (
 -                 <div
 -                   className={cn(className, 'ml-3 flex h-5 w-5 items-center justify-center rounded border border-divider-subtle !bg-background-default text-xs font-medium text-text-tertiary')}>🔥</div>
 -               )
 -             }
 - 
 -             if (item.provider === DataSourceProvider.waterCrawl) {
 -               return (
 -                 <div
 -                   className={cn(className, 'ml-3 flex h-5 w-5 items-center justify-center rounded border border-divider-subtle !bg-background-default text-xs font-medium text-text-tertiary')}>
 -                   <span className={s.watercrawlLogo}/>
 -                 </div>
 -               )
 -             }
 -             return (
 -               <div
 -                 className={cn(className, 'ml-3 flex h-5 w-5 items-center justify-center rounded border border-divider-subtle !bg-background-default text-xs font-medium text-text-tertiary')}>
 -                 <span className={s.jinaLogo}/>
 -               </div>
 -             )
 -           },
 -           name: getProviderName(item.provider),
 -           isActive: true,
 -         }))}
 -         onRemove={handleRemove(provider)}
 -       />
 -       {configTarget === DataSourceProvider.fireCrawl && (
 -         <ConfigFirecrawlModal onSaved={handleAdded} onCancel={hideConfig}/>
 -       )}
 -       {configTarget === DataSourceProvider.waterCrawl && (
 -         <ConfigWatercrawlModal onSaved={handleAdded} onCancel={hideConfig}/>
 -       )}
 -       {configTarget === DataSourceProvider.jinaReader && (
 -         <ConfigJinaReaderModal onSaved={handleAdded} onCancel={hideConfig}/>
 -       )}
 -     </>
 - 
 -   )
 - }
 - export default React.memo(DataSourceWebsite)
 
 
  |