import { Form } from "@remix-run/react"; import { useState } from "react"; import { Button } from "~/components/primitives/Buttons"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "~/components/primitives/Dialog"; import { Fieldset } from "~/components/primitives/Fieldset"; import { FormError } from "~/components/primitives/FormError"; import { Input } from "~/components/primitives/Input"; import { InputGroup } from "~/components/primitives/InputGroup"; import { InputOTP, InputOTPGroup, InputOTPSlot } from "~/components/primitives/InputOTP"; import { Paragraph } from "~/components/primitives/Paragraph"; import { Spinner } from "~/components/primitives/Spinner"; interface MfaDisableDialogProps { isOpen: boolean; isSubmitting: boolean; error?: string; onDisable: (totpCode?: string, recoveryCode?: string) => void; onCancel: () => void; } export function MfaDisableDialog({ isOpen, isSubmitting, error, onDisable, onCancel, }: MfaDisableDialogProps) { const [totpCode, setTotpCode] = useState(""); const [recoveryCode, setRecoveryCode] = useState(""); const [useRecoveryCode, setUseRecoveryCode] = useState(false); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onDisable(useRecoveryCode ? undefined : totpCode, useRecoveryCode ? recoveryCode : undefined); }; const handleCancel = () => { setTotpCode(""); setRecoveryCode(""); setUseRecoveryCode(false); onCancel(); }; const handleSwitchToRecoveryCode = () => { setUseRecoveryCode(true); setTotpCode(""); }; const handleSwitchToTotpCode = () => { setUseRecoveryCode(false); setRecoveryCode(""); }; return ( Disable multi-factor authentication
{useRecoveryCode ? (
Enter one of your recovery codes to disable MFA.
setRecoveryCode(e.target.value)} />
) : (
Enter the code from your authenticator app to disable MFA.
setTotpCode(value)} variant="large" >
)} {error && {error}}
); }