import { Controller, useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, FormControl, Input, Modal, ModalClose, ModalContent, Select, SelectItem, TextArea } from "@app/components/v2"; import { useWorkspace } from "@app/context"; import { EncryptionAlgorithm, TCmek, useCreateCmek, useUpdateCmek } from "@app/hooks/api/cmeks"; import { slugSchema } from "@app/lib/schemas"; const formSchema = z.object({ name: slugSchema({ min: 1, max: 32, field: "Name" }), description: z.string().max(500).optional(), encryptionAlgorithm: z.nativeEnum(EncryptionAlgorithm) }); export type FormData = z.infer; type Props = { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; cmek?: TCmek | null; }; type FormProps = Pick & { onComplete: () => void; }; const CmekForm = ({ onComplete, cmek }: FormProps) => { const createCmek = useCreateCmek(); const updateCmek = useUpdateCmek(); const { currentWorkspace } = useWorkspace(); const projectId = currentWorkspace.id; const isUpdate = !!cmek; const { control, handleSubmit, register, formState: { isSubmitting, errors } } = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: cmek?.name, description: cmek?.description, encryptionAlgorithm: EncryptionAlgorithm.AES_GCM_256 } }); const handleCreateCmek = async ({ encryptionAlgorithm, name, description }: FormData) => { const mutation = isUpdate ? updateCmek.mutateAsync({ keyId: cmek.id, projectId, name, description }) : createCmek.mutateAsync({ projectId, encryptionAlgorithm, name, description }); try { await mutation; createNotification({ text: `Successfully ${isUpdate ? "updated" : "added"} key`, type: "success" }); onComplete(); } catch (err) { console.error(err); createNotification({ text: `Failed to ${isUpdate ? "update" : "add"} key`, type: "error" }); } }; return (
{!isUpdate && ( ( )} /> )}