import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' import { Eye, EyeOff } from 'lucide-react' import { useEffect, useState } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { useLatest } from 'react-use' import { toast } from 'sonner' import { Button, Form, FormControl, FormField, Input, Sheet, SheetContent, SheetFooter, SheetHeader, SheetSection, SheetTitle, Textarea, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' import { DiscardChangesConfirmationDialog } from '@/components/ui-patterns/Dialogs/DiscardChangesConfirmationDialog' import { useSecretsCreateMutation } from '@/data/secrets/secrets-create-mutation' import { ProjectSecret } from '@/data/secrets/secrets-query' import { useConfirmOnClose } from '@/hooks/ui/useConfirmOnClose' const FORM_ID = 'edit-secret-sidepanel' const FormSchema = z.object({ name: z.string().min(1, 'Please provide a name for your secret'), value: z.string().min(1, 'Please provide a value for your secret'), }) type FormSchemaType = z.infer interface EditSecretSheetProps { secret?: ProjectSecret visible: boolean onClose: () => void } export function EditSecretSheet({ secret, visible, onClose }: EditSecretSheetProps) { const { ref: projectRef } = useParams() const secretName = useLatest(secret?.name) const [showSecretValue, setShowSecretValue] = useState(false) const form = useForm({ resolver: zodResolver(FormSchema), }) const isValid = form.formState.isValid const isDirty = form.formState.isDirty const { mutate: updateSecret, isPending: isUpdating } = useSecretsCreateMutation({ onSuccess: (_, variables) => { toast.success(`Successfully updated secret "${variables.secrets[0].name}"`) onClose() }, }) const onSubmit: SubmitHandler = async ({ name, value }) => { updateSecret({ projectRef, secrets: [{ name, value }], }) } const { confirmOnClose, handleOpenChange, modalProps } = useConfirmOnClose({ checkIsDirty: () => isDirty, onClose, }) useEffect(() => { if (visible) { form.reset({ name: secretName.current ?? '', value: '' }) } }, [form, secretName, visible]) return ( Edit secret
( )} /> (