import type { PluginPayload } from '../types' import type { FormRefObject, FormSchema, } from '@/app/components/base/form/types' import { memo, useCallback, useMemo, useRef, useState, } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' import { EncryptedBottom } from '@/app/components/base/encrypted-bottom' import AuthForm from '@/app/components/base/form/form-scenarios/auth' import { FormTypeEnum } from '@/app/components/base/form/types' import Loading from '@/app/components/base/loading' import { Dialog, DialogCloseButton, DialogContent, DialogTitle, } from '@/app/components/base/ui/dialog' import { toast } from '@/app/components/base/ui/toast' import { ReadmeEntrance } from '../../readme-panel/entrance' import { ReadmeShowType } from '../../readme-panel/store' import { useAddPluginCredentialHook, useGetPluginCredentialSchemaHook, useUpdatePluginCredentialHook, } from '../hooks/use-credential' import { CredentialTypeEnum } from '../types' export type ApiKeyModalProps = { pluginPayload: PluginPayload onClose?: () => void editValues?: Record onRemove?: () => void disabled?: boolean onUpdate?: () => void formSchemas?: FormSchema[] } const ApiKeyModal = ({ pluginPayload, onClose, editValues, onRemove, disabled, onUpdate, formSchemas: formSchemasFromProps = [], }: ApiKeyModalProps) => { const { t } = useTranslation() 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 mergedData = useMemo(() => { if (formSchemasFromProps?.length) return formSchemasFromProps return data }, [formSchemasFromProps, data]) const formSchemas = useMemo(() => { return [ { type: FormTypeEnum.textInput, name: '__name__', label: t('auth.authorizationName', { ns: 'plugin' }), required: false, }, ...mergedData, ] }, [mergedData, t]) const defaultValues = formSchemas.reduce((acc, schema) => { if (schema.default) acc[schema.name] = schema.default return acc }, {} as Record) const { mutateAsync: addPluginCredential } = useAddPluginCredentialHook(pluginPayload) const { mutateAsync: updatePluginCredential } = useUpdatePluginCredentialHook(pluginPayload) const formRef = useRef(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__ || '', }) } toast.success(t('api.actionSuccess', { ns: 'common' })) onClose?.() onUpdate?.() } finally { handleSetDoingAction(false) } }, [addPluginCredential, onClose, onUpdate, updatePluginCredential, t, editValues, handleSetDoingAction]) return (
{t('auth.useApiAuth', { ns: 'plugin' })}
{t('auth.useApiAuthDesc', { ns: 'plugin' })}
{pluginPayload.detail && ( )} { isLoading && (
) } { !isLoading && !!mergedData.length && ( ) }
{!!editValues && ( )}
) } export default memo(ApiKeyModal)