123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- 'use client'
- import type { FC } from 'react'
- import React from 'react'
- import { useTranslation } from 'react-i18next'
- import Tooltip from '@/app/components/base/tooltip'
- import cn from '@/utils/classnames'
- import type { Credential } from '@/app/components/tools/types'
- import Drawer from '@/app/components/base/drawer-plus'
- import Button from '@/app/components/base/button'
- import Radio from '@/app/components/base/radio/ui'
- import { AuthHeaderPrefix, AuthType } from '@/app/components/tools/types'
- type Props = {
- positionCenter?: boolean
- credential: Credential
- onChange: (credential: Credential) => void
- onHide: () => void
- }
- const keyClassNames = 'py-2 leading-5 text-sm font-medium text-gray-900'
- type ItemProps = {
- text: string
- value: AuthType | AuthHeaderPrefix
- isChecked: boolean
- onClick: (value: AuthType | AuthHeaderPrefix) => void
- }
- const SelectItem: FC<ItemProps> = ({ text, value, isChecked, onClick }) => {
- return (
- <div
- className={cn(isChecked ? 'border-[2px] border-indigo-600 shadow-sm bg-white' : 'border border-gray-100', 'mb-2 flex items-center h-9 pl-3 w-[150px] rounded-xl bg-gray-25 hover:bg-gray-50 cursor-pointer space-x-2')}
- onClick={() => onClick(value)}
- >
- <Radio isChecked={isChecked} />
- <div className='text-sm font-normal text-gray-900'>{text}</div>
- </div>
- )
- }
- const ConfigCredential: FC<Props> = ({
- positionCenter,
- credential,
- onChange,
- onHide,
- }) => {
- const { t } = useTranslation()
- const [tempCredential, setTempCredential] = React.useState<Credential>(credential)
- return (
- <Drawer
- isShow
- positionCenter={positionCenter}
- onHide={onHide}
- title={t('tools.createTool.authMethod.title')!}
- panelClassName='mt-2 !w-[520px] h-fit'
- maxWidthClassName='!max-w-[520px]'
- height={'fit-content'}
- headerClassName='!border-b-black/5'
- body={
- <div className='pt-2 px-6'>
- <div className='space-y-4'>
- <div>
- <div className={keyClassNames}>{t('tools.createTool.authMethod.type')}</div>
- <div className='flex space-x-3'>
- <SelectItem
- text={t('tools.createTool.authMethod.types.none')}
- value={AuthType.none}
- isChecked={tempCredential.auth_type === AuthType.none}
- onClick={value => setTempCredential({ ...tempCredential, auth_type: value as AuthType })}
- />
- <SelectItem
- text={t('tools.createTool.authMethod.types.api_key')}
- value={AuthType.apiKey}
- isChecked={tempCredential.auth_type === AuthType.apiKey}
- 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,
- })}
- />
- </div>
- </div>
- {tempCredential.auth_type === AuthType.apiKey && (
- <>
- <div className={keyClassNames}>{t('tools.createTool.authHeaderPrefix.title')}</div>
- <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>
- <div>
- <div className='flex items-center h-8 text-[13px] font-medium text-gray-900'>
- {t('tools.createTool.authMethod.key')}
- <Tooltip
- popupContent={
- <div className='w-[261px] text-gray-500'>
- {t('tools.createTool.authMethod.keyTooltip')}
- </div>
- }
- triggerClassName='ml-0.5 w-4 h-4'
- />
- </div>
- <input
- value={tempCredential.api_key_header}
- onChange={e => setTempCredential({ ...tempCredential, api_key_header: e.target.value })}
- className='w-full h-10 px-3 text-sm font-normal border border-transparent bg-gray-100 rounded-lg grow outline-none focus:bg-components-input-bg-active focus:border-components-input-border-active focus:shadow-xs'
- placeholder={t('tools.createTool.authMethod.types.apiKeyPlaceholder')!}
- />
- </div>
- <div>
- <div className={keyClassNames}>{t('tools.createTool.authMethod.value')}</div>
- <input
- value={tempCredential.api_key_value}
- onChange={e => setTempCredential({ ...tempCredential, api_key_value: e.target.value })}
- className='w-full h-10 px-3 text-sm font-normal border border-transparent bg-gray-100 rounded-lg grow outline-none focus:bg-components-input-bg-active focus:border-components-input-border-active focus:shadow-xs'
- placeholder={t('tools.createTool.authMethod.types.apiValuePlaceholder')!}
- />
- </div>
- </>)}
- </div>
- <div className='mt-4 shrink-0 flex justify-end space-x-2 py-4'>
- <Button onClick={onHide}>{t('common.operation.cancel')}</Button>
- <Button variant='primary' onClick={() => {
- onChange(tempCredential)
- onHide()
- }}>{t('common.operation.save')}</Button>
- </div>
- </div>
- }
- />
- )
- }
- export default React.memo(ConfigCredential)
|