import { useState } from 'react' import { EyeOff, Eye } from 'lucide-react' import { type SubmitHandler, useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { z } from 'zod' import { toast } from 'sonner' import { Button, Dialog, DialogContent, DialogFooter, DialogHeader, DialogSection, DialogSectionSeparator, DialogTitle, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import { useVaultSecretDecryptedValueQuery } from 'data/vault/vault-secret-decrypted-value-query' import { useVaultSecretUpdateMutation } from 'data/vault/vault-secret-update-mutation' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import type { VaultSecret } from 'types' interface EditSecretModalProps { visible: boolean secret: VaultSecret onClose: () => void } const SecretSchema = z.object({ name: z.string().min(1, 'Please provide a name for your secret'), description: z.string().optional(), secret: z.string().min(1, 'Please enter your secret value'), }) const formId = 'edit-vault-secret-form' const EditSecretModal = ({ visible, secret, onClose }: EditSecretModalProps) => { const [showSecretValue, setShowSecretValue] = useState(false) const { data: project } = useSelectedProjectQuery() const { data, isLoading: isLoadingSecretValue } = useVaultSecretDecryptedValueQuery( { projectRef: project?.ref, id: secret.id, connectionString: project?.connectionString, }, { enabled: !!project?.ref } ) const values = { name: secret.name ?? '', description: secret.description ?? '', secret: secret.decryptedSecret ?? data ?? '', } const form = useForm>({ resolver: zodResolver(SecretSchema), defaultValues: values, values, }) const { mutate: updateSecret, isLoading: isSubmitting } = useVaultSecretUpdateMutation() const onSubmit: SubmitHandler> = async (values) => { if (!project) return console.error('Project is required') const payload: Partial = { secret: values.secret, } if (values.name !== secret.name) payload.name = values.name if (values.description !== secret.description) payload.description = values.description if (Object.keys(payload).length > 0) { updateSecret( { projectRef: project.ref, connectionString: project?.connectionString, id: secret.id, ...payload, }, { onSuccess: () => { toast.success('Successfully updated secret') onClose() }, onError: (error) => { toast.error(`Failed to update secret: ${error.message}`) }, } ) } } return ( { if (!open) { form.reset() onClose() } }} > Edit secret {isLoadingSecretValue ? ( ) : ( <>
( )} /> ( )} /> (
)} />
)}
) } export default EditSecretModal