import { useState } from "react"; 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, ModalContent, Select, SelectItem, TextArea } from "@app/components/v2"; import { useWorkspace } from "@app/context"; import { useGetCert, useImportCertificate, useListWorkspacePkiCollections } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; import { CertificateContent } from "./CertificateContent"; const schema = z.object({ certificatePem: z.string().trim().min(1, "Certificate PEM is required"), privateKeyPem: z.string().trim().min(1, "Private Key PEM is required"), chainPem: z.string().trim().min(1, "Certificate Chain PEM is required"), friendlyName: z.string(), collectionId: z.string().optional() }); export type FormData = z.infer; type Props = { popUp: UsePopUpState<["certificateImport"]>; handlePopUpToggle: ( popUpName: keyof UsePopUpState<["certificateImport"]>, state?: boolean ) => void; }; type TCertificateDetails = { serialNumber: string; certificate: string; certificateChain: string; privateKey: string; }; export const CertificateImportModal = ({ popUp, handlePopUpToggle }: Props) => { const [certificateDetails, setCertificateDetails] = useState(null); const { currentWorkspace } = useWorkspace(); const { data: cert } = useGetCert( (popUp?.certificateImport?.data as { serialNumber: string })?.serialNumber || "" ); const { data } = useListWorkspacePkiCollections({ workspaceId: currentWorkspace?.id || "" }); const { mutateAsync: importCertificate } = useImportCertificate(); const { control, handleSubmit, reset, formState: { isSubmitting } } = useForm({ resolver: zodResolver(schema) }); const onFormSubmit = async ({ certificatePem, privateKeyPem, chainPem, friendlyName, collectionId }: FormData) => { try { if (!currentWorkspace?.slug) return; const { serialNumber, certificate, certificateChain, privateKey } = await importCertificate({ projectSlug: currentWorkspace.slug, certificatePem, privateKeyPem, chainPem, friendlyName, pkiCollectionId: collectionId }); reset(); setCertificateDetails({ serialNumber, certificate, certificateChain, privateKey }); createNotification({ text: "Successfully imported certificate", type: "success" }); } catch (err) { console.error(err); createNotification({ text: "Failed to import certificate", type: "error" }); } }; return ( { handlePopUpToggle("certificateImport", isOpen); reset(); setCertificateDetails(null); }} > {!certificateDetails ? (
( )} /> ( )} /> (