import { useState } from "react"; import { subject } from "@casl/ability"; import { faCheck, faCopy, faPencil } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Button, GenericFieldLabel, IconButton, Modal, ModalContent, Tooltip } from "@app/components/v2"; import { ProjectPermissionPkiSubscriberActions, ProjectPermissionSub, useProject, useProjectPermission } from "@app/context"; import { useTimedReset } from "@app/hooks"; import { useGetPkiSubscriber, useIssuePkiSubscriberCert, useOrderPkiSubscriberCert } from "@app/hooks/api"; import { pkiSubscriberStatusToNameMap } from "@app/hooks/api/pkiSubscriber/constants"; import { SubscriberOperationStatus } from "@app/hooks/api/pkiSubscriber/types"; import { UsePopUpState } from "@app/hooks/usePopUp"; import { CertificateContent } from "../../CertificatesPage/components/CertificateContent"; type Props = { subscriberName: string; handlePopUpOpen: (popUpName: keyof UsePopUpState<["pkiSubscriber"]>, data?: object) => void; }; type TCertificateDetails = { serialNumber: string; certificate: string; certificateChain: string; privateKey: string; }; export const PkiSubscriberDetailsSection = ({ subscriberName, handlePopUpOpen }: Props) => { const { currentProject } = useProject(); const projectId = currentProject.id; const { permission } = useProjectPermission(); const [certificateDetails, setCertificateDetails] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [copyTextId, isCopyingId, setCopyTextId] = useTimedReset({ initialState: "Copy ID to clipboard" }); const { data: pkiSubscriber } = useGetPkiSubscriber( { subscriberName, projectId }, { refetchInterval: 5000 } ); const { mutateAsync: issuePkiSubscriberCert, isPending: isIssuingCert } = useIssuePkiSubscriberCert(); const { mutateAsync: orderPkiSubscriberCert, isPending: isOrderingCert } = useOrderPkiSubscriberCert(); const onIssuePkiSubscriberCert = async () => { try { if (pkiSubscriber?.supportsImmediateCertIssuance) { const response = await issuePkiSubscriberCert({ subscriberName, projectId }); setCertificateDetails({ serialNumber: response.serialNumber, certificate: response.certificate, certificateChain: response.certificateChain, privateKey: response.privateKey }); setIsModalOpen(true); createNotification({ text: "Successfully issued certificate", type: "success" }); } else { await orderPkiSubscriberCert({ subscriberName, projectId }); createNotification({ text: "Successfully ordered certificate. It will be issued after CA processing which could take a few minutes.", type: "info" }); } } catch (err) { console.error(err); createNotification({ text: "Failed to issue certificate", type: "error" }); } }; const canIssuePkiSubscriberCert = permission.can( ProjectPermissionPkiSubscriberActions.IssueCert, subject(ProjectPermissionSub.PkiSubscribers, { name: pkiSubscriber?.name ?? "" }) ); return pkiSubscriber ? (

PKI Subscriber Details

{(isAllowed) => { return ( { e.stopPropagation(); handlePopUpOpen("pkiSubscriber", { subscriberName: pkiSubscriber.name }); }} > ); }}

PKI Subscriber ID

{pkiSubscriber.id}

{ navigator.clipboard.writeText(pkiSubscriber.id); setCopyTextId("Copied"); }} >

Name

{pkiSubscriber.name}

Status

{pkiSubscriberStatusToNameMap[pkiSubscriber.status]}

Common Name

{pkiSubscriber.commonName}

{pkiSubscriber.lastOperationAt && (

Last Operation (Local Time)

{new Date(pkiSubscriber.lastOperationAt).toLocaleString()}

)} {pkiSubscriber.lastOperationStatus === SubscriberOperationStatus.FAILED && (

{pkiSubscriber.lastOperationMessage}

)} {canIssuePkiSubscriberCert && ( )}
{ setIsModalOpen(isOpen); if (!isOpen) { setCertificateDetails(null); } }} > {certificateDetails && ( )}
) : (
); };