popup-item.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import type { FC } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import type {
  4. DefaultModel,
  5. Model,
  6. ModelItem,
  7. } from '../declarations'
  8. import {
  9. useLanguage,
  10. useUpdateModelList,
  11. useUpdateModelProvidersAndModelList,
  12. } from '../hooks'
  13. import ModelIcon from '../model-icon'
  14. import ModelName from '../model-name'
  15. import {
  16. ConfigurateMethodEnum,
  17. MODEL_STATUS_TEXT,
  18. ModelStatusEnum,
  19. ModelTypeEnum,
  20. } from '../declarations'
  21. import { Check } from '@/app/components/base/icons/src/vender/line/general'
  22. import { useModalContext } from '@/context/modal-context'
  23. import { useProviderContext } from '@/context/provider-context'
  24. import Tooltip from '@/app/components/base/tooltip'
  25. type PopupItemProps = {
  26. defaultModel?: DefaultModel
  27. model: Model
  28. onSelect: (provider: string, model: ModelItem) => void
  29. }
  30. const PopupItem: FC<PopupItemProps> = ({
  31. defaultModel,
  32. model,
  33. onSelect,
  34. }) => {
  35. const { t } = useTranslation()
  36. const language = useLanguage()
  37. const { setShowModelModal } = useModalContext()
  38. const { modelProviders } = useProviderContext()
  39. const updateModelList = useUpdateModelList()
  40. const updateModelProvidersAndModelList = useUpdateModelProvidersAndModelList()
  41. const currentProvider = modelProviders.find(provider => provider.provider === model.provider)!
  42. const handleSelect = (provider: string, modelItem: ModelItem) => {
  43. if (modelItem.status !== ModelStatusEnum.active)
  44. return
  45. onSelect(provider, modelItem)
  46. }
  47. const handleOpenModelModal = () => {
  48. setShowModelModal({
  49. payload: {
  50. currentProvider,
  51. currentConfigurateMethod: ConfigurateMethodEnum.predefinedModel,
  52. },
  53. onSaveCallback: () => {
  54. updateModelProvidersAndModelList()
  55. const modelType = model.models[0].model_type
  56. if (modelType !== ModelTypeEnum.textGeneration)
  57. updateModelList(modelType)
  58. },
  59. })
  60. }
  61. return (
  62. <div className='mb-1'>
  63. <div className='flex items-center px-3 h-[22px] text-xs font-medium text-gray-500'>
  64. {model.label[language]}
  65. </div>
  66. {
  67. model.models.map(modelItem => (
  68. <Tooltip
  69. selector={`${modelItem.model}-${modelItem.status}`}
  70. key={modelItem.model}
  71. content={modelItem.status !== ModelStatusEnum.active ? MODEL_STATUS_TEXT[modelItem.status][language] : undefined}
  72. position='right'
  73. >
  74. <div
  75. key={modelItem.model}
  76. className={`
  77. group relative flex items-center px-3 py-1.5 h-8 rounded-lg
  78. ${modelItem.status === ModelStatusEnum.active ? 'cursor-pointer hover:bg-gray-50' : 'cursor-not-allowed hover:bg-gray-50/60'}
  79. `}
  80. onClick={() => handleSelect(model.provider, modelItem)}
  81. >
  82. <ModelIcon
  83. className={`
  84. shrink-0 mr-2 w-4 h-4
  85. ${modelItem.status !== ModelStatusEnum.active && 'opacity-60'}
  86. `}
  87. provider={model}
  88. modelName={modelItem.model}
  89. />
  90. <ModelName
  91. className={`
  92. grow text-sm font-normal text-gray-900
  93. ${modelItem.status !== ModelStatusEnum.active && 'opacity-60'}
  94. `}
  95. modelItem={modelItem}
  96. showMode
  97. showFeatures
  98. />
  99. {
  100. defaultModel?.model === modelItem.model && defaultModel.provider === currentProvider.provider && (
  101. <Check className='shrink-0 w-4 h-4 text-primary-600' />
  102. )
  103. }
  104. {
  105. modelItem.status === ModelStatusEnum.noConfigure && (
  106. <div
  107. className='hidden group-hover:block text-xs font-medium text-primary-600 cursor-pointer'
  108. onClick={handleOpenModelModal}
  109. >
  110. {t('common.operation.add').toLocaleUpperCase()}
  111. </div>
  112. )
  113. }
  114. </div>
  115. </Tooltip>
  116. ))
  117. }
  118. </div>
  119. )
  120. }
  121. export default PopupItem