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 | |