import { useState } from "react"; import { subject } from "@casl/ability"; import { faCertificate, faEllipsis, faTrash } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { format } from "date-fns"; import { twMerge } from "tailwind-merge"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Badge, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, EmptyState, Pagination, Table, TableContainer, TableSkeleton, TBody, Td, Th, THead, Tooltip, Tr } from "@app/components/v2"; import { ProjectPermissionPkiSubscriberActions, ProjectPermissionSub, useProjectPermission, useWorkspace } from "@app/context"; import { useGetPkiSubscriberCertificates } from "@app/hooks/api"; import { CertStatus } from "@app/hooks/api/certificates/enums"; import { UsePopUpState } from "@app/hooks/usePopUp"; type Props = { subscriberName: string; handlePopUpOpen?: (popUpName: keyof UsePopUpState<["revokeCertificate"]>, data?: object) => void; }; const PER_PAGE_INIT = 25; export const PkiSubscriberCertificatesTable = ({ subscriberName, handlePopUpOpen }: Props) => { const { currentWorkspace } = useWorkspace(); const projectId = currentWorkspace.id; const { permission } = useProjectPermission(); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(PER_PAGE_INIT); const { data, isPending } = useGetPkiSubscriberCertificates( { subscriberName, projectId, offset: (page - 1) * perPage, limit: perPage }, { refetchInterval: 5000 } ); const getCertStatusBadge = (status: string, notAfter: string) => { if (status === CertStatus.REVOKED) { return Revoked; } const expiryDate = new Date(notAfter); const now = new Date(); const daysUntilExpiry = Math.floor( (expiryDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24) ); if (daysUntilExpiry < 0) { return Expired; } if (daysUntilExpiry < 30) { return Expiring Soon; } return Valid; }; const canListPkiSubscriberCerts = permission.can( ProjectPermissionPkiSubscriberActions.ListCerts, subject(ProjectPermissionSub.PkiSubscribers, { name: subscriberName }) ); return (
{isPending && } {!isPending && data?.certificates?.map((certificate) => { return ( ); })}
Common Name Status Not Before Not After
{certificate.commonName} {getCertStatusBadge(certificate.status, certificate.notAfter)} {certificate.notBefore ? format(new Date(certificate.notBefore), "yyyy-MM-dd") : "-"} {certificate.notAfter ? format(new Date(certificate.notAfter), "yyyy-MM-dd") : "-"}
{(isAllowed) => ( handlePopUpOpen && handlePopUpOpen("revokeCertificate", { serialNumber: certificate.serialNumber }) } disabled={!isAllowed} icon={} > Revoke Certificate )}
{!isPending && data?.totalCount !== undefined && data.totalCount >= PER_PAGE_INIT && ( setPage(newPage)} onChangePerPage={(newPerPage) => setPerPage(newPerPage)} /> )} {!isPending && !data?.certificates?.length && ( )}
); };