import { memo, useCallback, useMemo, useRef, } from 'react' import { useTranslation } from 'react-i18next' import { RiExternalLinkLine } from '@remixicon/react' import { Lock01 } from '@/app/components/base/icons/src/vender/solid/security' import Modal from '@/app/components/base/modal/modal' import { useAddPluginToolCredential, useGetPluginToolCredentialSchema, useInvalidPluginToolCredentialInfo, useUpdatePluginToolCredential, } from '@/service/use-plugins-auth' import { CredentialTypeEnum } from '../types' import { transformFormSchemasSecretInput } from '../utils' import AuthForm from '@/app/components/base/form/form-scenarios/auth' import type { FromRefObject } from '@/app/components/base/form/types' import { FormTypeEnum } from '@/app/components/base/form/types' import { useToastContext } from '@/app/components/base/toast' export type ApiKeyModalProps = { provider: string onClose?: () => void editValues?: Record onRemove?: () => void disabled?: boolean } const ApiKeyModal = ({ provider, onClose, editValues, onRemove, disabled, }: ApiKeyModalProps) => { const { t } = useTranslation() const { notify } = useToastContext() const { data = [] } = useGetPluginToolCredentialSchema(provider, CredentialTypeEnum.API_KEY) const formSchemas = useMemo(() => { return [ { type: FormTypeEnum.textInput, name: '__name__', label: 'Authorization name', required: false, }, ...data, ] }, [data]) const { mutateAsync: addPluginToolCredential } = useAddPluginToolCredential(provider) const { mutateAsync: updatePluginToolCredential } = useUpdatePluginToolCredential(provider) const invalidatePluginToolCredentialInfo = useInvalidPluginToolCredentialInfo(provider) const formRef = useRef(null) const handleConfirm = useCallback(async () => { const form = formRef.current?.getForm() const store = form?.store const { __name__, __credential_id__, ...values } = store?.state.values const isPristineSecretInputNames: string[] = [] formSchemas.forEach((schema) => { if (schema.type === FormTypeEnum.secretInput) { const fieldMeta = form?.getFieldMeta(schema.name) if (fieldMeta?.isPristine) isPristineSecretInputNames.push(schema.name) } }) const transformedValues = transformFormSchemasSecretInput(isPristineSecretInputNames, values) if (editValues) { await updatePluginToolCredential({ credentials: transformedValues, credential_id: __credential_id__, type: CredentialTypeEnum.API_KEY, name: __name__ || '', }) } else { await addPluginToolCredential({ credentials: transformedValues, type: CredentialTypeEnum.API_KEY, name: __name__ || '', }) } notify({ type: 'success', message: t('common.api.actionSuccess'), }) onClose?.() invalidatePluginToolCredentialInfo() }, [addPluginToolCredential, onClose, invalidatePluginToolCredentialInfo, updatePluginToolCredential, notify, t, editValues, formSchemas]) return ( Get your API Key from OpenAI } bottomSlot={
{t('common.modelProvider.encrypted.front')} PKCS1_OAEP {t('common.modelProvider.encrypted.back')}
} onConfirm={handleConfirm} showExtraButton={!!editValues} onExtraButtonClick={onRemove} disabled={disabled} >
) } export default memo(ApiKeyModal)