| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  | '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' | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  | import ConfigWatercrawlModal from './config-watercrawl-modal' | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  | import ConfigJinaReaderModal from './config-jina-reader-modal' | 
					
						
							| 
									
										
										
										
											2024-07-09 15:05:40 +08:00
										 |  |  | import cn from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  | import s from '@/app/components/datasets/create/website/index.module.css' | 
					
						
							| 
									
										
										
										
											2024-06-17 03:06:32 -05:00
										 |  |  | import { fetchDataSources, removeDataSourceApiKeyBinding } from '@/service/datasets' | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  | import type { DataSourceItem } from '@/models/common' | 
					
						
							|  |  |  | import { DataSourceProvider } from '@/models/common' | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  | import { useAppContext } from '@/context/app-context' | 
					
						
							|  |  |  | import Toast from '@/app/components/base/toast' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  | type Props = { | 
					
						
							|  |  |  |   provider: DataSourceProvider | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  | const DataSourceWebsite: FC<Props> = ({ provider }) => { | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  |   const { isCurrentWorkspaceManager } = useAppContext() | 
					
						
							| 
									
										
										
										
											2024-06-17 03:06:32 -05:00
										 |  |  |   const [sources, setSources] = useState<DataSourceItem[]>([]) | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |   const checkSetApiKey = useCallback(async () => { | 
					
						
							| 
									
										
										
										
											2024-06-17 03:06:32 -05:00
										 |  |  |     const res = await fetchDataSources() as any | 
					
						
							|  |  |  |     const list = res.sources | 
					
						
							|  |  |  |     setSources(list) | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |   }, []) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     checkSetApiKey() | 
					
						
							|  |  |  |     // eslint-disable-next-line react-hooks/exhaustive-deps
 | 
					
						
							|  |  |  |   }, []) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |   const [configTarget, setConfigTarget] = useState<DataSourceProvider | null>(null) | 
					
						
							|  |  |  |   const showConfig = useCallback((provider: DataSourceProvider) => { | 
					
						
							|  |  |  |     setConfigTarget(provider) | 
					
						
							|  |  |  |   }, [setConfigTarget]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const hideConfig = useCallback(() => { | 
					
						
							|  |  |  |     setConfigTarget(null) | 
					
						
							|  |  |  |   }, [setConfigTarget]) | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const handleAdded = useCallback(() => { | 
					
						
							|  |  |  |     checkSetApiKey() | 
					
						
							|  |  |  |     hideConfig() | 
					
						
							|  |  |  |   }, [checkSetApiKey, hideConfig]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |   const getIdByProvider = (provider: DataSourceProvider): string | undefined => { | 
					
						
							| 
									
										
										
										
											2024-06-17 03:06:32 -05:00
										 |  |  |     const source = sources.find(item => item.provider === provider) | 
					
						
							|  |  |  |     return source?.id | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  |   const getProviderName = (provider: DataSourceProvider): string => { | 
					
						
							|  |  |  |     if (provider === DataSourceProvider.fireCrawl) | 
					
						
							|  |  |  |       return 'Firecrawl' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (provider === DataSourceProvider.waterCrawl) | 
					
						
							|  |  |  |       return 'WaterCrawl' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 'Jina Reader' | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |   const handleRemove = useCallback((provider: DataSourceProvider) => { | 
					
						
							| 
									
										
										
										
											2024-06-17 03:06:32 -05:00
										 |  |  |     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]) | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <> | 
					
						
							|  |  |  |       <Panel | 
					
						
							|  |  |  |         type={DataSourceType.website} | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |         provider={provider} | 
					
						
							|  |  |  |         isConfigured={sources.find(item => item.provider === provider) !== undefined} | 
					
						
							|  |  |  |         onConfigure={() => showConfig(provider)} | 
					
						
							| 
									
										
										
										
											2024-06-17 03:06:32 -05:00
										 |  |  |         readOnly={!isCurrentWorkspaceManager} | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |         configuredList={sources.filter(item => item.provider === provider).map(item => ({ | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |           id: item.id, | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  |           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> | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |               ) | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             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}/> | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |                 </div> | 
					
						
							|  |  |  |               ) | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             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), | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |           isActive: true, | 
					
						
							|  |  |  |         }))} | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |         onRemove={handleRemove(provider)} | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |       /> | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |       {configTarget === DataSourceProvider.fireCrawl && ( | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  |         <ConfigFirecrawlModal onSaved={handleAdded} onCancel={hideConfig}/> | 
					
						
							|  |  |  |       )} | 
					
						
							|  |  |  |       {configTarget === DataSourceProvider.waterCrawl && ( | 
					
						
							|  |  |  |         <ConfigWatercrawlModal onSaved={handleAdded} onCancel={hideConfig}/> | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |       )} | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |       {configTarget === DataSourceProvider.jinaReader && ( | 
					
						
							| 
									
										
										
										
											2025-04-07 06:43:23 +02:00
										 |  |  |         <ConfigJinaReaderModal onSaved={handleAdded} onCancel={hideConfig}/> | 
					
						
							| 
									
										
										
										
											2024-09-30 09:57:19 +08:00
										 |  |  |       )} | 
					
						
							| 
									
										
										
										
											2024-06-14 22:02:41 +08:00
										 |  |  |     </> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | export default React.memo(DataSourceWebsite) |