Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

config-credentials.tsx 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import { useTranslation } from 'react-i18next'
  5. import Tooltip from '@/app/components/base/tooltip'
  6. import cn from '@/utils/classnames'
  7. import type { Credential } from '@/app/components/tools/types'
  8. import Input from '@/app/components/base/input'
  9. import Drawer from '@/app/components/base/drawer-plus'
  10. import Button from '@/app/components/base/button'
  11. import Radio from '@/app/components/base/radio/ui'
  12. import { AuthHeaderPrefix, AuthType } from '@/app/components/tools/types'
  13. type Props = {
  14. positionCenter?: boolean
  15. credential: Credential
  16. onChange: (credential: Credential) => void
  17. onHide: () => void
  18. }
  19. type ItemProps = {
  20. text: string
  21. value: AuthType | AuthHeaderPrefix
  22. isChecked: boolean
  23. onClick: (value: AuthType | AuthHeaderPrefix) => void
  24. }
  25. const SelectItem: FC<ItemProps> = ({ text, value, isChecked, onClick }) => {
  26. return (
  27. <div
  28. className={cn(isChecked ? 'border-[2px] border-util-colors-indigo-indigo-600 bg-components-panel-on-panel-item-bg shadow-sm' : 'border border-components-card-border', 'mb-2 flex h-9 w-[150px] cursor-pointer items-center space-x-2 rounded-xl bg-components-panel-on-panel-item-bg pl-3 hover:bg-components-panel-on-panel-item-bg-hover')}
  29. onClick={() => onClick(value)}
  30. >
  31. <Radio isChecked={isChecked} />
  32. <div className='system-sm-regular text-text-primary'>{text}</div>
  33. </div>
  34. )
  35. }
  36. const ConfigCredential: FC<Props> = ({
  37. positionCenter,
  38. credential,
  39. onChange,
  40. onHide,
  41. }) => {
  42. const { t } = useTranslation()
  43. const [tempCredential, setTempCredential] = React.useState<Credential>(credential)
  44. return (
  45. <Drawer
  46. isShow
  47. positionCenter={positionCenter}
  48. onHide={onHide}
  49. title={t('tools.createTool.authMethod.title')!}
  50. dialogClassName='z-[60]'
  51. dialogBackdropClassName='z-[70]'
  52. panelClassName='mt-2 !w-[520px] h-fit z-[80]'
  53. maxWidthClassName='!max-w-[520px]'
  54. height={'fit-content'}
  55. headerClassName='!border-b-divider-regular'
  56. body={
  57. <div className='px-6 pt-2'>
  58. <div className='space-y-4'>
  59. <div>
  60. <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.type')}</div>
  61. <div className='flex space-x-3'>
  62. <SelectItem
  63. text={t('tools.createTool.authMethod.types.none')}
  64. value={AuthType.none}
  65. isChecked={tempCredential.auth_type === AuthType.none}
  66. onClick={value => setTempCredential({
  67. auth_type: value as AuthType,
  68. })}
  69. />
  70. <SelectItem
  71. text={t('tools.createTool.authMethod.types.api_key_header')}
  72. value={AuthType.apiKeyHeader}
  73. isChecked={tempCredential.auth_type === AuthType.apiKeyHeader}
  74. onClick={value => setTempCredential({
  75. auth_type: value as AuthType,
  76. api_key_header: tempCredential.api_key_header || 'Authorization',
  77. api_key_value: tempCredential.api_key_value || '',
  78. api_key_header_prefix: tempCredential.api_key_header_prefix || AuthHeaderPrefix.custom,
  79. })}
  80. />
  81. <SelectItem
  82. text={t('tools.createTool.authMethod.types.api_key_query')}
  83. value={AuthType.apiKeyQuery}
  84. isChecked={tempCredential.auth_type === AuthType.apiKeyQuery}
  85. onClick={value => setTempCredential({
  86. auth_type: value as AuthType,
  87. api_key_query_param: tempCredential.api_key_query_param || 'key',
  88. api_key_value: tempCredential.api_key_value || '',
  89. })}
  90. />
  91. </div>
  92. </div>
  93. {tempCredential.auth_type === AuthType.apiKeyHeader && (
  94. <>
  95. <div>
  96. <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authHeaderPrefix.title')}</div>
  97. <div className='flex space-x-3'>
  98. <SelectItem
  99. text={t('tools.createTool.authHeaderPrefix.types.basic')}
  100. value={AuthHeaderPrefix.basic}
  101. isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.basic}
  102. onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })}
  103. />
  104. <SelectItem
  105. text={t('tools.createTool.authHeaderPrefix.types.bearer')}
  106. value={AuthHeaderPrefix.bearer}
  107. isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.bearer}
  108. onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })}
  109. />
  110. <SelectItem
  111. text={t('tools.createTool.authHeaderPrefix.types.custom')}
  112. value={AuthHeaderPrefix.custom}
  113. isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.custom}
  114. onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })}
  115. />
  116. </div>
  117. </div>
  118. <div>
  119. <div className='system-sm-medium flex items-center py-2 text-text-primary'>
  120. {t('tools.createTool.authMethod.key')}
  121. <Tooltip
  122. popupContent={
  123. <div className='w-[261px] text-text-tertiary'>
  124. {t('tools.createTool.authMethod.keyTooltip')}
  125. </div>
  126. }
  127. triggerClassName='ml-0.5 w-4 h-4'
  128. />
  129. </div>
  130. <Input
  131. value={tempCredential.api_key_header}
  132. onChange={e => setTempCredential({ ...tempCredential, api_key_header: e.target.value })}
  133. placeholder={t('tools.createTool.authMethod.types.apiKeyPlaceholder')!}
  134. />
  135. </div>
  136. <div>
  137. <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.value')}</div>
  138. <Input
  139. value={tempCredential.api_key_value}
  140. onChange={e => setTempCredential({ ...tempCredential, api_key_value: e.target.value })}
  141. placeholder={t('tools.createTool.authMethod.types.apiValuePlaceholder')!}
  142. />
  143. </div>
  144. </>)}
  145. {tempCredential.auth_type === AuthType.apiKeyQuery && (
  146. <>
  147. <div>
  148. <div className='system-sm-medium flex items-center py-2 text-text-primary'>
  149. {t('tools.createTool.authMethod.queryParam')}
  150. <Tooltip
  151. popupContent={
  152. <div className='w-[261px] text-text-tertiary'>
  153. {t('tools.createTool.authMethod.queryParamTooltip')}
  154. </div>
  155. }
  156. triggerClassName='ml-0.5 w-4 h-4'
  157. />
  158. </div>
  159. <Input
  160. value={tempCredential.api_key_query_param}
  161. onChange={e => setTempCredential({ ...tempCredential, api_key_query_param: e.target.value })}
  162. placeholder={t('tools.createTool.authMethod.types.queryParamPlaceholder')!}
  163. />
  164. </div>
  165. <div>
  166. <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.value')}</div>
  167. <Input
  168. value={tempCredential.api_key_value}
  169. onChange={e => setTempCredential({ ...tempCredential, api_key_value: e.target.value })}
  170. placeholder={t('tools.createTool.authMethod.types.apiValuePlaceholder')!}
  171. />
  172. </div>
  173. </>)}
  174. </div>
  175. <div className='mt-4 flex shrink-0 justify-end space-x-2 py-4'>
  176. <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
  177. <Button variant='primary' onClick={() => {
  178. onChange(tempCredential)
  179. onHide()
  180. }}>{t('common.operation.save')}</Button>
  181. </div>
  182. </div>
  183. }
  184. />
  185. )
  186. }
  187. export default React.memo(ConfigCredential)