@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
1 lines • 35.4 kB
Source Map (JSON)
{"version":3,"file":"forgot-password.cjs","sources":["../../../../../src/components/auth/password/forgot-password.tsx"],"sourcesContent":["/**\n * @frank-auth/react - Forgot Password and Reset Password Components\n *\n * Components for password recovery flow including forgot password request\n * and password reset with token verification.\n */\n\n\"use client\";\n\nimport { Divider, Button as HButton, Link, Spinner } from \"@/components/ui\";\nimport {\n\tArrowLeftIcon,\n\tCheckCircleIcon,\n\tEnvelopeIcon,\n\tExclamationTriangleIcon,\n\tKeyIcon,\n} from \"@heroicons/react/24/outline\";\nimport { motion } from \"framer-motion\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport { useAuth } from \"../../../hooks/use-auth\";\nimport { useConfig } from \"../../../hooks/use-config\";\nimport { useMagicLink } from \"../../../hooks/use-magic-link\";\nimport type { RadiusT, SizeT } from \"../../../types\";\nimport EmailField from \"../../forms/email-field\";\nimport FormWrapper from \"../../forms/form-wrapper\";\nimport PasswordField from \"../../forms/password-field\";\n\n// ============================================================================\n// Forgot Password Types\n// ============================================================================\n\nexport interface ForgotPasswordProps {\n\t/**\n\t * Initial email value\n\t */\n\temail?: string;\n\n\t/**\n\t * Success callback\n\t */\n\tonSuccess?: (email: string) => void;\n\n\t/**\n\t * Error callback\n\t */\n\tonError?: (error: Error) => void;\n\n\t/**\n\t * Custom title\n\t */\n\ttitle?: string;\n\n\t/**\n\t * Custom subtitle\n\t */\n\tsubtitle?: string;\n\n\t/**\n\t * Redirect URL for reset link\n\t */\n\tredirectUrl?: string;\n\n\t/**\n\t * Component variant\n\t */\n\tvariant?: \"default\" | \"card\" | \"modal\";\n\n\t/**\n\t * Size\n\t */\n\tsize?: SizeT;\n\n\t/**\n\t * Radius\n\t */\n\tradius?: RadiusT;\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Show back to sign in link\n\t */\n\tshowBackLink?: boolean;\n\n\t/**\n\t * Organization ID for branded reset\n\t */\n\torganizationId?: string;\n}\n\n// ============================================================================\n// Reset Password Types\n// ============================================================================\n\nexport interface ResetPasswordProps {\n\t/**\n\t * Reset token (if not in URL)\n\t */\n\ttoken?: string;\n\n\t/**\n\t * Success callback\n\t */\n\tonSuccess?: (result: any) => void;\n\n\t/**\n\t * Error callback\n\t */\n\tonError?: (error: Error) => void;\n\n\t/**\n\t * Custom title\n\t */\n\ttitle?: string;\n\n\t/**\n\t * Custom subtitle\n\t */\n\tsubtitle?: string;\n\n\t/**\n\t * Redirect URL after success\n\t */\n\tredirectUrl?: string;\n\n\t/**\n\t * Component variant\n\t */\n\tvariant?: \"default\" | \"card\" | \"modal\";\n\n\t/**\n\t * Size\n\t */\n\tsize?: SizeT;\n\n\t/**\n\t * Radius\n\t */\n\tradius?: RadiusT;\n\n\t/**\n\t * Custom className\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Auto-verify token on mount\n\t */\n\tautoVerify?: boolean;\n\n\t/**\n\t * Password requirements\n\t */\n\tpasswordRequirements?: {\n\t\tminLength?: number;\n\t\trequireUppercase?: boolean;\n\t\trequireLowercase?: boolean;\n\t\trequireNumbers?: boolean;\n\t\trequireSymbols?: boolean;\n\t};\n}\n\n// ============================================================================\n// Password Strength Checker\n// ============================================================================\n\nconst PasswordStrengthIndicator = React.memo(\n\t({\n\t\tpassword,\n\t\trequirements = {\n\t\t\tminLength: 8,\n\t\t\trequireUppercase: true,\n\t\t\trequireLowercase: true,\n\t\t\trequireNumbers: true,\n\t\t\trequireSymbols: false,\n\t\t},\n\t}: {\n\t\tpassword: string;\n\t\trequirements?: {\n\t\t\tminLength?: number;\n\t\t\trequireUppercase?: boolean;\n\t\t\trequireLowercase?: boolean;\n\t\t\trequireNumbers?: boolean;\n\t\t\trequireSymbols?: boolean;\n\t\t};\n\t}) => {\n\t\tconst checks = useMemo(() => {\n\t\t\tconst results = [];\n\n\t\t\tif (requirements.minLength) {\n\t\t\t\tresults.push({\n\t\t\t\t\tlabel: `At least ${requirements.minLength} characters`,\n\t\t\t\t\tpassed: password.length >= requirements.minLength,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (requirements.requireUppercase) {\n\t\t\t\tresults.push({\n\t\t\t\t\tlabel: \"One uppercase letter\",\n\t\t\t\t\tpassed: /[A-Z]/.test(password),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (requirements.requireLowercase) {\n\t\t\t\tresults.push({\n\t\t\t\t\tlabel: \"One lowercase letter\",\n\t\t\t\t\tpassed: /[a-z]/.test(password),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (requirements.requireNumbers) {\n\t\t\t\tresults.push({\n\t\t\t\t\tlabel: \"One number\",\n\t\t\t\t\tpassed: /\\d/.test(password),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (requirements.requireSymbols) {\n\t\t\t\tresults.push({\n\t\t\t\t\tlabel: \"One special character\",\n\t\t\t\t\tpassed: /[!@#$%^&*(),.?\":{}|<>]/.test(password),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn results;\n\t\t}, [password, requirements]);\n\n\t\tconst passedCount = checks.filter((check) => check.passed).length;\n\t\tconst strength = Math.round((passedCount / checks.length) * 100);\n\n\t\tconst getStrengthColor = () => {\n\t\t\tif (strength < 40) return \"bg-danger-500\";\n\t\t\tif (strength < 70) return \"bg-warning-500\";\n\t\t\treturn \"bg-success-500\";\n\t\t};\n\n\t\tconst getStrengthText = () => {\n\t\t\tif (strength < 40) return \"Weak\";\n\t\t\tif (strength < 70) return \"Medium\";\n\t\t\treturn \"Strong\";\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{/* Strength Bar */}\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<div className=\"flex justify-between text-sm\">\n\t\t\t\t\t\t<span className=\"text-default-600\">Password strength</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`font-medium ${\n\t\t\t\t\t\t\t\tstrength < 40\n\t\t\t\t\t\t\t\t\t? \"text-danger-600\"\n\t\t\t\t\t\t\t\t\t: strength < 70\n\t\t\t\t\t\t\t\t\t\t? \"text-warning-600\"\n\t\t\t\t\t\t\t\t\t\t: \"text-success-600\"\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{getStrengthText()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"w-full bg-default-200 rounded-full h-2\">\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tclassName={`h-2 rounded-full ${getStrengthColor()}`}\n\t\t\t\t\t\t\tinitial={{ width: 0 }}\n\t\t\t\t\t\t\tanimate={{ width: `${strength}%` }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.3 }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Requirements Checklist */}\n\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t{checks.map((check, index) => (\n\t\t\t\t\t\t<div key={index} className=\"flex items-center gap-2 text-sm\">\n\t\t\t\t\t\t\t<CheckCircleIcon\n\t\t\t\t\t\t\t\tclassName={`w-4 h-4 ${\n\t\t\t\t\t\t\t\t\tcheck.passed ? \"text-success-600\" : \"text-default-300\"\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<span\n\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\tcheck.passed\n\t\t\t\t\t\t\t\t\t\t? \"text-success-700 dark:text-success-400\"\n\t\t\t\t\t\t\t\t\t\t: \"text-default-500\"\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{check.label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPasswordStrengthIndicator.displayName = \"PasswordStrengthIndicator\";\n\n// ============================================================================\n// Forgot Password Component\n// ============================================================================\n\nexport function ForgotPassword({\n\temail: initialEmail = \"\",\n\tonSuccess,\n\tonError,\n\ttitle = \"Forgot Password\",\n\tsubtitle = \"Enter your email address and we'll send you a link to reset your password.\",\n\tredirectUrl,\n\tvariant = \"default\",\n\tsize = \"md\",\n\tradius = \"md\",\n\tclassName = \"\",\n\tshowBackLink = true,\n\torganizationId,\n}: ForgotPasswordProps) {\n\tconst { isValidEmail } = useMagicLink();\n\tconst { requestPasswordReset, isLoading } = useAuth();\n\tconst { components, linksPath } = useConfig();\n\n\tconst [email, setEmail] = useState(initialEmail);\n\tconst [sent, setSent] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst Button = components.Button ?? HButton;\n\n\t// Handle form submission\n\tconst handleSubmit = useCallback(\n\t\tasync (e: React.FormEvent) => {\n\t\t\te.preventDefault();\n\t\t\tsetError(null);\n\n\t\t\tif (!email) {\n\t\t\t\tsetError(\"Please enter your email address\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isValidEmail(email)) {\n\t\t\t\tsetError(\"Please enter a valid email address\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Get the origin URL, fallback to relative path if window is not available\n\t\t\t\tconst getResetUrl = () => {\n\t\t\t\t\tif (redirectUrl) return redirectUrl;\n\n\t\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\t\treturn `${window.location.origin}/auth/reset-password`;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fallback for SSR - use relative path\n\t\t\t\t\treturn \"/auth/reset-password\";\n\t\t\t\t};\n\n\t\t\t\tconst resetUrl = getResetUrl();\n\n\t\t\t\tconst result = await requestPasswordReset({\n\t\t\t\t\temail,\n\t\t\t\t\tredirectUrl: resetUrl,\n\t\t\t\t\t// organizationId,\n\t\t\t\t});\n\n\t\t\t\tif (result.success) {\n\t\t\t\t\tsetSent(true);\n\t\t\t\t\tonSuccess?.(email);\n\t\t\t\t} else {\n\t\t\t\t\tsetError(result.error || \"Failed to send reset link\");\n\t\t\t\t\tonError?.(new Error(result.error || \"Failed to send reset link\"));\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terr instanceof Error ? err.message : \"Failed to send reset link\";\n\t\t\t\tsetError(errorMessage);\n\t\t\t\tonError?.(err instanceof Error ? err : new Error(errorMessage));\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\temail,\n\t\t\tisValidEmail,\n\t\t\trequestPasswordReset,\n\t\t\tredirectUrl,\n\t\t\torganizationId,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t],\n\t);\n\n\t// Handle resend\n\tconst handleResend = useCallback(async () => {\n\t\tsetSent(false);\n\t\tsetError(null);\n\t}, []);\n\n\t// Form wrapper props\n\tconst formWrapperProps = useMemo(\n\t\t() => ({\n\t\t\tsize,\n\t\t\tvariant: \"flat\" as const,\n\t\t\tclassName: `space-y-6 ${className}`,\n\t\t\ttitle,\n\t\t\tsubtitle: sent ? undefined : subtitle,\n\t\t\tshowCard: variant === \"card\",\n\t\t}),\n\t\t[size, className, title, subtitle, variant, sent],\n\t);\n\n\t// Success state\n\tif (sent) {\n\t\treturn (\n\t\t\t<FormWrapper {...formWrapperProps}>\n\t\t\t\t<div className=\"text-center space-y-4\">\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ scale: 0 }}\n\t\t\t\t\t\tanimate={{ scale: 1 }}\n\t\t\t\t\t\tclassName=\"mx-auto w-16 h-16 rounded-full bg-success-100 dark:bg-success-900/30 flex items-center justify-center\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<EnvelopeIcon className=\"w-8 h-8 text-success-600\" />\n\t\t\t\t\t</motion.div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h3 className=\"text-xl font-semibold text-foreground mb-2\">\n\t\t\t\t\t\t\tCheck Your Email\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<p className=\"text-default-500 text-sm\">\n\t\t\t\t\t\t\tWe've sent a password reset link to <strong>{email}</strong>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t<p className=\"text-sm text-default-400\">\n\t\t\t\t\t\t\tDidn't receive the email? Check your spam folder.\n\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t<Button variant=\"light\" size=\"sm\" onPress={handleResend}>\n\t\t\t\t\t\t\tSend Another Email\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{showBackLink && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Divider className=\"my-4\" />\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\thref={linksPath?.signIn || \"/auth/sign-in\"}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center gap-2 text-sm\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowLeftIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\tBack to Sign In\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</FormWrapper>\n\t\t);\n\t}\n\n\treturn (\n\t\t<FormWrapper {...formWrapperProps} onSubmit={handleSubmit}>\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t<EmailField\n\t\t\t\t\tlabel=\"Email Address\"\n\t\t\t\t\tname=\"email\"\n\t\t\t\t\tplaceholder=\"Enter your email address\"\n\t\t\t\t\tvalue={email}\n\t\t\t\t\tonChange={setEmail}\n\t\t\t\t\tstartContent={<EnvelopeIcon className=\"w-4 h-4 text-default-400\" />}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tradius={radius}\n\t\t\t\t\trequired\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\tvariant=\"bordered\"\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\n\t\t\t\t{error && (\n\t\t\t\t\t<div className=\"text-danger-600 text-sm bg-danger-50 dark:bg-danger-900/20 rounded-lg p-3\">\n\t\t\t\t\t\t{error}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\tsize={size}\n\t\t\t\t\tradius={radius}\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tisDisabled={!email || isLoading}\n\t\t\t\t>\n\t\t\t\t\t{isLoading ? \"Sending...\" : \"Send Reset Link\"}\n\t\t\t\t</Button>\n\n\t\t\t\t{showBackLink && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Divider className=\"my-4\" />\n\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\thref={linksPath?.signIn || \"/auth/sign-in\"}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center gap-2 text-sm\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowLeftIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\tBack to Sign In\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</FormWrapper>\n\t);\n}\n\n// ============================================================================\n// Reset Password Component\n// ============================================================================\n\nexport function ResetPassword({\n\ttoken,\n\tonSuccess,\n\tonError,\n\ttitle = \"Reset Password\",\n\tsubtitle = \"Enter your new password below.\",\n\tredirectUrl = \"/auth/sign-in\",\n\tvariant = \"default\",\n\tsize = \"md\",\n\tradius = \"md\",\n\tclassName = \"\",\n\tautoVerify = true,\n\tpasswordRequirements = {\n\t\tminLength: 8,\n\t\trequireUppercase: true,\n\t\trequireLowercase: true,\n\t\trequireNumbers: true,\n\t\trequireSymbols: false,\n\t},\n}: ResetPasswordProps) {\n\tconst { signIn, validateToken } = useAuth();\n\tconst { components, linksPath } = useConfig();\n\tconst { extractTokenFromUrl } = useMagicLink();\n\tconst { resetPassword } = useAuth();\n\n\tconst [password, setPassword] = useState(\"\");\n\tconst [confirmPassword, setConfirmPassword] = useState(\"\");\n\tconst [isLoading, setIsLoading] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [tokenStatus, setTokenStatus] = useState<\n\t\t\"idle\" | \"verifying\" | \"valid\" | \"invalid\"\n\t>(\"idle\");\n\tconst [resetToken, setResetToken] = useState<string | null>(null);\n\n\tconst Button = components.Button ?? HButton;\n\n\t// Extract token from URL or use provided token\n\tconst recoveryToken = useMemo(() => {\n\t\treturn token || extractTokenFromUrl();\n\t}, [token, extractTokenFromUrl]);\n\n\t// Verify token on mount\n\tuseEffect(() => {\n\t\tif (autoVerify && tokenStatus === \"idle\") {\n\t\t\tverifyResetToken();\n\t\t}\n\t}, [autoVerify, recoveryToken, tokenStatus]);\n\n\t// Verify reset token\n\tconst verifyResetToken = useCallback(async () => {\n\t\tif (!recoveryToken) {\n\t\t\tsetTokenStatus(\"invalid\");\n\t\t\tsetError(\"No reset token found in URL\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tsetTokenStatus(\"verifying\");\n\t\t\tsetError(null);\n\n\t\t\tconst result = await validateToken({\n\t\t\t\ttoken: recoveryToken,\n\t\t\t\ttype: \"password\",\n\t\t\t});\n\n\t\t\tif (result.success) {\n\t\t\t\tsetTokenStatus(\"valid\");\n\t\t\t\tsetResetToken(recoveryToken);\n\t\t\t} else {\n\t\t\t\tsetTokenStatus(\"invalid\");\n\t\t\t\tsetError(result.error || \"Invalid or expired reset link\");\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tsetTokenStatus(\"invalid\");\n\t\t\tconst errorMessage =\n\t\t\t\terr instanceof Error ? err.message : \"Failed to verify reset token\";\n\t\t\tsetError(errorMessage);\n\t\t\tonError?.(err instanceof Error ? err : new Error(errorMessage));\n\t\t}\n\t}, [recoveryToken, validateToken, onError]);\n\n\t// Validate password\n\tconst isPasswordValid = useMemo(() => {\n\t\tconst checks = [];\n\n\t\tif (passwordRequirements.minLength) {\n\t\t\tchecks.push(password.length >= passwordRequirements.minLength);\n\t\t}\n\n\t\tif (passwordRequirements.requireUppercase) {\n\t\t\tchecks.push(/[A-Z]/.test(password));\n\t\t}\n\n\t\tif (passwordRequirements.requireLowercase) {\n\t\t\tchecks.push(/[a-z]/.test(password));\n\t\t}\n\n\t\tif (passwordRequirements.requireNumbers) {\n\t\t\tchecks.push(/\\d/.test(password));\n\t\t}\n\n\t\tif (passwordRequirements.requireSymbols) {\n\t\t\tchecks.push(/[!@#$%^&*(),.?\":{}|<>]/.test(password));\n\t\t}\n\n\t\treturn checks.every((check) => check);\n\t}, [password, passwordRequirements]);\n\n\t// Handle form submission\n\tconst handleSubmit = useCallback(\n\t\tasync (e: React.FormEvent) => {\n\t\t\te.preventDefault();\n\t\t\tsetError(null);\n\n\t\t\tif (!password || !confirmPassword) {\n\t\t\t\tsetError(\"Please fill in all fields\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (password !== confirmPassword) {\n\t\t\t\tsetError(\"Passwords do not match\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isPasswordValid) {\n\t\t\t\tsetError(\"Password does not meet requirements\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!resetToken) {\n\t\t\t\tsetError(\"Invalid reset token\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tsetIsLoading(true);\n\n\t\t\t\t// Here you would call your reset password API\n\t\t\t\t// For now, we'll simulate with the auth hook\n\t\t\t\tconst result = await resetPassword({\n\t\t\t\t\ttoken: resetToken,\n\t\t\t\t\tnewPassword: password,\n\t\t\t\t});\n\n\t\t\t\tif (result.status === \"complete\" && result.user) {\n\t\t\t\t\tonSuccess?.(result);\n\n\t\t\t\t\t// Redirect after successful reset\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\t\t\twindow.location.href = redirectUrl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 2000);\n\t\t\t\t} else {\n\t\t\t\t\tsetError(result.error?.message || \"Failed to reset password\");\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\terr instanceof Error ? err.message : \"Failed to reset password\";\n\t\t\t\tsetError(errorMessage);\n\t\t\t\tonError?.(err instanceof Error ? err : new Error(errorMessage));\n\t\t\t} finally {\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tpassword,\n\t\t\tconfirmPassword,\n\t\t\tisPasswordValid,\n\t\t\tresetToken,\n\t\t\tresetPassword,\n\t\t\tonSuccess,\n\t\t\tonError,\n\t\t\tredirectUrl,\n\t\t],\n\t);\n\n\t// Form wrapper props\n\tconst formWrapperProps = useMemo(\n\t\t() => ({\n\t\t\tsize,\n\t\t\tvariant: \"flat\" as const,\n\t\t\tclassName: `space-y-6 ${className}`,\n\t\t\ttitle,\n\t\t\tsubtitle: tokenStatus === \"valid\" ? subtitle : undefined,\n\t\t\tshowCard: variant === \"card\",\n\t\t}),\n\t\t[size, className, title, subtitle, variant, tokenStatus],\n\t);\n\n\t// Token verification loading\n\tif (tokenStatus === \"verifying\") {\n\t\treturn (\n\t\t\t<FormWrapper {...formWrapperProps}>\n\t\t\t\t<div className=\"text-center space-y-4\">\n\t\t\t\t\t<Spinner size=\"lg\" />\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h3 className=\"text-xl font-semibold text-foreground mb-2\">\n\t\t\t\t\t\t\tVerifying Reset Link\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<p className=\"text-default-500 text-sm\">\n\t\t\t\t\t\t\tPlease wait while we verify your reset link...\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</FormWrapper>\n\t\t);\n\t}\n\n\t// Invalid token\n\tif (tokenStatus === \"invalid\") {\n\t\treturn (\n\t\t\t<FormWrapper {...formWrapperProps}>\n\t\t\t\t<div className=\"text-center space-y-4\">\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ scale: 0 }}\n\t\t\t\t\t\tanimate={{ scale: 1 }}\n\t\t\t\t\t\tclassName=\"mx-auto w-16 h-16 rounded-full bg-danger-100 dark:bg-danger-900/30 flex items-center justify-center\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ExclamationTriangleIcon className=\"w-8 h-8 text-danger-600\" />\n\t\t\t\t\t</motion.div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<h3 className=\"text-xl font-semibold text-foreground mb-2\">\n\t\t\t\t\t\t\tInvalid Reset Link\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<p className=\"text-default-500 text-sm\">\n\t\t\t\t\t\t\t{error || \"This password reset link is invalid or has expired.\"}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tas={Link}\n\t\t\t\t\t\t\thref={linksPath?.forgotPassword || \"/auth/forgot-password\"}\n\t\t\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRequest New Reset Link\n\t\t\t\t\t\t</Button>\n\n\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\thref={linksPath?.signIn || \"/auth/sign-in\"}\n\t\t\t\t\t\t\t\tclassName=\"text-sm flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ArrowLeftIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\tBack to Sign In\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</FormWrapper>\n\t\t);\n\t}\n\n\t// Reset password form\n\treturn (\n\t\t<FormWrapper {...formWrapperProps} onSubmit={handleSubmit}>\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t<PasswordField\n\t\t\t\t\tlabel=\"New Password\"\n\t\t\t\t\tname=\"password\"\n\t\t\t\t\tplaceholder=\"Enter your new password\"\n\t\t\t\t\tvalue={password}\n\t\t\t\t\tonChange={setPassword}\n\t\t\t\t\tstartContent={<KeyIcon className=\"w-4 h-4 text-default-400\" />}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tradius={radius}\n\t\t\t\t\trequired\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\tvariant=\"bordered\"\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\n\t\t\t\t{password && (\n\t\t\t\t\t<PasswordStrengthIndicator\n\t\t\t\t\t\tpassword={password}\n\t\t\t\t\t\trequirements={passwordRequirements}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t<PasswordField\n\t\t\t\t\tlabel=\"Confirm Password\"\n\t\t\t\t\tname=\"confirmPassword\"\n\t\t\t\t\tplaceholder=\"Confirm your new password\"\n\t\t\t\t\tvalue={confirmPassword}\n\t\t\t\t\tonChange={setConfirmPassword}\n\t\t\t\t\tstartContent={<KeyIcon className=\"w-4 h-4 text-default-400\" />}\n\t\t\t\t\tsize={size}\n\t\t\t\t\tradius={radius}\n\t\t\t\t\trequired\n\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\tvariant=\"bordered\"\n\t\t\t\t/>\n\n\t\t\t\t{error && (\n\t\t\t\t\t<div className=\"text-danger-600 text-sm bg-danger-50 dark:bg-danger-900/20 rounded-lg p-3\">\n\t\t\t\t\t\t{error}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tcolor=\"primary\"\n\t\t\t\t\tsize={size}\n\t\t\t\t\tradius={radius}\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\tisDisabled={\n\t\t\t\t\t\t!password || !confirmPassword || !isPasswordValid || isLoading\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{isLoading ? \"Resetting...\" : \"Reset Password\"}\n\t\t\t\t</Button>\n\n\t\t\t\t<Divider className=\"my-4\" />\n\n\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\thref={linksPath?.signIn || \"/auth/sign-in\"}\n\t\t\t\t\t\tclassName=\"text-sm flex items-center justify-center gap-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ArrowLeftIcon className=\"w-4 h-4\" />\n\t\t\t\t\t\tBack to Sign In\n\t\t\t\t\t</Link>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</FormWrapper>\n\t);\n}\n\n// ============================================================================\n// Component Variants\n// ============================================================================\n\n/**\n * Forgot Password Card\n */\nexport function ForgotPasswordCard(\n\tprops: Omit<ForgotPasswordProps, \"variant\">,\n) {\n\treturn <ForgotPassword {...props} variant=\"card\" />;\n}\n\n/**\n * Reset Password Card\n */\nexport function ResetPasswordCard(props: Omit<ResetPasswordProps, \"variant\">) {\n\treturn <ResetPassword {...props} variant=\"card\" />;\n}\n\n// ============================================================================\n// Export\n// ============================================================================\n\nexport { ForgotPassword as default };\n"],"names":["PasswordStrengthIndicator","React","password","requirements","checks","useMemo","results","passedCount","check","strength","getStrengthColor","getStrengthText","jsxs","jsx","motion","index","CheckCircleIcon","ForgotPassword","initialEmail","onSuccess","onError","title","subtitle","redirectUrl","variant","size","radius","className","showBackLink","organizationId","isValidEmail","useMagicLink","requestPasswordReset","isLoading","useAuth","components","linksPath","useConfig","email","setEmail","useState","sent","setSent","error","setError","Button","HButton","handleSubmit","useCallback","e","resetUrl","result","err","errorMessage","handleResend","formWrapperProps","FormWrapper","EnvelopeIcon","Fragment","Divider","Link","ArrowLeftIcon","EmailField","ResetPassword","token","autoVerify","passwordRequirements","signIn","validateToken","extractTokenFromUrl","resetPassword","setPassword","confirmPassword","setConfirmPassword","setIsLoading","tokenStatus","setTokenStatus","resetToken","setResetToken","recoveryToken","useEffect","verifyResetToken","isPasswordValid","Spinner","ExclamationTriangleIcon","PasswordField","KeyIcon","ForgotPasswordCard","props","ResetPasswordCard"],"mappings":"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"}