/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { useState } from 'react' import { AlertTriangle, Loader2 } from 'lucide-react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' import { disable2FA } from '@/lib/api' import { Alert, AlertDescription } from '@/components/ui/alert' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Dialog } from '@/components/dialog' // ============================================================================ // Two-FA Disable Dialog Component // ============================================================================ interface TwoFADisableDialogProps { open: boolean onOpenChange: (open: boolean) => void onSuccess: () => void } export function TwoFADisableDialog({ open, onOpenChange, onSuccess, }: TwoFADisableDialogProps) { const { t } = useTranslation() const [loading, setLoading] = useState(false) const [code, setCode] = useState('') const [confirmed, setConfirmed] = useState(false) const handleDisable = async () => { if (!code) { toast.error(t('Please enter your verification code or backup code')) return } if (!confirmed) { toast.error(t('Please confirm that you understand the consequences')) return } try { setLoading(true) const response = await disable2FA(code) if (response.success) { toast.success(t('Two-factor authentication disabled')) onOpenChange(false) onSuccess() // Reset setCode('') setConfirmed(false) } else { toast.error(response.message || t('Failed to disable 2FA')) } } catch (_error) { toast.error(t('Failed to disable 2FA')) } finally { setLoading(false) } } const handleOpenChange = (open: boolean) => { if (!loading) { if (!open) { setCode('') setConfirmed(false) } onOpenChange(open) } } return ( {t('Disable Two-Factor Authentication')} } description={t( 'This action will permanently remove 2FA protection from your account.' )} contentClassName='sm:max-w-md' titleClassName='text-destructive flex items-center gap-2' contentHeight='auto' bodyClassName='space-y-4' footer={ <> } >
{t('Warning: Disabling 2FA will make your account less secure.')}
setCode(e.target.value)} placeholder={t('Enter code or backup code')} disabled={loading} />

{t('Enter your authenticator code or a backup code')}

setConfirmed(checked as boolean)} />
) }