dify-run
/
web
/app
/components
/header
/account-setting
/model-provider-page
/provider-card
/index.tsx
import type { FC } from 'react' | |
import { useTranslation } from 'react-i18next' | |
import { | |
RiAddLine, | |
} from '@remixicon/react' | |
import type { | |
ModelProvider, | |
} from '../declarations' | |
import { ConfigurationMethodEnum } from '../declarations' | |
import { | |
DEFAULT_BACKGROUND_COLOR, | |
modelTypeFormat, | |
} from '../utils' | |
import { | |
useLanguage, | |
} from '../hooks' | |
import ModelBadge from '../model-badge' | |
import ProviderIcon from '../provider-icon' | |
import s from './index.module.css' | |
import { Settings01 } from '@/app/components/base/icons/src/vender/line/general' | |
import Button from '@/app/components/base/button' | |
import { useAppContext } from '@/context/app-context' | |
type ProviderCardProps = { | |
provider: ModelProvider | |
onOpenModal: (configurateMethod: ConfigurationMethodEnum) => void | |
} | |
const ProviderCard: FC<ProviderCardProps> = ({ | |
provider, | |
onOpenModal, | |
}) => { | |
const { t } = useTranslation() | |
const language = useLanguage() | |
const { isCurrentWorkspaceManager } = useAppContext() | |
const configurateMethods = provider.configurate_methods.filter(method => method !== ConfigurationMethodEnum.fetchFromRemote) | |
return ( | |
<div | |
className='group relative flex flex-col px-4 py-3 h-[148px] border-[0.5px] border-black/5 rounded-xl shadow-xs hover:shadow-lg' | |
style={{ background: provider.background || DEFAULT_BACKGROUND_COLOR }} | |
> | |
<div className='grow h-0'> | |
<div className='py-0.5'> | |
<ProviderIcon provider={provider} /> | |
</div> | |
{ | |
provider.description && ( | |
<div | |
className='mt-1 leading-4 text-xs text-black/[48] line-clamp-4' | |
title={provider.description[language] || provider.description.en_US} | |
> | |
{provider.description[language] || provider.description.en_US} | |
</div> | |
) | |
} | |
</div> | |
<div className='shrink-0'> | |
<div className={'flex flex-wrap group-hover:hidden gap-0.5'}> | |
{ | |
provider.supported_model_types.map(modelType => ( | |
<ModelBadge key={modelType}> | |
{modelTypeFormat(modelType)} | |
</ModelBadge> | |
)) | |
} | |
</div> | |
<div className={`hidden group-hover:grid grid-cols-${configurateMethods.length} gap-1`}> | |
{ | |
configurateMethods.map((method) => { | |
if (method === ConfigurationMethodEnum.predefinedModel) { | |
return ( | |
<Button | |
key={method} | |
className={'h-7 text-xs shrink-0'} | |
onClick={() => onOpenModal(method)} | |
disabled={!isCurrentWorkspaceManager} | |
> | |
<Settings01 className={`mr-[5px] w-3.5 h-3.5 ${s.icon}`} /> | |
<span className='text-xs inline-flex items-center justify-center overflow-ellipsis shrink-0'>{t('common.operation.setup')}</span> | |
</Button> | |
) | |
} | |
return ( | |
<Button | |
key={method} | |
className='px-0 h-7 text-xs' | |
onClick={() => onOpenModal(method)} | |
disabled={!isCurrentWorkspaceManager} | |
> | |
<RiAddLine className='mr-[5px] w-3.5 h-3.5' /> | |
{t('common.modelProvider.addModel')} | |
</Button> | |
) | |
}) | |
} | |
</div> | |
</div> | |
</div> | |
) | |
} | |
export default ProviderCard | |