import { Button } from "@components/UI/Button.tsx"; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@components/UI/Dialog.tsx"; import { useDevice, useNodeDB } from "@core/stores"; import { fromByteArray } from "base64-js"; import { DownloadIcon, PrinterIcon } from "lucide-react"; import React from "react"; import { useTranslation } from "react-i18next"; export interface PkiBackupDialogProps { open: boolean; onOpenChange: (open: boolean) => void; } export const PkiBackupDialog = ({ open, onOpenChange, }: PkiBackupDialogProps) => { const { t } = useTranslation("dialog"); const { config, setDialogOpen } = useDevice(); const { getMyNode } = useNodeDB(); const privateKey = config.security?.privateKey; const publicKey = config.security?.publicKey; const decodeKeyData = React.useCallback( (key: Uint8Array) => { if (!key) { return ""; } return fromByteArray(key ?? new Uint8Array(0)); }, [], ); const closeDialog = React.useCallback(() => { setDialogOpen("pkiBackup", false); }, [setDialogOpen]); const renderPrintWindow = React.useCallback(() => { if (!privateKey || !publicKey) { return; } const printWindow = globalThis.open("", "_blank"); if (printWindow) { printWindow.document.write(` ${t("pkiBackup.header", { interpolation: { escapeValue: false }, shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"), longName: getMyNode()?.user?.longName ?? t("unknown.longName"), })}

${t("pkiBackup.header", { interpolation: { escapeValue: false }, shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"), longName: getMyNode()?.user?.longName ?? t("unknown.longName"), })}

${t("pkiBackup.secureBackup")}

${t("pkiBackup.publicKey")}

${decodeKeyData(publicKey)}

${t("pkiBackup.privateKey")}

${decodeKeyData(privateKey)}

${t("pkiBackup.footer")}

`); printWindow.document.close(); printWindow.print(); closeDialog(); } }, [decodeKeyData, privateKey, publicKey, closeDialog, t, getMyNode]); const createDownloadKeyFile = React.useCallback(() => { if (!privateKey || !publicKey) { return; } const decodedPrivateKey = decodeKeyData(privateKey); const decodedPublicKey = decodeKeyData(publicKey); const formattedContent = [ `${t("pkiBackup.header")}\n\n`, `${t("pkiBackup.privateKey")}\n`, decodedPrivateKey, `\n\n${t("pkiBackup.publicKey")}\n`, decodedPublicKey, `\n\n${t("pkiBackup.footer")}`, ].join(""); const blob = new Blob([formattedContent], { type: "text/plain" }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = t("pkiBackup.fileName", { interpolation: { escapeValue: false }, shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"), longName: getMyNode()?.user?.longName ?? t("unknown.longName"), }); link.style.display = "none"; document.body.appendChild(link); link.click(); document.body.removeChild(link); closeDialog(); URL.revokeObjectURL(url); }, [decodeKeyData, privateKey, publicKey, closeDialog, t, getMyNode]); return ( {t("pkiBackup.title")} {t("pkiBackup.secureBackup")} {t("pkiBackup.loseKeysWarning")} ); };