"use client"; import { Copy, Download, RefreshCw } from "lucide-react"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { errorToast } from "../../../../components/errors/errorToast"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "../../../../shadcnui"; import { showToast } from "../../../../utils/toast"; import { TwoFactorService } from "../../data/two-factor.service"; interface BackupCodesDialogProps { remainingCodes: number; onRegenerate: () => void; trigger?: React.ReactElement; } export function BackupCodesDialog({ remainingCodes, onRegenerate, trigger }: BackupCodesDialogProps) { const t = useTranslations(); const [open, setOpen] = useState(false); const [codes, setCodes] = useState([]); const [isLoading, setIsLoading] = useState(false); const [showCodes, setShowCodes] = useState(false); const handleGenerate = async () => { setIsLoading(true); try { const newCodes = await TwoFactorService.generateBackupCodes(); setCodes(newCodes); setShowCodes(true); onRegenerate(); } catch (error) { errorToast({ title: t("common.errors.error"), error }); } finally { setIsLoading(false); } }; const handleCopyAll = async () => { const text = codes.join("\n"); await navigator.clipboard.writeText(text); showToast(t("auth.two_factor.codes_copied")); }; const handleDownload = () => { const text = `Backup Codes\n\n${codes.join("\n")}\n\nKeep these codes safe. Each code can only be used once.`; const blob = new Blob([text], { type: "text/plain" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "backup-codes.txt"; a.click(); URL.revokeObjectURL(url); }; const handleOpenChange = (newOpen: boolean) => { setOpen(newOpen); if (!newOpen) { setCodes([]); setShowCodes(false); } }; return ( {trigger ? ( ) : ( {t("auth.two_factor.manage_backup_codes")}} /> )} {t("auth.two_factor.backup_codes")} {showCodes ? t("auth.two_factor.save_backup_codes") : t("auth.two_factor.backup_codes_description")} {!showCodes ? (

{t("auth.two_factor.remaining_codes")}: {remainingCodes}

{t("auth.two_factor.generate_new_codes")} } /> {t("auth.two_factor.regenerate_codes")} {t("auth.two_factor.regenerate_codes_warning")} {t("common.buttons.cancel")} {t("auth.two_factor.generate")}
) : (
{codes.map((code, index) => (
{code}
))}

{t("auth.two_factor.codes_shown_once")}

)}
); }