| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | 'use client' | 
					
						
							|  |  |  | import type { FC } from 'react' | 
					
						
							|  |  |  | import React from 'react' | 
					
						
							|  |  |  | import { useTranslation } from 'react-i18next' | 
					
						
							| 
									
										
										
										
											2024-08-26 13:00:02 +08:00
										 |  |  | import Tooltip from '@/app/components/base/tooltip' | 
					
						
							| 
									
										
										
										
											2024-07-09 15:05:40 +08:00
										 |  |  | import cn from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | import type { Credential } from '@/app/components/tools/types' | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  | import Input from '@/app/components/base/input' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | import Drawer from '@/app/components/base/drawer-plus' | 
					
						
							|  |  |  | import Button from '@/app/components/base/button' | 
					
						
							|  |  |  | import Radio from '@/app/components/base/radio/ui' | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  | import { AuthHeaderPrefix, AuthType } from '@/app/components/tools/types' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type Props = { | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |   positionCenter?: boolean | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   credential: Credential | 
					
						
							|  |  |  |   onChange: (credential: Credential) => void | 
					
						
							|  |  |  |   onHide: () => void | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ItemProps = { | 
					
						
							|  |  |  |   text: string | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |   value: AuthType | AuthHeaderPrefix | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   isChecked: boolean | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |   onClick: (value: AuthType | AuthHeaderPrefix) => void | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const SelectItem: FC<ItemProps> = ({ text, value, isChecked, onClick }) => { | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <div | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |       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')} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |       onClick={() => onClick(value)} | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <Radio isChecked={isChecked} /> | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |       <div className='system-sm-regular text-text-primary'>{text}</div> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ConfigCredential: FC<Props> = ({ | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |   positionCenter, | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   credential, | 
					
						
							|  |  |  |   onChange, | 
					
						
							|  |  |  |   onHide, | 
					
						
							|  |  |  | }) => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  |   const [tempCredential, setTempCredential] = React.useState<Credential>(credential) | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |   return ( | 
					
						
							|  |  |  |     <Drawer | 
					
						
							|  |  |  |       isShow | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |       positionCenter={positionCenter} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |       onHide={onHide} | 
					
						
							|  |  |  |       title={t('tools.createTool.authMethod.title')!} | 
					
						
							| 
									
										
										
										
											2025-04-22 09:59:14 +08:00
										 |  |  |       dialogClassName='z-[60]' | 
					
						
							|  |  |  |       dialogBackdropClassName='z-[70]' | 
					
						
							|  |  |  |       panelClassName='mt-2 !w-[520px] h-fit z-[80]' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |       maxWidthClassName='!max-w-[520px]' | 
					
						
							| 
									
										
										
										
											2024-06-07 20:59:39 +08:00
										 |  |  |       height={'fit-content'} | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |       headerClassName='!border-b-divider-regular' | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |       body={ | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         <div className='px-6 pt-2'> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |           <div className='space-y-4'> | 
					
						
							|  |  |  |             <div> | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |               <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.type')}</div> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |               <div className='flex space-x-3'> | 
					
						
							|  |  |  |                 <SelectItem | 
					
						
							|  |  |  |                   text={t('tools.createTool.authMethod.types.none')} | 
					
						
							|  |  |  |                   value={AuthType.none} | 
					
						
							|  |  |  |                   isChecked={tempCredential.auth_type === AuthType.none} | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |                   onClick={value => setTempCredential({ ...tempCredential, auth_type: value as AuthType })} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                 /> | 
					
						
							|  |  |  |                 <SelectItem | 
					
						
							|  |  |  |                   text={t('tools.createTool.authMethod.types.api_key')} | 
					
						
							|  |  |  |                   value={AuthType.apiKey} | 
					
						
							|  |  |  |                   isChecked={tempCredential.auth_type === AuthType.apiKey} | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |                   onClick={value => setTempCredential({ | 
					
						
							|  |  |  |                     ...tempCredential, | 
					
						
							|  |  |  |                     auth_type: value as AuthType, | 
					
						
							|  |  |  |                     api_key_header: tempCredential.api_key_header || 'Authorization', | 
					
						
							|  |  |  |                     api_key_value: tempCredential.api_key_value || '', | 
					
						
							|  |  |  |                     api_key_header_prefix: tempCredential.api_key_header_prefix || AuthHeaderPrefix.custom, | 
					
						
							|  |  |  |                   })} | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                 /> | 
					
						
							|  |  |  |               </div> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |             {tempCredential.auth_type === AuthType.apiKey && ( | 
					
						
							|  |  |  |               <> | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                 <div> | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |                   <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authHeaderPrefix.title')}</div> | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                   <div className='flex space-x-3'> | 
					
						
							|  |  |  |                     <SelectItem | 
					
						
							|  |  |  |                       text={t('tools.createTool.authHeaderPrefix.types.basic')} | 
					
						
							|  |  |  |                       value={AuthHeaderPrefix.basic} | 
					
						
							|  |  |  |                       isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.basic} | 
					
						
							|  |  |  |                       onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })} | 
					
						
							|  |  |  |                     /> | 
					
						
							|  |  |  |                     <SelectItem | 
					
						
							|  |  |  |                       text={t('tools.createTool.authHeaderPrefix.types.bearer')} | 
					
						
							|  |  |  |                       value={AuthHeaderPrefix.bearer} | 
					
						
							|  |  |  |                       isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.bearer} | 
					
						
							|  |  |  |                       onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })} | 
					
						
							|  |  |  |                     /> | 
					
						
							|  |  |  |                     <SelectItem | 
					
						
							|  |  |  |                       text={t('tools.createTool.authHeaderPrefix.types.custom')} | 
					
						
							|  |  |  |                       value={AuthHeaderPrefix.custom} | 
					
						
							|  |  |  |                       isChecked={tempCredential.api_key_header_prefix === AuthHeaderPrefix.custom} | 
					
						
							|  |  |  |                       onClick={value => setTempCredential({ ...tempCredential, api_key_header_prefix: value as AuthHeaderPrefix })} | 
					
						
							|  |  |  |                     /> | 
					
						
							|  |  |  |                   </div> | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |                 </div> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                 <div> | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |                   <div className='system-sm-medium flex items-center py-2 text-text-primary'> | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |                     {t('tools.createTool.authMethod.key')} | 
					
						
							|  |  |  |                     <Tooltip | 
					
						
							| 
									
										
										
										
											2024-08-26 13:00:02 +08:00
										 |  |  |                       popupContent={ | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                         <div className='w-[261px] text-text-tertiary'> | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |                           {t('tools.createTool.authMethod.keyTooltip')} | 
					
						
							|  |  |  |                         </div> | 
					
						
							|  |  |  |                       } | 
					
						
							| 
									
										
										
										
											2024-08-30 18:13:54 +08:00
										 |  |  |                       triggerClassName='ml-0.5 w-4 h-4' | 
					
						
							| 
									
										
										
										
											2024-08-26 13:00:02 +08:00
										 |  |  |                     /> | 
					
						
							| 
									
										
										
										
											2024-02-28 23:19:08 +08:00
										 |  |  |                   </div> | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                   <Input | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                     value={tempCredential.api_key_header} | 
					
						
							|  |  |  |                     onChange={e => setTempCredential({ ...tempCredential, api_key_header: e.target.value })} | 
					
						
							| 
									
										
										
										
											2024-02-23 13:55:43 +08:00
										 |  |  |                     placeholder={t('tools.createTool.authMethod.types.apiKeyPlaceholder')!} | 
					
						
							|  |  |  |                   /> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                 </div> | 
					
						
							|  |  |  |                 <div> | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |                   <div className='system-sm-medium py-2 text-text-primary'>{t('tools.createTool.authMethod.value')}</div> | 
					
						
							| 
									
										
										
										
											2025-02-17 17:05:13 +08:00
										 |  |  |                   <Input | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                     value={tempCredential.api_key_value} | 
					
						
							|  |  |  |                     onChange={e => setTempCredential({ ...tempCredential, api_key_value: e.target.value })} | 
					
						
							| 
									
										
										
										
											2024-02-23 13:55:43 +08:00
										 |  |  |                     placeholder={t('tools.createTool.authMethod.types.apiValuePlaceholder')!} | 
					
						
							|  |  |  |                   /> | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |                 </div> | 
					
						
							|  |  |  |               </>)} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |           <div className='mt-4 flex shrink-0 justify-end space-x-2 py-4'> | 
					
						
							| 
									
										
										
										
											2024-06-21 14:17:45 +08:00
										 |  |  |             <Button onClick={onHide}>{t('common.operation.cancel')}</Button> | 
					
						
							|  |  |  |             <Button variant='primary' onClick={() => { | 
					
						
							| 
									
										
										
										
											2024-01-23 19:31:56 +08:00
										 |  |  |               onChange(tempCredential) | 
					
						
							|  |  |  |               onHide() | 
					
						
							|  |  |  |             }}>{t('common.operation.save')}</Button> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     /> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | export default React.memo(ConfigCredential) |