| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | '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 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 { useAppContext } from '@/context/app-context'import {  DataSourceProvider,} from '@/models/common'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 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 }) => (            item.provider === DataSourceProvider.fireCrawl              ? (                <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>              )              : (                <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: item.provider === DataSourceProvider.fireCrawl ? 'Firecrawl' : 'Jina Reader',          isActive: true,        }))}        onRemove={handleRemove(provider)}      />      {configTarget === DataSourceProvider.fireCrawl && (        <ConfigFirecrawlModal onSaved={handleAdded} onCancel={hideConfig} />      )}      {configTarget === DataSourceProvider.jinaReader && (        <ConfigJinaReaderModal onSaved={handleAdded} onCancel={hideConfig} />      )}    </>  )}export default React.memo(DataSourceWebsite)
 |