import { CopyToClipboard } from "react-copy-to-clipboard"; import { useTranslation } from "react-i18next"; import { CopyOutlined as CopyOutlinedIcon, DownOutlined as DownOutlinedIcon, LikeOutlined as LikeOutlinedIcon } from "@ant-design/icons"; import { Button, Dropdown, Form, Input, Space, Tooltip, message } from "antd"; import dayjs from "dayjs"; import { saveAs } from "file-saver"; import { archive as archiveCertificate } from "@/api/certificates"; import { CERTIFICATE_FORMATS, type CertificateFormatType, type CertificateModel } from "@/domain/certificate"; export type CertificateDetailProps = { className?: string; style?: React.CSSProperties; data: CertificateModel; }; const CertificateDetail = ({ data, ...props }: CertificateDetailProps) => { const { t } = useTranslation(); const [messageApi, MessageContextHolder] = message.useMessage(); const handleDownloadClick = async (format: CertificateFormatType) => { try { const res = await archiveCertificate(data.id, format); const bstr = atob(res.data.fileBytes); const u8arr = Uint8Array.from(bstr, (ch) => ch.charCodeAt(0)); const blob = new Blob([u8arr], { type: "application/zip" }); saveAs(blob, `${data.id}-${data.subjectAltNames}.zip`); } catch (err) { console.error(err); messageApi.warning(t("common.text.operation_failed")); } }; return (
{MessageContextHolder}
{ messageApi.success(t("common.text.copied")); }} >
{ messageApi.success(t("common.text.copied")); }} >
, onClick: () => handleDownloadClick(CERTIFICATE_FORMATS.PEM), }, { key: "PFX", label: "PFX", onClick: () => handleDownloadClick(CERTIFICATE_FORMATS.PFX), }, { key: "JKS", label: "JKS", onClick: () => handleDownloadClick(CERTIFICATE_FORMATS.JKS), }, ], }} >
); }; export default CertificateDetail;