mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-30 18:33:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 'use client'
 | |
| import type { FC } from 'react'
 | |
| import React from 'react'
 | |
| import { useTranslation } from 'react-i18next'
 | |
| import { RiAddLine } from '@remixicon/react'
 | |
| import type { ConfigItemType } from './config-item'
 | |
| import ConfigItem from './config-item'
 | |
| 
 | |
| import s from './style.module.css'
 | |
| import { DataSourceType } from './types'
 | |
| import Button from '@/app/components/base/button'
 | |
| import { DataSourceProvider } from '@/models/common'
 | |
| import cn from '@/utils/classnames'
 | |
| 
 | |
| type Props = {
 | |
|   type: DataSourceType
 | |
|   provider?: DataSourceProvider
 | |
|   isConfigured: boolean
 | |
|   onConfigure: () => void
 | |
|   readOnly: boolean
 | |
|   isSupportList?: boolean
 | |
|   configuredList: ConfigItemType[]
 | |
|   onRemove: () => void
 | |
|   notionActions?: {
 | |
|     onChangeAuthorizedPage: () => void
 | |
|   }
 | |
| }
 | |
| 
 | |
| const Panel: FC<Props> = ({
 | |
|   type,
 | |
|   provider,
 | |
|   isConfigured,
 | |
|   onConfigure,
 | |
|   readOnly,
 | |
|   configuredList,
 | |
|   isSupportList,
 | |
|   onRemove,
 | |
|   notionActions,
 | |
| }) => {
 | |
|   const { t } = useTranslation()
 | |
|   const isNotion = type === DataSourceType.notion
 | |
|   const isWebsite = type === DataSourceType.website
 | |
| 
 | |
|   const getProviderName = (): string => {
 | |
|     if (provider === DataSourceProvider.fireCrawl) return '🔥 Firecrawl'
 | |
|     if (provider === DataSourceProvider.waterCrawl) return 'WaterCrawl'
 | |
|     return 'Jina Reader'
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     <div className='mb-2 rounded-xl bg-background-section-burn'>
 | |
|       <div className='flex items-center px-3 py-[9px]'>
 | |
|         <div className={cn(s[`${type}-icon`], 'mr-3 h-8 w-8 rounded-lg border border-divider-subtle !bg-background-default')} />
 | |
|         <div className='grow'>
 | |
|           <div className='flex h-5 items-center'>
 | |
|             <div className='text-sm font-medium text-text-primary'>{t(`common.dataSource.${type}.title`)}</div>
 | |
|             {isWebsite && (
 | |
|               <div className='ml-1 rounded-md bg-components-badge-white-to-dark px-1.5 text-xs font-medium leading-[18px] text-text-secondary'>
 | |
|                 <span className='text-text-tertiary'>{t('common.dataSource.website.with')}</span> {getProviderName()}
 | |
|               </div>
 | |
|             )}
 | |
|           </div>
 | |
|           {
 | |
|             !isConfigured && (
 | |
|               <div className='system-xs-medium text-text-tertiary'>
 | |
|                 {t(`common.dataSource.${type}.description`)}
 | |
|               </div>
 | |
|             )
 | |
|           }
 | |
|         </div>
 | |
|         {isNotion && (
 | |
|           <>
 | |
|             {
 | |
|               isConfigured
 | |
|                 ? (
 | |
|                   <Button
 | |
|                     disabled={readOnly}
 | |
|                     className='ml-3'
 | |
|                     onClick={onConfigure}
 | |
|                   >
 | |
|                     {t('common.dataSource.configure')}
 | |
|                   </Button>
 | |
|                 )
 | |
|                 : (
 | |
|                   <>
 | |
|                     {isSupportList && <div
 | |
|                       className={
 | |
|                         `system-sm-medium flex min-h-7 items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 py-1 text-components-button-secondary-accent-text
 | |
|                   ${!readOnly ? 'cursor-pointer' : 'cursor-default opacity-50 grayscale'}`
 | |
|                       }
 | |
|                       onClick={onConfigure}
 | |
|                     >
 | |
|                       <RiAddLine className='mr-[5px] h-4 w-4 text-components-button-secondary-accent-text' />
 | |
|                       {t('common.dataSource.connect')}
 | |
|                     </div>}
 | |
|                   </>
 | |
|                 )
 | |
|             }
 | |
|           </>
 | |
|         )}
 | |
| 
 | |
|         {isWebsite && !isConfigured && (
 | |
|           <div
 | |
|             className={
 | |
|               `ml-3 flex h-7 items-center rounded-md border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg
 | |
|               px-3 text-xs font-medium text-components-button-secondary-accent-text
 | |
|               ${!readOnly ? 'cursor-pointer' : 'cursor-default opacity-50 grayscale'}`
 | |
|             }
 | |
|             onClick={!readOnly ? onConfigure : undefined}
 | |
|           >
 | |
|             {t('common.dataSource.configure')}
 | |
|           </div>
 | |
|         )}
 | |
| 
 | |
|       </div>
 | |
|       {
 | |
|         isConfigured && (
 | |
|           <>
 | |
|             <div className='flex h-[18px] items-center px-3'>
 | |
|               <div className='system-xs-medium text-text-tertiary'>
 | |
|                 {isNotion ? t('common.dataSource.notion.connectedWorkspace') : t('common.dataSource.website.configuredCrawlers')}
 | |
|               </div>
 | |
|               <div className='ml-3 grow border-t border-t-divider-subtle' />
 | |
|             </div>
 | |
|             <div className='px-3 pb-3 pt-2'>
 | |
|               {
 | |
|                 configuredList.map(item => (
 | |
|                   <ConfigItem
 | |
|                     key={item.id}
 | |
|                     type={type}
 | |
|                     payload={item}
 | |
|                     onRemove={onRemove}
 | |
|                     notionActions={notionActions}
 | |
|                     readOnly={readOnly}
 | |
|                   />
 | |
|                 ))
 | |
|               }
 | |
|             </div>
 | |
|           </>
 | |
|         )
 | |
|       }
 | |
|     </div>
 | |
|   )
 | |
| }
 | |
| export default React.memo(Panel)
 | 
