'use client' import * as React from 'react' import { AlertTriangle, ClipboardCopy, Download, Loader2, Printer } from 'lucide-react' import { useT } from '@open-mercato/shared/lib/i18n/context' import { flash } from '@open-mercato/ui/backend/FlashMessages' import { Button } from '@open-mercato/ui/primitives/button' import { useMfaStatus } from './hooks/useMfaStatus' function splitIntoColumns(codes: string[]): [string[], string[]] { const middle = Math.ceil(codes.length / 2) return [codes.slice(0, middle), codes.slice(middle)] } export default function RecoveryCodesProviderDetails() { const t = useT() const { saving, recoveryCodes, regenerateRecoveryCodes } = useMfaStatus() const [leftCodes, rightCodes] = React.useMemo(() => splitIntoColumns(recoveryCodes), [recoveryCodes]) const joinedCodes = React.useMemo(() => recoveryCodes.join('\n'), [recoveryCodes]) const handleGenerate = React.useCallback(async () => { await regenerateRecoveryCodes() flash(t('security.profile.mfa.recovery.regenerated', 'Recovery codes regenerated.'), 'success') }, [regenerateRecoveryCodes, t]) const handleCopy = React.useCallback(async () => { if (!joinedCodes) return try { await navigator.clipboard.writeText(joinedCodes) flash(t('security.profile.mfa.recovery.copySuccess', 'Recovery codes copied.'), 'success') } catch { flash(t('security.profile.mfa.recovery.copyError', 'Unable to copy recovery codes.'), 'error') } }, [joinedCodes, t]) const handleDownload = React.useCallback(() => { if (!joinedCodes) return const blob = new Blob([joinedCodes], { type: 'text/plain;charset=utf-8' }) const url = URL.createObjectURL(blob) const anchor = document.createElement('a') anchor.href = url anchor.download = 'open-mercato-recovery-codes.txt' anchor.click() URL.revokeObjectURL(url) }, [joinedCodes]) const handlePrint = React.useCallback(() => { if (!joinedCodes) return const printWindow = window.open('', '_blank', 'noopener,noreferrer') if (!printWindow) return printWindow.document.write(`
${joinedCodes}
`) printWindow.document.close() printWindow.focus() printWindow.print() printWindow.close() }, [joinedCodes]) return (
{recoveryCodes.length > 0 ? ( <>
    {leftCodes.map((code) => (
  • {code}
  • ))}
    {rightCodes.map((code) => (
  • {code}
  • ))}
) : (

{t( 'security.profile.mfa.recovery.emptyState', 'Generate a new set of recovery codes to view and save them.', )}

)}

{t('security.profile.mfa.recovery.generateTitle', 'Generate new recovery codes')}

{t( 'security.profile.mfa.recovery.generateDescription', "When you generate new recovery codes, your old codes won't work anymore.", )}

) }