import { useCallback } from "react"; import { faCheck, faCircleInfo, faCopy, faEdit, faEllipsis, faPlus, faTrash } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { createNotification } from "@app/components/notifications"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Td, Tooltip, Tr } from "@app/components/v2"; import { Badge } from "@app/components/v3"; import { useProjectPermission } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionCertificateProfileActions, ProjectPermissionSub } from "@app/context/ProjectPermissionContext/types"; import { usePopUp, useToggle } from "@app/hooks"; import { useGetCaById } from "@app/hooks/api/ca/queries"; import { TCertificateProfile } from "@app/hooks/api/certificateProfiles"; import { useGetCertificateTemplateV2ById } from "@app/hooks/api/certificateTemplates/queries"; import { CertificateIssuanceModal } from "@app/pages/cert-manager/CertificatesPage/components/CertificateIssuanceModal"; interface Props { profile: TCertificateProfile; onEditProfile: (profile: TCertificateProfile) => void; onDeleteProfile: (profile: TCertificateProfile) => void; } export const ProfileRow = ({ profile, onEditProfile, onDeleteProfile }: Props) => { const { permission } = useProjectPermission(); const { data: caData } = useGetCaById(profile.caId); const { popUp, handlePopUpToggle } = usePopUp(["certificateIssuance"] as const); const [isIdCopied, setIsIdCopied] = useToggle(false); const handleCopyId = useCallback(() => { setIsIdCopied.on(); navigator.clipboard.writeText(profile.id); createNotification({ text: "Profile ID copied to clipboard", type: "info" }); setTimeout(() => setIsIdCopied.off(), 2000); }, [setIsIdCopied]); const { data: templateData } = useGetCertificateTemplateV2ById({ templateId: profile.certificateTemplateId }); const canEditProfile = permission.can( ProjectPermissionActions.Edit, ProjectPermissionSub.CertificateAuthorities ); const canIssueCertificate = permission.can( ProjectPermissionCertificateProfileActions.IssueCert, ProjectPermissionSub.CertificateProfiles ); const canDeleteProfile = permission.can( ProjectPermissionActions.Delete, ProjectPermissionSub.CertificateAuthorities ); const getEnrollmentTypeBadge = (enrollmentType: string) => { const config = { api: { variant: "ghost" as const, label: "API" }, est: { variant: "ghost" as const, label: "EST" } } as const; const configKey = Object.keys(config).includes(enrollmentType) ? (enrollmentType as keyof typeof config) : "api"; const { variant, label } = config[configKey]; return {label}; }; return (
{profile.slug}
{profile.description && ( )}
{getEnrollmentTypeBadge(profile.enrollmentType)} {caData?.friendlyName || caData?.commonName || profile.caId} {templateData?.name || profile.certificateTemplateId}
} onClick={() => handleCopyId()} > Copy Profile ID {canEditProfile && ( { e.stopPropagation(); onEditProfile(profile); }} icon={} > Edit Profile )} {canIssueCertificate && profile.enrollmentType === "api" && ( { e.stopPropagation(); handlePopUpToggle("certificateIssuance"); }} icon={} > Issue Certificate )} {canDeleteProfile && ( { e.stopPropagation(); onDeleteProfile(profile); }} icon={} > Delete Profile )}
); };