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, Checkbox, FormControl, Input, Modal, ModalClose, ModalContent, TextArea } from "@app/components/v2"; import { useProject } from "@app/context"; import { useCreateKmipClient, useUpdateKmipClient } from "@app/hooks/api/kmip"; import { KmipPermission, TKmipClient } from "@app/hooks/api/kmip/types"; const KMIP_PERMISSIONS_OPTIONS = [ { value: KmipPermission.Check, label: "Check" }, { value: KmipPermission.Create, label: "Create" }, { value: KmipPermission.Get, label: "Get" }, { value: KmipPermission.Locate, label: "Locate" }, { value: KmipPermission.Destroy, label: "Destroy" }, { value: KmipPermission.Activate, label: "Activate" }, { value: KmipPermission.Revoke, label: "Revoke" }, { value: KmipPermission.GetAttributes, label: "Get Attributes" }, { value: KmipPermission.Register, label: "Register" } ] as const; const formSchema = z.object({ name: z.string().trim().min(1), description: z.string().max(500).optional(), permissions: z.object({ [KmipPermission.Check]: z.boolean().optional(), [KmipPermission.Create]: z.boolean().optional(), [KmipPermission.Get]: z.boolean().optional(), [KmipPermission.Locate]: z.boolean().optional(), [KmipPermission.Destroy]: z.boolean().optional(), [KmipPermission.Activate]: z.boolean().optional(), [KmipPermission.GetAttributes]: z.boolean().optional(), [KmipPermission.Revoke]: z.boolean().optional(), [KmipPermission.Register]: z.boolean().optional() }) }); export type FormData = z.infer; type Props = { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; kmipClient?: TKmipClient | null; }; type FormProps = Pick & { onComplete: () => void; }; const KmipClientForm = ({ onComplete, kmipClient }: FormProps) => { const createKmipClient = useCreateKmipClient(); const updateKmipClient = useUpdateKmipClient(); const { currentProject } = useProject(); const projectId = currentProject.id; const isUpdate = !!kmipClient; const { control, handleSubmit, register, formState: { isSubmitting, errors } } = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: kmipClient?.name, description: kmipClient?.description, permissions: Object.fromEntries((kmipClient?.permissions || []).map((name) => [name, true])) } }); const handleKmipClientSubmit = async ({ permissions, name, description }: FormData) => { const mutation = isUpdate ? updateKmipClient.mutateAsync({ id: kmipClient.id, projectId, name, description, permissions: Object.entries(permissions) .filter(([, value]) => value) .map(([key]) => key as KmipPermission) }) : createKmipClient.mutateAsync({ projectId, name, description, permissions: Object.entries(permissions) .filter(([, value]) => value) .map(([key]) => key as KmipPermission) }); try { await mutation; createNotification({ text: `Successfully ${isUpdate ? "updated" : "added"} KMIP client`, type: "success" }); onComplete(); } catch (err) { console.error(err); createNotification({ text: `Failed to ${isUpdate ? "update" : "add"} KMIP client`, type: "error" }); } }; return (