UNPKG

@frank-auth/react

Version:

Flexible and customizable React UI components for Frank Authentication

1 lines 22.3 kB
{"version":3,"file":"email-verification.cjs","sources":["../../../../../../src/components/auth/verification/email-verification/email-verification.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Email Verification Component\n *\n * Handles email verification flow with code sending, validation, and resending.\n * Integrates with Frank Auth API for MFA and identity verification.\n */\n\nimport { Button as HeroButton } from \"@/components/ui\";\nimport {\n\tArrowPathIcon,\n\tCheckCircleIcon,\n\tEnvelopeIcon,\n\tXCircleIcon,\n} from \"@heroicons/react/24/outline\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { ResendEmailButton } from \"./resend-email-button\";\n\nimport type { RadiusT, SizeT } from \"@/types\";\nimport { useAuth } from \"../../../../hooks/use-auth\";\nimport { useConfig } from \"../../../../hooks/use-config\";\nimport { VerificationError, VerificationInput } from \"../../common\";\nimport { withErrorBoundary } from \"../../common/error-boundary\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface EmailVerificationProps {\n\temail?: string;\n\torganizationId?: string;\n\tautoSubmit?: boolean;\n\tcodeLength?: number;\n\tresendDelay?: number;\n\tmaxResendAttempts?: number;\n\texpirationTime?: number;\n\tonVerificationSuccess?: (result: {\n\t\temail: string;\n\t\tverified: boolean;\n\t}) => void;\n\tonVerificationError?: (error: Error) => void;\n\tonCodeSent?: () => void;\n\tonCodeResent?: (attempt: number) => void;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n\tdisabled?: boolean;\n\tsize?: SizeT;\n\tmodalSize?: SizeT;\n\tradius?: RadiusT;\n}\n\nexport interface EmailVerificationFormProps extends EmailVerificationProps {\n\tshowHeader?: boolean;\n\tshowInstructions?: boolean;\n}\n\nexport interface EmailVerificationModalProps extends EmailVerificationProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tisDismissable?: boolean;\n}\n\nexport interface EmailVerificationCardProps extends EmailVerificationProps {\n\tvariant?: \"flat\" | \"bordered\" | \"shadow\";\n\tradius?: \"none\" | \"sm\" | \"md\" | \"lg\";\n}\n\nexport interface EmailVerificationStatusProps {\n\tstatus: \"sent\" | \"verified\" | \"error\" | \"expired\";\n\temail: string;\n\tonRetry?: () => void;\n\tclassName?: string;\n}\n\nexport interface ResendEmailButtonProps {\n\tonResend: () => void;\n\tdisabled?: boolean;\n\tremainingTime?: number;\n\tattempt?: number;\n\tmaxAttempts?: number;\n\tclassName?: string;\n\tsize?: SizeT;\n\tradius?: RadiusT;\n}\n\n// ============================================================================\n// Hook for Email Verification\n// ============================================================================\n\ninterface UseEmailVerificationProps {\n\torganizationId?: string;\n\temail?: string;\n\ttoken?: string;\n\tautoSubmit?: boolean;\n\tcodeLength?: number;\n\tresendDelay?: number;\n\tmaxResendAttempts?: number;\n\texpirationTime?: number;\n\tonVerificationSuccess?: (result: {\n\t\temail: string;\n\t\tverified: boolean;\n\t}) => void;\n\tonVerificationError?: (error: Error) => void;\n\tonCodeSent?: () => void;\n\tonCodeResent?: (attempt: number) => void;\n}\n\nfunction useEmailVerification({\n\torganizationId,\n\temail: inputEmail,\n\tautoSubmit = true,\n\tcodeLength = 6,\n\tresendDelay = 30,\n\tmaxResendAttempts = 3,\n\texpirationTime = 300, // 5 minutes\n\tonVerificationSuccess,\n\tonVerificationError,\n\tonCodeSent,\n\tonCodeResent,\n\ttoken,\n}: UseEmailVerificationProps) {\n\tconst {\n\t\tresendVerification,\n\t\tverifyIdentity,\n\t\textractEmailFromUrl,\n\t\textractTokenFromUrl,\n\t} = useAuth();\n\tconst [code, setCode] = useState(\"\");\n\tconst [status, setStatus] = useState<\n\t\t\"idle\" | \"sending\" | \"sent\" | \"verifying\" | \"verified\" | \"error\" | \"expired\"\n\t>(\"idle\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [resendAttempts, setResendAttempts] = useState(0);\n\tconst [timeRemaining, setTimeRemaining] = useState(0);\n\tconst [expiresAt, setExpiresAt] = useState<Date | null>(null);\n\n\t// Extract token from URL or use provided token\n\tconst verificationToken = useMemo(() => {\n\t\treturn token || extractTokenFromUrl();\n\t}, [token, extractTokenFromUrl]);\n\n\t// Extract token from URL or use provided token\n\tconst email = useMemo(() => {\n\t\treturn inputEmail || extractEmailFromUrl();\n\t}, [inputEmail, extractEmailFromUrl]);\n\n\t// Timer effect for resend delay\n\tuseEffect(() => {\n\t\tif (timeRemaining > 0) {\n\t\t\tconst timer = setTimeout(\n\t\t\t\t() => setTimeRemaining((prev) => prev - 1),\n\t\t\t\t1000,\n\t\t\t);\n\t\t\treturn () => clearTimeout(timer);\n\t\t}\n\t}, [timeRemaining]);\n\n\t// Timer effect for expiration\n\tuseEffect(() => {\n\t\tif (expiresAt) {\n\t\t\tconst checkExpiration = () => {\n\t\t\t\tif (new Date() > expiresAt) {\n\t\t\t\t\tsetStatus(\"expired\");\n\t\t\t\t\tsetError(\"Verification code has expired\");\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst timer = setInterval(checkExpiration, 1000);\n\t\t\treturn () => clearInterval(timer);\n\t\t}\n\t}, [expiresAt]);\n\n\t// Auto-submit when code is complete\n\tuseEffect(() => {\n\t\tif (autoSubmit && code.length === codeLength && status === \"sent\") {\n\t\t\thandleVerify();\n\t\t}\n\t}, [code, codeLength, autoSubmit, status]);\n\n\t// Auto-submit token is complete\n\tuseEffect(() => {\n\t\tif (verificationToken && verificationToken !== \"\") {\n\t\t\thandleAutoVerify();\n\t\t}\n\t}, [code, codeLength, autoSubmit, status]);\n\n\t// Handle verification\n\tconst handleAutoVerify = useCallback(async () => {\n\t\tif (!verificationToken) {\n\t\t\tsetStatus(\"error\");\n\t\t\tsetError(\"No verification token found.\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetStatus(\"verifying\");\n\t\t\tsetError(null);\n\n\t\t\tconst response = await verifyIdentity(\"email\", {\n\t\t\t\ttoken: verificationToken,\n\t\t\t});\n\n\t\t\tif (response.verified) {\n\t\t\t\tsetStatus(\"verified\");\n\t\t\t\tonVerificationSuccess?.({\n\t\t\t\t\temail: email || \"\",\n\t\t\t\t\tverified: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthrow new Error(response.message ?? \"Invalid verification code\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error ? err : new Error(\"Verification failed\");\n\t\t\tsetStatus(\"error\");\n\t\t\tsetError(error.message);\n\t\t\tonVerificationError?.(error);\n\t\t}\n\t}, [verificationToken]);\n\n\tconst sendCode = useCallback(async () => {\n\t\tif (!email || !organizationId) {\n\t\t\tsetError(\"Missing required parameters for email verification\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetStatus(\"sending\");\n\t\t\tsetError(null);\n\n\t\t\tconst response = await resendVerification({\n\t\t\t\temail: email,\n\t\t\t\ttype: \"email\",\n\t\t\t});\n\n\t\t\tif (response.success) {\n\t\t\t\tsetStatus(\"sent\");\n\t\t\t\tsetTimeRemaining(resendDelay);\n\t\t\t\tsetExpiresAt(new Date(Date.now() + expirationTime * 1000));\n\t\t\t\tonCodeSent?.();\n\t\t\t} else {\n\t\t\t\tthrow new Error(response.message || \"Failed to send verification code\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error\n\t\t\t\t\t? err\n\t\t\t\t\t: new Error(\"Failed to send verification code\");\n\t\t\tsetStatus(\"error\");\n\t\t\tsetError(error.message);\n\t\t\tonVerificationError?.(error);\n\t\t}\n\t}, [\n\t\temail,\n\t\torganizationId,\n\t\tresendVerification,\n\t\tresendDelay,\n\t\texpirationTime,\n\t\tonCodeSent,\n\t\tonVerificationError,\n\t]);\n\n\tconst resendCode = useCallback(async () => {\n\t\tif (resendAttempts >= maxResendAttempts) {\n\t\t\tsetError(\"Maximum resend attempts reached\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetResendAttempts((prev) => prev + 1);\n\t\t\tawait sendCode();\n\t\t\tonCodeResent?.(resendAttempts + 1);\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error\n\t\t\t\t\t? err\n\t\t\t\t\t: new Error(\"Failed to resend verification code\");\n\t\t\tonVerificationError?.(error);\n\t\t}\n\t}, [\n\t\tresendAttempts,\n\t\tmaxResendAttempts,\n\t\tsendCode,\n\t\tonCodeResent,\n\t\tonVerificationError,\n\t]);\n\n\tconst handleVerify = useCallback(async () => {\n\t\tif (!code || code.length !== codeLength) {\n\t\t\tsetError(\"Please enter a valid verification code\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!email || !organizationId) {\n\t\t\tsetError(\"Missing required parameters for verification\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetStatus(\"verifying\");\n\t\t\tsetError(null);\n\n\t\t\tconst response = await verifyIdentity(\"email\", {\n\t\t\t\tcode: code,\n\t\t\t\ttoken: verificationToken ?? \"\",\n\t\t\t});\n\n\t\t\tif (response.verified) {\n\t\t\t\tsetStatus(\"verified\");\n\t\t\t\tonVerificationSuccess?.({\n\t\t\t\t\temail: email || \"\",\n\t\t\t\t\tverified: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthrow new Error(\"Invalid verification code\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconst error =\n\t\t\t\terr instanceof Error ? err : new Error(\"Verification failed\");\n\t\t\tsetStatus(\"error\");\n\t\t\tsetError(error.message);\n\t\t\tonVerificationError?.(error);\n\t\t}\n\t}, [\n\t\tcode,\n\t\tcodeLength,\n\t\torganizationId,\n\t\tverifyIdentity,\n\t\temail,\n\t\ttoken,\n\t\tonVerificationSuccess,\n\t\tonVerificationError,\n\t]);\n\n\tconst reset = useCallback(() => {\n\t\tsetCode(\"\");\n\t\tsetStatus(\"idle\");\n\t\tsetError(null);\n\t\tsetResendAttempts(0);\n\t\tsetTimeRemaining(0);\n\t\tsetExpiresAt(null);\n\t}, []);\n\n\treturn {\n\t\tcode,\n\t\tsetCode,\n\t\tstatus,\n\t\terror,\n\t\tresendAttempts,\n\t\ttimeRemaining,\n\t\texpiresAt,\n\t\tcanResend: timeRemaining === 0 && resendAttempts < maxResendAttempts,\n\t\tsendCode,\n\t\tresendCode,\n\t\thandleVerify,\n\t\treset,\n\t};\n}\n\n// ============================================================================\n// Main Email Verification Component\n// ============================================================================\n\nexport const EmailVerification = withErrorBoundary(function EmailVerification({\n\temail,\n\torganizationId,\n\tautoSubmit = true,\n\tcodeLength = 6,\n\tresendDelay = 30,\n\tmaxResendAttempts = 3,\n\texpirationTime = 300,\n\tonVerificationSuccess,\n\tonVerificationError,\n\tonCodeSent,\n\tonCodeResent,\n\tclassName,\n\tstyle,\n\tdisabled = false,\n\tsize = \"md\",\n\tradius = \"md\",\n}: EmailVerificationProps) {\n\tconst { config, components } = useConfig();\n\tconst {\n\t\tcode,\n\t\tsetCode,\n\t\tstatus,\n\t\terror,\n\t\tresendAttempts,\n\t\ttimeRemaining,\n\t\tcanResend,\n\t\tsendCode,\n\t\tresendCode,\n\t\thandleVerify,\n\t} = useEmailVerification({\n\t\temail,\n\t\torganizationId,\n\t\tautoSubmit,\n\t\tcodeLength,\n\t\tresendDelay,\n\t\tmaxResendAttempts,\n\t\texpirationTime,\n\t\tonVerificationSuccess,\n\t\tonVerificationError,\n\t\tonCodeSent,\n\t\tonCodeResent,\n\t});\n\n\tconst Button = components.Button ?? HeroButton;\n\n\tconst handleCodeChange = (value: string) => {\n\t\tif (value.length <= codeLength) {\n\t\t\tsetCode(value);\n\t\t}\n\t};\n\n\tconst handleSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\t\thandleVerify();\n\t};\n\n\tconst renderContent = () => {\n\t\tif (status === \"verified\") {\n\t\t\treturn (\n\t\t\t\t<div className=\"text-center py-8\">\n\t\t\t\t\t<CheckCircleIcon className=\"h-16 w-16 text-success mx-auto mb-4\" />\n\t\t\t\t\t<h3 className=\"text-lg font-semibold mb-2\">Email Verified!</h3>\n\t\t\t\t\t<p className=\"text-default-500\">\n\t\t\t\t\t\tYour email address has been successfully verified.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (status === \"expired\") {\n\t\t\treturn (\n\t\t\t\t<div className=\"text-center py-8\">\n\t\t\t\t\t<XCircleIcon className=\"h-16 w-16 text-warning mx-auto mb-4\" />\n\t\t\t\t\t<h3 className=\"text-lg font-semibold mb-2\">Code Expired</h3>\n\t\t\t\t\t<p className=\"text-default-500 mb-4\">\n\t\t\t\t\t\tThe verification code has expired. Please request a new one.\n\t\t\t\t\t</p>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\tonClick={sendCode}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\tradius={radius}\n\t\t\t\t\t\tstartContent={<ArrowPathIcon className=\"h-4 w-4\" />}\n\t\t\t\t\t>\n\t\t\t\t\t\tSend New Code\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<form onSubmit={handleSubmit} className=\"space-y-4\">\n\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t<EnvelopeIcon className=\"h-12 w-12 text-primary mx-auto mb-4\" />\n\t\t\t\t\t<h3 className=\"text-lg font-semibold mb-2\">Verify Your Email</h3>\n\t\t\t\t\t{email && (\n\t\t\t\t\t\t<p className=\"text-default-500 mb-4\">\n\t\t\t\t\t\t\tWe've sent a verification code to {email}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{error && <VerificationError error={error} />}\n\n\t\t\t\t{email && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<VerificationInput\n\t\t\t\t\t\t\t\tvalue={code}\n\t\t\t\t\t\t\t\tonChange={handleCodeChange}\n\t\t\t\t\t\t\t\tlength={codeLength}\n\t\t\t\t\t\t\t\tdisabled={disabled || status === \"verifying\"}\n\t\t\t\t\t\t\t\tplaceholder=\"Enter verification code\"\n\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\tradius={radius}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\tradius={radius}\n\t\t\t\t\t\t\t\tisLoading={status === \"verifying\"}\n\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\tdisabled ||\n\t\t\t\t\t\t\t\t\tcode.length !== codeLength ||\n\t\t\t\t\t\t\t\t\tstatus === \"verifying\"\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{status === \"verifying\" ? \"Verifying...\" : \"Verify Email\"}\n\t\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-default-500\">\n\t\t\t\t\t\t\t\t\tDidn't receive the code?\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<ResendEmailButton\n\t\t\t\t\t\t\t\t\tonResend={resendCode}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || !canResend}\n\t\t\t\t\t\t\t\t\tremainingTime={timeRemaining}\n\t\t\t\t\t\t\t\t\tattempt={resendAttempts}\n\t\t\t\t\t\t\t\t\tmaxAttempts={maxResendAttempts}\n\t\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\t\tradius={radius}\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\n\t\t\t\t\t\t{status === \"idle\" && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t\t\tvariant=\"flat\"\n\t\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\t\tradius={radius}\n\t\t\t\t\t\t\t\tonClick={sendCode}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tisLoading={status === \"sending\"}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{status === \"sending\" ? \"Sending...\" : \"Send Verification Code\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className={className} style={style}>\n\t\t\t{renderContent()}\n\t\t</div>\n\t);\n});\n"],"names":["useEmailVerification","organizationId","inputEmail","autoSubmit","codeLength","resendDelay","maxResendAttempts","expirationTime","onVerificationSuccess","onVerificationError","onCodeSent","onCodeResent","token","resendVerification","verifyIdentity","extractEmailFromUrl","extractTokenFromUrl","useAuth","code","setCode","useState","status","setStatus","error","setError","resendAttempts","setResendAttempts","timeRemaining","setTimeRemaining","expiresAt","setExpiresAt","verificationToken","useMemo","email","useEffect","timer","prev","handleVerify","handleAutoVerify","useCallback","response","err","sendCode","resendCode","reset","EmailVerification","withErrorBoundary","className","style","disabled","size","radius","config","components","useConfig","canResend","Button","HeroButton","handleCodeChange","value","handleSubmit","e","renderContent","jsxs","jsx","CheckCircleIcon","XCircleIcon","ArrowPathIcon","EnvelopeIcon","VerificationError","Fragment","VerificationInput","ResendEmailButton"],"mappings":"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"}