import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useState, type ReactNode } from 'react' import { SubmitHandler, useForm, type UseFormReturn } from 'react-hook-form' import { toast } from 'sonner' import z from 'zod' import { useParams } from 'common' import { useSecretsCreateMutation } from 'data/secrets/secrets-create-mutation' import { ProjectSecret } from 'data/secrets/secrets-query' import { useConfirmOnClose, type ConfirmOnCloseModalProps } from 'hooks/ui/useConfirmOnClose' import { Eye, EyeOff, X } from 'lucide-react' import { useLatest } from 'react-use' import { Button, cn, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input, Input_Shadcn_, Separator, Sheet, SheetClose, SheetContent, SheetFooter, SheetHeader, SheetSection, SheetTitle, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' 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 secretName = useLatest(secret?.name) const form = useForm({ resolver: zodResolver(FormSchema), }) useEffect(() => { if (visible) { form.reset({ name: secretName.current ?? '', value: '', }) } }, [form, secretName, visible]) const isValid = form.formState.isValid const { ref: projectRef } = useParams() 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, modalProps: closeConfirmationModalProps } = useConfirmOnClose({ checkIsDirty: () => form.formState.isDirty, onClose, }) return (
) } const Header = (): ReactNode => { return ( Close Edit secret ) } type FormBodyProps = { form: UseFormReturn onSubmit: SubmitHandler } const FormBody = ({ form, onSubmit }: FormBodyProps): ReactNode => { return (
) } type NameFieldProps = { form: UseFormReturn } const NameField = ({ form }: NameFieldProps): ReactNode => { return ( ( )} /> ) } type SecretFieldProps = { form: UseFormReturn } const SecretField = ({ form }: SecretFieldProps): ReactNode => { const [showSecretValue, setShowSecretValue] = useState(false) return ( (