add-credential-in-load-balancing.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {
  2. memo,
  3. useCallback,
  4. } from 'react'
  5. import { RiAddLine } from '@remixicon/react'
  6. import { useTranslation } from 'react-i18next'
  7. import { Authorized } from '@/app/components/header/account-setting/model-provider-page/model-auth'
  8. import cn from '@/utils/classnames'
  9. import type {
  10. Credential,
  11. CustomConfigurationModelFixedFields,
  12. CustomModelCredential,
  13. ModelCredential,
  14. ModelProvider,
  15. } from '@/app/components/header/account-setting/model-provider-page/declarations'
  16. import { ConfigurationMethodEnum, ModelModalModeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
  17. type AddCredentialInLoadBalancingProps = {
  18. provider: ModelProvider
  19. model: CustomModelCredential
  20. configurationMethod: ConfigurationMethodEnum
  21. currentCustomConfigurationModelFixedFields?: CustomConfigurationModelFixedFields
  22. modelCredential: ModelCredential
  23. onSelectCredential: (credential: Credential) => void
  24. onUpdate?: (payload?: any, formValues?: Record<string, any>) => void
  25. onRemove?: (credentialId: string) => void
  26. }
  27. const AddCredentialInLoadBalancing = ({
  28. provider,
  29. model,
  30. configurationMethod,
  31. modelCredential,
  32. onSelectCredential,
  33. onUpdate,
  34. onRemove,
  35. }: AddCredentialInLoadBalancingProps) => {
  36. const { t } = useTranslation()
  37. const {
  38. available_credentials,
  39. } = modelCredential
  40. const isCustomModel = configurationMethod === ConfigurationMethodEnum.customizableModel
  41. const notAllowCustomCredential = provider.allow_custom_token === false
  42. const handleUpdate = useCallback((payload?: any, formValues?: Record<string, any>) => {
  43. onUpdate?.(payload, formValues)
  44. }, [onUpdate])
  45. const renderTrigger = useCallback((open?: boolean) => {
  46. const Item = (
  47. <div className={cn(
  48. 'system-sm-medium flex h-8 items-center rounded-lg px-3 text-text-accent hover:bg-state-base-hover',
  49. open && 'bg-state-base-hover',
  50. )}>
  51. <RiAddLine className='mr-2 h-4 w-4' />
  52. {t('common.modelProvider.auth.addCredential')}
  53. </div>
  54. )
  55. return Item
  56. }, [t, isCustomModel])
  57. return (
  58. <Authorized
  59. provider={provider}
  60. renderTrigger={renderTrigger}
  61. authParams={{
  62. isModelCredential: isCustomModel,
  63. mode: ModelModalModeEnum.configModelCredential,
  64. onUpdate: handleUpdate,
  65. onRemove,
  66. }}
  67. triggerOnlyOpenModal={!available_credentials?.length && !notAllowCustomCredential}
  68. items={[
  69. {
  70. title: isCustomModel ? '' : t('common.modelProvider.auth.apiKeys'),
  71. model: isCustomModel ? model : undefined,
  72. credentials: available_credentials ?? [],
  73. },
  74. ]}
  75. showModelTitle={!isCustomModel}
  76. configurationMethod={configurationMethod}
  77. currentCustomConfigurationModelFixedFields={isCustomModel ? {
  78. __model_name: model.model,
  79. __model_type: model.model_type,
  80. } : undefined}
  81. onItemClick={onSelectCredential}
  82. placement='bottom-start'
  83. popupTitle={isCustomModel ? t('common.modelProvider.auth.modelCredentials') : ''}
  84. />
  85. )
  86. }
  87. export default memo(AddCredentialInLoadBalancing)