| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import {
- memo,
- useCallback,
- useMemo,
- useRef,
- useState,
- } from 'react'
- import { useTranslation } from 'react-i18next'
- import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security'
- import Modal from '@/app/components/base/modal/modal'
- import { CredentialTypeEnum } from '../types'
- import AuthForm from '@/app/components/base/form/form-scenarios/auth'
- import type { FormRefObject } from '@/app/components/base/form/types'
- import { FormTypeEnum } from '@/app/components/base/form/types'
- import { useToastContext } from '@/app/components/base/toast'
- import Loading from '@/app/components/base/loading'
- import type { PluginPayload } from '../types'
- import {
- useAddPluginCredentialHook,
- useGetPluginCredentialSchemaHook,
- useUpdatePluginCredentialHook,
- } from '../hooks/use-credential'
-
- export type ApiKeyModalProps = {
- pluginPayload: PluginPayload
- onClose?: () => void
- editValues?: Record<string, any>
- onRemove?: () => void
- disabled?: boolean
- onUpdate?: () => void
- }
- const ApiKeyModal = ({
- pluginPayload,
- onClose,
- editValues,
- onRemove,
- disabled,
- onUpdate,
- }: ApiKeyModalProps) => {
- const { t } = useTranslation()
- const { notify } = useToastContext()
- const [doingAction, setDoingAction] = useState(false)
- const doingActionRef = useRef(doingAction)
- const handleSetDoingAction = useCallback((value: boolean) => {
- doingActionRef.current = value
- setDoingAction(value)
- }, [])
- const { data = [], isLoading } = useGetPluginCredentialSchemaHook(pluginPayload, CredentialTypeEnum.API_KEY)
- const formSchemas = useMemo(() => {
- return [
- {
- type: FormTypeEnum.textInput,
- name: '__name__',
- label: t('plugin.auth.authorizationName'),
- required: false,
- },
- ...data,
- ]
- }, [data, t])
- const defaultValues = formSchemas.reduce((acc, schema) => {
- if (schema.default)
- acc[schema.name] = schema.default
- return acc
- }, {} as Record<string, any>)
- const { mutateAsync: addPluginCredential } = useAddPluginCredentialHook(pluginPayload)
- const { mutateAsync: updatePluginCredential } = useUpdatePluginCredentialHook(pluginPayload)
- const formRef = useRef<FormRefObject>(null)
- const handleConfirm = useCallback(async () => {
- if (doingActionRef.current)
- return
- const {
- isCheckValidated,
- values,
- } = formRef.current?.getFormValues({
- needCheckValidatedValues: true,
- needTransformWhenSecretFieldIsPristine: true,
- }) || { isCheckValidated: false, values: {} }
- if (!isCheckValidated)
- return
-
- try {
- const {
- __name__,
- __credential_id__,
- ...restValues
- } = values
-
- handleSetDoingAction(true)
- if (editValues) {
- await updatePluginCredential({
- credentials: restValues,
- credential_id: __credential_id__,
- name: __name__ || '',
- })
- }
- else {
- await addPluginCredential({
- credentials: restValues,
- type: CredentialTypeEnum.API_KEY,
- name: __name__ || '',
- })
- }
- notify({
- type: 'success',
- message: t('common.api.actionSuccess'),
- })
-
- onClose?.()
- onUpdate?.()
- }
- finally {
- handleSetDoingAction(false)
- }
- }, [addPluginCredential, onClose, onUpdate, updatePluginCredential, notify, t, editValues, handleSetDoingAction])
-
- return (
- <Modal
- size='md'
- title={t('plugin.auth.useApiAuth')}
- subTitle={t('plugin.auth.useApiAuthDesc')}
- onClose={onClose}
- onCancel={onClose}
- footerSlot={
- (<div></div>)
- }
- bottomSlot={
- <div className='flex items-center justify-center bg-background-section-burn py-3 text-xs text-text-tertiary'>
- <Lock01 className='mr-1 h-3 w-3 text-text-tertiary' />
- {t('common.modelProvider.encrypted.front')}
- <a
- className='mx-1 text-text-accent'
- target='_blank' rel='noopener noreferrer'
- href='https://pycryptodome.readthedocs.io/en/latest/src/cipher/oaep.html'
- >
- PKCS1_OAEP
- </a>
- {t('common.modelProvider.encrypted.back')}
- </div>
- }
- onConfirm={handleConfirm}
- showExtraButton={!!editValues}
- onExtraButtonClick={onRemove}
- disabled={disabled || isLoading || doingAction}
- >
- {
- isLoading && (
- <div className='flex h-40 items-center justify-center'>
- <Loading />
- </div>
- )
- }
- {
- !isLoading && !!data.length && (
- <AuthForm
- ref={formRef}
- formSchemas={formSchemas}
- defaultValues={editValues || defaultValues}
- disabled={disabled}
- />
- )
- }
- </Modal>
- )
- }
-
- export default memo(ApiKeyModal)
|