import { Controller, useForm } from "react-hook-form"; import { faCheckCircle, faFileSignature, faInfoCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, FormControl, Modal, ModalClose, ModalContent, Select, SelectItem, Switch, TextArea, Tooltip } from "@app/components/v2"; import { useTimedReset } from "@app/hooks"; import { SigningAlgorithm, TCmek, useCmekSign } from "@app/hooks/api/cmeks"; const formSchema = z.object({ data: z.string(), signingAlgorithm: z.nativeEnum(SigningAlgorithm), isBase64Encoded: z.boolean() }); export type FormData = z.infer; type Props = { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; cmek: TCmek; }; type FormProps = Pick; const SignForm = ({ cmek }: FormProps) => { const cmekSign = useCmekSign(); const { handleSubmit, register, control, formState: { isSubmitting, errors } } = useForm({ resolver: zodResolver(formSchema), defaultValues: { signingAlgorithm: cmek?.encryptionAlgorithm?.startsWith("RSA") ? SigningAlgorithm.RSASSA_PSS_SHA_512 : SigningAlgorithm.ECDSA_SHA_256, isBase64Encoded: false } }); const [copySignature, isCopyingSignature, setCopySignature] = useTimedReset({ initialState: "Copy to Clipboard" }); const handleSignData = async (formData: FormData) => { try { await cmekSign.mutateAsync({ ...formData, keyId: cmek.id }); createNotification({ text: "Successfully signed data", type: "success" }); } catch (err) { console.error(err); createNotification({ text: "Failed to sign data", type: "error" }); } }; const signature = cmekSign.data?.signature; const handleCopyToClipboard = () => { navigator.clipboard.writeText(signature ?? ""); setCopySignature("Copied to Clipboard"); }; const allowedSigningAlgorithms = Object.values(SigningAlgorithm).filter((a) => cmek?.encryptionAlgorithm?.startsWith("RSA") ? a.toLowerCase().startsWith("rsa") : a.toLowerCase().startsWith("ecdsa") ); return (
{signature ? (