index.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import type { FC } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import type {
  4. ModelProvider,
  5. } from '../declarations'
  6. import { ConfigurateMethodEnum } from '../declarations'
  7. import {
  8. DEFAULT_BACKGROUND_COLOR,
  9. modelTypeFormat,
  10. } from '../utils'
  11. import {
  12. useLanguage,
  13. } from '../hooks'
  14. import ModelBadge from '../model-badge'
  15. import ProviderIcon from '../provider-icon'
  16. import s from './index.module.css'
  17. import { Plus, Settings01 } from '@/app/components/base/icons/src/vender/line/general'
  18. import Button from '@/app/components/base/button'
  19. type ProviderCardProps = {
  20. provider: ModelProvider
  21. onOpenModal: (configurateMethod: ConfigurateMethodEnum) => void
  22. }
  23. const ProviderCard: FC<ProviderCardProps> = ({
  24. provider,
  25. onOpenModal,
  26. }) => {
  27. const { t } = useTranslation()
  28. const language = useLanguage()
  29. const configurateMethods = provider.configurate_methods.filter(method => method !== ConfigurateMethodEnum.fetchFromRemote)
  30. return (
  31. <div
  32. className='group relative flex flex-col justify-between px-4 py-3 h-[148px] border-[0.5px] border-black/5 rounded-xl shadow-xs hover:shadow-lg'
  33. style={{ background: provider.background || DEFAULT_BACKGROUND_COLOR }}
  34. >
  35. <div>
  36. <div className='py-0.5'>
  37. <ProviderIcon provider={provider} />
  38. </div>
  39. {
  40. provider.description && (
  41. <div className='mt-1 leading-4 text-xs text-black/[48]'>{provider.description[language] || provider.description.en_US}</div>
  42. )
  43. }
  44. </div>
  45. <div>
  46. <div className={'flex flex-wrap group-hover:hidden gap-0.5'}>
  47. {
  48. provider.supported_model_types.map(modelType => (
  49. <ModelBadge key={modelType}>
  50. {modelTypeFormat(modelType)}
  51. </ModelBadge>
  52. ))
  53. }
  54. </div>
  55. <div className={`hidden group-hover:grid grid-cols-${configurateMethods.length} gap-1`}>
  56. {
  57. configurateMethods.map((method) => {
  58. if (method === ConfigurateMethodEnum.predefinedModel) {
  59. return (
  60. <Button
  61. key={method}
  62. className={'h-7 bg-white text-xs text-gray-700 shrink-0'}
  63. onClick={() => onOpenModal(method)}
  64. >
  65. <Settings01 className={`mr-[5px] w-3.5 h-3.5 ${s.icon}`} />
  66. <span className='text-xs inline-flex items-center justify-center overflow-ellipsis shrink-0'>{t('common.operation.setup')}</span>
  67. </Button>
  68. )
  69. }
  70. return (
  71. <Button
  72. key={method}
  73. className='px-0 h-7 bg-white text-xs text-gray-700'
  74. onClick={() => onOpenModal(method)}
  75. >
  76. <Plus className='mr-[5px] w-3.5 h-3.5' />
  77. {t('common.modelProvider.addModel')}
  78. </Button>
  79. )
  80. })
  81. }
  82. </div>
  83. </div>
  84. </div>
  85. )
  86. }
  87. export default ProviderCard