UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 43.1 kB
{"version":3,"file":"mfa-setup.cjs","sources":["../../../../../src/components/auth/user-profile/mfa-setup.tsx"],"sourcesContent":["/**\n * @frank-auth/react - MFA Setup Component\n *\n * Multi-Factor Authentication setup and management interface\n * supporting TOTP, SMS, Email, and Backup codes.\n */\n\n\"use client\";\n\nimport {\n\tAlert,\n\tButton,\n\tCard,\n\tCardBody,\n\tCardHeader,\n\tChip,\n\tCode,\n\tDivider,\n\tImage,\n\tModal,\n\tModalBody,\n\tModalContent,\n\tModalHeader,\n\tSnippet,\n\tTab,\n\tTabs,\n\tuseDisclosure,\n} from \"@heroui/react\";\nimport React from \"react\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { useMFA } from \"../../../hooks/use-mfa\";\nimport { PhoneField } from \"../../forms/phone-field\";\nimport { VerificationCode } from \"../../forms/verification-code\";\n\n// ============================================================================\n// MFA Setup Interface\n// ============================================================================\n\nexport interface MFASetupProps {\n\t/**\n\t * Success callback\n\t */\n\tonSuccess?: (message: string) => void;\n\n\t/**\n\t * Error callback\n\t */\n\tonError?: (error: string) => void;\n\n\t/**\n\t * Show TOTP setup\n\t */\n\tshowTOTPSetup?: boolean;\n\n\t/**\n\t * Show SMS setup\n\t */\n\tshowSMSSetup?: boolean;\n\n\t/**\n\t * Show Email setup\n\t */\n\tshowEmailSetup?: boolean;\n\n\t/**\n\t * Show backup codes\n\t */\n\tshowBackupCodes?: boolean;\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Whether component is disabled\n\t */\n\tisDisabled?: boolean;\n\n\t/**\n\t * Component variant\n\t */\n\tvariant?: \"flat\" | \"bordered\" | \"shadow\";\n\n\t/**\n\t * Component size\n\t */\n\tsize?: \"sm\" | \"md\" | \"lg\";\n\n\t/**\n\t * Default active method\n\t */\n\tdefaultMethod?: string;\n\n\t/**\n\t * Hide specific methods\n\t */\n\thideMethods?: string[];\n\n\t/**\n\t * Custom method configurations\n\t */\n\tcustomMethods?: MFAMethodConfig[];\n}\n\nexport interface MFAMethodConfig {\n\tkey: string;\n\tname: string;\n\tdescription: string;\n\ticon: React.ReactNode;\n\tsetupComponent: React.ReactNode;\n}\n\n// ============================================================================\n// TOTP Setup Component\n// ============================================================================\n\ninterface TOTPSetupProps {\n\tonSuccess: (message: string) => void;\n\tonError: (error: string) => void;\n\tonClose: () => void;\n\tisOpen: boolean;\n}\n\nfunction TOTPSetup({ onSuccess, onError, onClose, isOpen }: TOTPSetupProps) {\n\tconst { setupTOTP, verifySetup } = useMFA();\n\n\tconst [step, setStep] = React.useState<\"setup\" | \"verify\">(\"setup\");\n\tconst [setupData, setSetupData] = React.useState<any>(null);\n\tconst [verificationCode, setVerificationCode] = React.useState(\"\");\n\tconst [isLoading, setIsLoading] = React.useState(false);\n\n\t// Reset state when modal opens/closes\n\tReact.useEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetStep(\"setup\");\n\t\t\tsetSetupData(null);\n\t\t\tsetVerificationCode(\"\");\n\t\t}\n\t}, [isOpen]);\n\n\t// Handle TOTP setup initiation\n\tconst handleSetup = async () => {\n\t\ttry {\n\t\t\tsetIsLoading(true);\n\t\t\tconst data = await setupTOTP();\n\t\t\tsetSetupData(data);\n\t\t\tsetStep(\"verify\");\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Failed to setup TOTP\";\n\t\t\tonError(message);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t};\n\n\t// Handle verification\n\tconst handleVerify = async () => {\n\t\tif (!verificationCode || verificationCode.length !== 6) {\n\t\t\tonError(\"Please enter a valid 6-digit code\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetIsLoading(true);\n\t\t\tawait verifySetup(\"totp\", verificationCode);\n\t\t\tonSuccess(\"TOTP authentication enabled successfully\");\n\t\t\tonClose();\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Failed to verify TOTP\";\n\t\t\tonError(message);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{step === \"setup\" && (\n\t\t\t\t<div className=\"text-center space-y-4\">\n\t\t\t\t\t<div className=\"flex items-center justify-center w-16 h-16 bg-primary/10 rounded-full mx-auto\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclassName=\"w-8 h-8 text-primary\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\td=\"M12 18h.01M8 21h8a1 1 0 001-1V4a1 1 0 00-1-1H8a1 1 0 00-1 1v16a1 1 0 001 1z\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Setup Authenticator App</h3>\n\t\t\t\t\t\t<p className=\"text-sm text-default-500 mt-2\">\n\t\t\t\t\t\t\tWe'll help you setup two-factor authentication using an\n\t\t\t\t\t\t\tauthenticator app like Google Authenticator or Authy.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"text-left space-y-3\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-center w-6 h-6 bg-primary text-white text-xs rounded-full flex-shrink-0\">\n\t\t\t\t\t\t\t\t1\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm\">\n\t\t\t\t\t\t\t\tInstall an authenticator app on your phone\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-center w-6 h-6 bg-default-300 text-default-600 text-xs rounded-full flex-shrink-0\">\n\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm\">\n\t\t\t\t\t\t\t\tScan the QR code or enter the secret key\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-center w-6 h-6 bg-default-300 text-default-600 text-xs rounded-full flex-shrink-0\">\n\t\t\t\t\t\t\t\t3\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm\">Enter the 6-digit code from your app</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tonPress={handleSetup}\n\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t>\n\t\t\t\t\t\tGet Started\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{step === \"verify\" && setupData && (\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Scan QR Code</h3>\n\t\t\t\t\t\t<p className=\"text-sm text-default-500 mt-2\">\n\t\t\t\t\t\t\tScan this QR code with your authenticator app, or enter the secret\n\t\t\t\t\t\t\tkey manually.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* QR Code */}\n\t\t\t\t\t{setupData.qrCode && (\n\t\t\t\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t\t\t\t<div className=\"p-4 bg-white rounded-lg border\">\n\t\t\t\t\t\t\t\t<Image\n\t\t\t\t\t\t\t\t\tsrc={setupData.qrCode}\n\t\t\t\t\t\t\t\t\talt=\"QR Code\"\n\t\t\t\t\t\t\t\t\twidth={200}\n\t\t\t\t\t\t\t\t\theight={200}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Secret Key */}\n\t\t\t\t\t{setupData.secret && (\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<p className=\"text-sm font-medium mb-2\">\n\t\t\t\t\t\t\t\tOr enter this secret key manually:\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<Snippet size=\"sm\" symbol=\"\" className=\"w-full\">\n\t\t\t\t\t\t\t\t{setupData.secret}\n\t\t\t\t\t\t\t</Snippet>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Verification Code Input */}\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<p className=\"text-sm font-medium mb-2\">\n\t\t\t\t\t\t\tEnter the 6-digit code from your app:\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<VerificationCode\n\t\t\t\t\t\t\tlength={6}\n\t\t\t\t\t\t\tvalue={verificationCode}\n\t\t\t\t\t\t\tonChange={setVerificationCode}\n\t\t\t\t\t\t\tonComplete={handleVerify}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\tonPress={() => setStep(\"setup\")}\n\t\t\t\t\t\t\tisDisabled={isLoading}\n\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tBack\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\tonPress={handleVerify}\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tisDisabled={!verificationCode || verificationCode.length !== 6}\n\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tVerify & Enable\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// SMS Setup Component\n// ============================================================================\n\ninterface SMSSetupProps {\n\tonSuccess: (message: string) => void;\n\tonError: (error: string) => void;\n\tonClose: () => void;\n\tisOpen: boolean;\n}\n\nfunction SMSSetup({ onSuccess, onError, onClose, isOpen }: SMSSetupProps) {\n\tconst { setupSMS, verifySetup } = useMFA();\n\n\tconst [step, setStep] = React.useState<\"phone\" | \"verify\">(\"phone\");\n\tconst [phoneNumber, setPhoneNumber] = React.useState(\"\");\n\tconst [verificationCode, setVerificationCode] = React.useState(\"\");\n\tconst [isLoading, setIsLoading] = React.useState(false);\n\n\t// Reset state when modal opens/closes\n\tReact.useEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetStep(\"phone\");\n\t\t\tsetPhoneNumber(\"\");\n\t\t\tsetVerificationCode(\"\");\n\t\t}\n\t}, [isOpen]);\n\n\t// Handle SMS setup\n\tconst handleSetup = async () => {\n\t\tif (!phoneNumber) {\n\t\t\tonError(\"Please enter a valid phone number\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetIsLoading(true);\n\t\t\tawait setupSMS(phoneNumber);\n\t\t\tsetStep(\"verify\");\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Failed to setup SMS\";\n\t\t\tonError(message);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t};\n\n\t// Handle verification\n\tconst handleVerify = async () => {\n\t\tif (!verificationCode || verificationCode.length !== 6) {\n\t\t\tonError(\"Please enter a valid 6-digit code\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetIsLoading(true);\n\t\t\tawait verifySetup(\"sms\", verificationCode);\n\t\t\tonSuccess(\"SMS authentication enabled successfully\");\n\t\t\tonClose();\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Failed to verify SMS\";\n\t\t\tonError(message);\n\t\t} finally {\n\t\t\tsetIsLoading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{step === \"phone\" && (\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-center w-16 h-16 bg-primary/10 rounded-full mx-auto mb-4\">\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\tclassName=\"w-8 h-8 text-primary\"\n\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\td=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Setup SMS Authentication</h3>\n\t\t\t\t\t\t<p className=\"text-sm text-default-500 mt-2\">\n\t\t\t\t\t\t\tWe'll send verification codes to your phone via SMS.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<PhoneField\n\t\t\t\t\t\tlabel=\"Phone Number\"\n\t\t\t\t\t\tplaceholder=\"Enter your phone number\"\n\t\t\t\t\t\tvalue={phoneNumber}\n\t\t\t\t\t\tonChange={setPhoneNumber}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tonPress={handleSetup}\n\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\tisDisabled={!phoneNumber}\n\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t>\n\t\t\t\t\t\tSend Verification Code\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{step === \"verify\" && (\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Verify Phone Number</h3>\n\t\t\t\t\t\t<p className=\"text-sm text-default-500 mt-2\">\n\t\t\t\t\t\t\tWe sent a 6-digit code to {phoneNumber}. Enter it below to verify.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<VerificationCode\n\t\t\t\t\t\tlength={6}\n\t\t\t\t\t\tvalue={verificationCode}\n\t\t\t\t\t\tonChange={setVerificationCode}\n\t\t\t\t\t\tonComplete={handleVerify}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\tonPress={() => setStep(\"phone\")}\n\t\t\t\t\t\t\tisDisabled={isLoading}\n\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tBack\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\tonPress={handleVerify}\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tisDisabled={!verificationCode || verificationCode.length !== 6}\n\t\t\t\t\t\t\tclassName=\"flex-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tVerify & Enable\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Backup Codes Component\n// ============================================================================\n\ninterface BackupCodesProps {\n\tcodes: string[];\n\tonRegenerate: () => void;\n\tisLoading: boolean;\n}\n\nfunction BackupCodes({ codes, onRegenerate, isLoading }: BackupCodesProps) {\n\tconst [showCodes, setShowCodes] = React.useState(false);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<div className=\"flex items-center justify-center w-16 h-16 bg-warning/10 rounded-full mx-auto mb-4\">\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"w-8 h-8 text-warning\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\td=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\n\t\t\t\t<h3 className=\"text-lg font-semibold\">Backup Codes</h3>\n\t\t\t\t<p className=\"text-sm text-default-500 mt-2\">\n\t\t\t\t\tSave these backup codes in a secure place. Each code can only be used\n\t\t\t\t\tonce.\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<Alert color=\"warning\" variant=\"flat\">\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<p className=\"text-sm font-medium\">Important:</p>\n\t\t\t\t\t<ul className=\"text-xs space-y-1 ml-4\">\n\t\t\t\t\t\t<li>• Store these codes in a secure location</li>\n\t\t\t\t\t\t<li>• Each code can only be used once</li>\n\t\t\t\t\t\t<li>• Generate new codes when you're running low</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</Alert>\n\n\t\t\t{codes.length > 0 && (\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"flex items-center justify-between mb-3\">\n\t\t\t\t\t\t<p className=\"text-sm font-medium\">Your backup codes:</p>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\tonPress={() => setShowCodes(!showCodes)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{showCodes ? \"Hide\" : \"Show\"} Codes\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{showCodes && (\n\t\t\t\t\t\t<div className=\"grid grid-cols-2 gap-2\">\n\t\t\t\t\t\t\t{codes.map((code, index) => (\n\t\t\t\t\t\t\t\t<Code key={index} className=\"text-xs\">\n\t\t\t\t\t\t\t\t\t{code}\n\t\t\t\t\t\t\t\t</Code>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<Button\n\t\t\t\tcolor=\"primary\"\n\t\t\t\tvariant=\"bordered\"\n\t\t\t\tonPress={onRegenerate}\n\t\t\t\tisLoading={isLoading}\n\t\t\t\tclassName=\"w-full\"\n\t\t\t>\n\t\t\t\tGenerate New Codes\n\t\t\t</Button>\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// MFA Setup Component\n// ============================================================================\n\nexport function MFASetup({\n\tonSuccess,\n\tonError,\n\tshowTOTPSetup = true,\n\tshowSMSSetup = true,\n\tshowEmailSetup = false,\n\tshowBackupCodes = true,\n\tclassName = \"\",\n\tisDisabled = false,\n\tvariant = \"bordered\",\n\tsize = \"md\",\n\tdefaultMethod = \"overview\",\n\thideMethods = [],\n\tcustomMethods = [],\n}: MFASetupProps) {\n\tconst {\n\t\tisEnabled,\n\t\tmfaMethods,\n\t\tbackupCodes,\n\t\thasTOTP,\n\t\thasSMS,\n\t\thasBackupCodes,\n\t\tremoveMFAMethod,\n\t\tregenerateBackupCodes,\n\t\tdisable,\n\t\tisLoading,\n\t} = useMFA();\n\n\tconst { components } = useConfig();\n\n\tconst totpModal = useDisclosure();\n\tconst smsModal = useDisclosure();\n\tconst [selectedTab, setSelectedTab] = React.useState(defaultMethod);\n\n\t// Custom component override\n\tconst CustomMFASetup = components.MFASetup;\n\tif (CustomMFASetup) {\n\t\treturn (\n\t\t\t<CustomMFASetup\n\t\t\t\t{...{\n\t\t\t\t\tonSuccess,\n\t\t\t\t\tonError,\n\t\t\t\t\tshowTOTPSetup,\n\t\t\t\t\tshowSMSSetup,\n\t\t\t\t\tshowEmailSetup,\n\t\t\t\t\tshowBackupCodes,\n\t\t\t\t\tclassName,\n\t\t\t\t\tisDisabled,\n\t\t\t\t\tvariant,\n\t\t\t\t\tsize,\n\t\t\t\t\tdefaultMethod,\n\t\t\t\t\thideMethods,\n\t\t\t\t\tcustomMethods,\n\t\t\t\t}}\n\t\t\t/>\n\t\t);\n\t}\n\n\t// Handle method removal\n\tconst handleRemoveMethod = async (methodId: string) => {\n\t\ttry {\n\t\t\tawait removeMFAMethod(methodId);\n\t\t\tonSuccess?.(\"MFA method removed successfully\");\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Failed to remove MFA method\";\n\t\t\tonError?.(message);\n\t\t}\n\t};\n\n\t// Handle MFA disable\n\tconst handleDisableMFA = async () => {\n\t\ttry {\n\t\t\tawait disable();\n\t\t\tonSuccess?.(\"Two-factor authentication disabled\");\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error ? error.message : \"Failed to disable MFA\";\n\t\t\tonError?.(message);\n\t\t}\n\t};\n\n\t// Handle backup codes regeneration\n\tconst handleRegenerateBackupCodes = async () => {\n\t\ttry {\n\t\t\tawait regenerateBackupCodes();\n\t\t\tonSuccess?.(\"Backup codes regenerated successfully\");\n\t\t} catch (error) {\n\t\t\tconst message =\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: \"Failed to regenerate backup codes\";\n\t\t\tonError?.(message);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={`space-y-6 ${className}`}>\n\t\t\t{/* MFA Status */}\n\t\t\t<Card variant={variant}>\n\t\t\t\t<CardHeader>\n\t\t\t\t\t<div className=\"flex items-center justify-between w-full\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={`flex items-center justify-center w-10 h-10 rounded-lg ${\n\t\t\t\t\t\t\t\t\tisEnabled ? \"bg-success/10\" : \"bg-default/10\"\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\tclassName={`w-5 h-5 ${isEnabled ? \"text-success\" : \"text-default-400\"}`}\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\td=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<h4 className=\"text-md font-semibold\">\n\t\t\t\t\t\t\t\t\tTwo-Factor Authentication\n\t\t\t\t\t\t\t\t</h4>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<Chip\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tcolor={isEnabled ? \"success\" : \"default\"}\n\t\t\t\t\t\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isEnabled ? \"Enabled\" : \"Disabled\"}\n\t\t\t\t\t\t\t\t\t</Chip>\n\t\t\t\t\t\t\t\t\t{isEnabled && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-default-500\">\n\t\t\t\t\t\t\t\t\t\t\t{mfaMethods.length} method\n\t\t\t\t\t\t\t\t\t\t\t{mfaMethods.length !== 1 ? \"s\" : \"\"} configured\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{isEnabled && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"light\"\n\t\t\t\t\t\t\t\tcolor=\"danger\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonPress={handleDisableMFA}\n\t\t\t\t\t\t\t\tisDisabled={isDisabled || isLoading}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDisable MFA\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\n\t\t\t\t{!isEnabled && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Divider />\n\t\t\t\t\t\t<CardBody>\n\t\t\t\t\t\t\t<p className=\"text-sm text-default-600\">\n\t\t\t\t\t\t\t\tAdd an extra layer of security to your account by enabling\n\t\t\t\t\t\t\t\ttwo-factor authentication. Choose from authenticator apps, SMS,\n\t\t\t\t\t\t\t\tor backup codes.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</CardBody>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Card>\n\n\t\t\t{/* MFA Methods */}\n\t\t\t<Tabs\n\t\t\t\tselectedKey={selectedTab}\n\t\t\t\tonSelectionChange={(key) => setSelectedTab(key as string)}\n\t\t\t\tvariant=\"bordered\"\n\t\t\t>\n\t\t\t\t{/* Overview Tab */}\n\t\t\t\t<Tab key=\"overview\" title=\"Overview\">\n\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t{/* TOTP Method */}\n\t\t\t\t\t\t{showTOTPSetup && !hideMethods.includes(\"totp\") && (\n\t\t\t\t\t\t\t<Card variant=\"flat\">\n\t\t\t\t\t\t\t\t<CardBody>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center w-10 h-10 bg-primary/10 rounded-lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-5 h-5 text-primary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M12 18h.01M8 21h8a1 1 0 001-1V4a1 1 0 00-1-1H8a1 1 0 00-1 1v16a1 1 0 001 1z\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm font-medium\">Authenticator App</p>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-default-500\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tUse an app like Google Authenticator or Authy\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{hasTOTP && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Chip size=\"sm\" color=\"success\" variant=\"flat\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEnabled\n\t\t\t\t\t\t\t\t\t\t\t\t</Chip>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tcolor={hasTOTP ? \"danger\" : \"primary\"}\n\t\t\t\t\t\t\t\t\t\t\t\tvariant={hasTOTP ? \"light\" : \"solid\"}\n\t\t\t\t\t\t\t\t\t\t\t\tonPress={\n\t\t\t\t\t\t\t\t\t\t\t\t\thasTOTP\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleRemoveMethod(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmfaMethods.find((m) => m.type === \"totp\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?.id || \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: totpModal.onOpen\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tisDisabled={isDisabled}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{hasTOTP ? \"Remove\" : \"Setup\"}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</CardBody>\n\t\t\t\t\t\t\t</Card>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* SMS Method */}\n\t\t\t\t\t\t{showSMSSetup && !hideMethods.includes(\"sms\") && (\n\t\t\t\t\t\t\t<Card variant=\"flat\">\n\t\t\t\t\t\t\t\t<CardBody>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center w-10 h-10 bg-secondary/10 rounded-lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-5 h-5 text-secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm font-medium\">SMS</p>\n\t\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-default-500\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tReceive codes via text message\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t{hasSMS && (\n\t\t\t\t\t\t\t\t\t\t\t\t<Chip size=\"sm\" color=\"success\" variant=\"flat\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tEnabled\n\t\t\t\t\t\t\t\t\t\t\t\t</Chip>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tcolor={hasSMS ? \"danger\" : \"primary\"}\n\t\t\t\t\t\t\t\t\t\t\t\tvariant={hasSMS ? \"light\" : \"solid\"}\n\t\t\t\t\t\t\t\t\t\t\t\tonPress={\n\t\t\t\t\t\t\t\t\t\t\t\t\thasSMS\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? () =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleRemoveMethod(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmfaMethods.find((m) => m.type === \"sms\")\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?.id || \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: smsModal.onOpen\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tisDisabled={isDisabled}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{hasSMS ? \"Remove\" : \"Setup\"}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</CardBody>\n\t\t\t\t\t\t\t</Card>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</Tab>\n\n\t\t\t\t{/* Backup Codes Tab */}\n\t\t\t\t{showBackupCodes && !hideMethods.includes(\"backup-codes\") && (\n\t\t\t\t\t<Tab key=\"backup-codes\" title=\"Backup Codes\">\n\t\t\t\t\t\t<BackupCodes\n\t\t\t\t\t\t\tcodes={backupCodes}\n\t\t\t\t\t\t\tonRegenerate={handleRegenerateBackupCodes}\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Tab>\n\t\t\t\t)}\n\n\t\t\t\t{/* Custom Methods */}\n\t\t\t\t{customMethods.map(\n\t\t\t\t\t(method) =>\n\t\t\t\t\t\t!hideMethods.includes(method.key) && (\n\t\t\t\t\t\t\t<Tab key={method.key} title={method.name}>\n\t\t\t\t\t\t\t\t{method.setupComponent}\n\t\t\t\t\t\t\t</Tab>\n\t\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t</Tabs>\n\n\t\t\t{/* Setup Modals */}\n\t\t\t<Modal\n\t\t\t\tisOpen={totpModal.isOpen}\n\t\t\t\tonOpenChange={totpModal.onOpenChange}\n\t\t\t\tsize=\"md\"\n\t\t\t\tplacement=\"center\"\n\t\t\t\thideCloseButton\n\t\t\t>\n\t\t\t\t<ModalContent>\n\t\t\t\t\t{(onClose) => (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ModalHeader />\n\t\t\t\t\t\t\t<ModalBody>\n\t\t\t\t\t\t\t\t<TOTPSetup\n\t\t\t\t\t\t\t\t\tonSuccess={(message) => {\n\t\t\t\t\t\t\t\t\t\tonSuccess?.(message);\n\t\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonError={(error) => onError?.(error)}\n\t\t\t\t\t\t\t\t\tonClose={onClose}\n\t\t\t\t\t\t\t\t\tisOpen={totpModal.isOpen}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ModalBody>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</ModalContent>\n\t\t\t</Modal>\n\n\t\t\t<Modal\n\t\t\t\tisOpen={smsModal.isOpen}\n\t\t\t\tonOpenChange={smsModal.onOpenChange}\n\t\t\t\tsize=\"md\"\n\t\t\t\tplacement=\"center\"\n\t\t\t\thideCloseButton\n\t\t\t>\n\t\t\t\t<ModalContent>\n\t\t\t\t\t{(onClose) => (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ModalHeader />\n\t\t\t\t\t\t\t<ModalBody>\n\t\t\t\t\t\t\t\t<SMSSetup\n\t\t\t\t\t\t\t\t\tonSuccess={(message) => {\n\t\t\t\t\t\t\t\t\t\tonSuccess?.(message);\n\t\t\t\t\t\t\t\t\t\tonClose();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonError={(error) => onError?.(error)}\n\t\t\t\t\t\t\t\t\tonClose={onClose}\n\t\t\t\t\t\t\t\t\tisOpen={smsModal.isOpen}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ModalBody>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</ModalContent>\n\t\t\t</Modal>\n\t\t</div>\n\t);\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport default MFASetup;\n"],"names":["TOTPSetup","onSuccess","onError","onClose","isOpen","setupTOTP","verifySetup","useMFA","step","setStep","React","setupData","setSetupData","verificationCode","setVerificationCode","isLoading","setIsLoading","handleSetup","data","error","message","handleVerify","jsxs","jsx","Button","Image","Snippet","VerificationCode","SMSSetup","setupSMS","phoneNumber","setPhoneNumber","PhoneField","BackupCodes","codes","onRegenerate","showCodes","setShowCodes","Alert","code","index","Code","MFASetup","showTOTPSetup","showSMSSetup","showEmailSetup","showBackupCodes","className","isDisabled","variant","size","defaultMethod","hideMethods","customMethods","isEnabled","mfaMethods","backupCodes","hasTOTP","hasSMS","hasBackupCodes","removeMFAMethod","regenerateBackupCodes","disable","components","useConfig","totpModal","useDisclosure","smsModal","selectedTab","setSelectedTab","CustomMFASetup","handleRemoveMethod","methodId","handleDisableMFA","handleRegenerateBackupCodes","Card","CardHeader","Chip","Fragment","Divider","CardBody","Tabs","key","Tab","m","method","Modal","ModalContent","ModalHeader","ModalBody"],"mappings":"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"}