import { useState } from "react"; import { toast } from "sonner"; import { RefreshCw } from "lucide-react"; import { Button } from "~/client/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "~/client/components/ui/dialog"; import { Input } from "~/client/components/ui/input"; import { Label } from "~/client/components/ui/label"; import { authClient } from "~/client/lib/auth-client"; import { logger } from "~/client/lib/logger"; type BackupCodesDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; }; export const BackupCodesDialog = ({ open, onOpenChange }: BackupCodesDialogProps) => { const [password, setPassword] = useState(""); const [backupCodes, setBackupCodes] = useState([]); const [isGenerating, setIsGenerating] = useState(false); const handleGenerate = async (e: React.FormEvent) => { e.preventDefault(); if (!password) { toast.error("Password is required"); return; } const { data, error } = await authClient.twoFactor.generateBackupCodes({ password, fetchOptions: { onRequest: () => { setIsGenerating(true); }, onResponse: () => { setIsGenerating(false); }, }, }); if (error) { logger.error(error); toast.error("Failed to generate backup codes", { description: error.message }); return; } setBackupCodes(data.backupCodes); setPassword(""); toast.success("New backup codes generated successfully"); }; const handleClose = () => { onOpenChange(false); setTimeout(() => { setBackupCodes([]); setPassword(""); }, 200); }; return ( Backup Codes Use these codes to access your account if you lose access to your authenticator app. Each code can only be used once.
{backupCodes.length > 0 ? ( <>
{backupCodes.map((code) => (
{code}
))}
) : (
setPassword(e.target.value)} placeholder="Enter your password" required />
)}
); };