|
'use client' |
|
import type { FC } from 'react' |
|
import React from 'react' |
|
import { useTranslation } from 'react-i18next' |
|
import { PlusIcon } from '@heroicons/react/24/solid' |
|
import type { ConfigItemType } from './config-item' |
|
import ConfigItem from './config-item' |
|
|
|
import s from './style.module.css' |
|
import { DataSourceType } from './types' |
|
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 |
|
|
|
return ( |
|
<div className='mb-2 border-[0.5px] border-gray-200 bg-gray-50 rounded-xl'> |
|
<div className='flex items-center px-3 py-[9px]'> |
|
<div className={cn(s[`${type}-icon`], 'w-8 h-8 mr-3 border border-gray-100 rounded-lg')} /> |
|
<div className='grow'> |
|
<div className='flex items-center h-5'> |
|
<div className='text-sm font-medium text-gray-800'>{t(`common.dataSource.${type}.title`)}</div> |
|
{isWebsite && ( |
|
<div className='ml-1 leading-[18px] px-1.5 rounded-md bg-white border border-gray-100 text-xs font-medium text-gray-700'> |
|
<span className='text-gray-500'>{t('common.dataSource.website.with')}</span> { provider === DataSourceProvider.fireCrawl ? '🔥 Firecrawl' : 'Jina Reader'} |
|
</div> |
|
)} |
|
</div> |
|
{ |
|
!isConfigured && ( |
|
<div className='leading-5 text-xs text-gray-500'> |
|
{t(`common.dataSource.${type}.description`)} |
|
</div> |
|
) |
|
} |
|
</div> |
|
{isNotion && ( |
|
<> |
|
{ |
|
isConfigured |
|
? ( |
|
<div |
|
className={ |
|
`flex items-center ml-3 px-3 h-7 bg-white border border-gray-200 |
|
rounded-md text-xs font-medium text-gray-700 |
|
${!readOnly ? 'cursor-pointer' : 'grayscale opacity-50 cursor-default'}` |
|
} |
|
onClick={onConfigure} |
|
> |
|
{t('common.dataSource.configure')} |
|
</div> |
|
) |
|
: ( |
|
<> |
|
{isSupportList && <div |
|
className={ |
|
`flex items-center px-3 py-1 min-h-7 bg-white border-[0.5px] border-gray-200 text-xs font-medium text-primary-600 rounded-md |
|
${!readOnly ? 'cursor-pointer' : 'grayscale opacity-50 cursor-default'}` |
|
} |
|
onClick={onConfigure} |
|
> |
|
<PlusIcon className='w-[14px] h-[14px] mr-[5px]' /> |
|
{t('common.dataSource.notion.addWorkspace')} |
|
</div>} |
|
</> |
|
) |
|
} |
|
</> |
|
)} |
|
|
|
{isWebsite && !isConfigured && ( |
|
<div |
|
className={ |
|
`flex items-center ml-3 px-3 h-7 bg-white border border-gray-200 |
|
rounded-md text-xs font-medium text-gray-700 |
|
${!readOnly ? 'cursor-pointer' : 'grayscale opacity-50 cursor-default'}` |
|
} |
|
onClick={!readOnly ? onConfigure : undefined} |
|
> |
|
{t('common.dataSource.configure')} |
|
</div> |
|
)} |
|
|
|
</div> |
|
{ |
|
isConfigured && ( |
|
<> |
|
<div className='flex items-center px-3 h-[18px]'> |
|
<div className='text-xs font-medium text-gray-500'> |
|
{isNotion ? t('common.dataSource.notion.connectedWorkspace') : t('common.dataSource.website.configuredCrawlers')} |
|
</div> |
|
<div className='grow ml-3 border-t border-t-gray-100' /> |
|
</div> |
|
<div className='px-3 pt-2 pb-3'> |
|
{ |
|
configuredList.map(item => ( |
|
<ConfigItem |
|
key={item.id} |
|
type={type} |
|
payload={item} |
|
onRemove={onRemove} |
|
notionActions={notionActions} |
|
readOnly={readOnly} |
|
/> |
|
)) |
|
} |
|
</div> |
|
</> |
|
) |
|
} |
|
</div> |
|
) |
|
} |
|
export default React.memo(Panel) |
|
|