// File: monorepo/web/maplefile-frontend/src/pages/Anonymous/Recovery/InitiateRecovery.jsx // UIX version - Theme-aware Account Recovery with UIX components import React, { useState, useCallback, useRef, useEffect } from "react"; import { useNavigate, Link } from "react-router"; import { useServices } from "../../../services/Services"; import { Button, Input, Alert, Card, GDPRFooter, ProgressIndicator, NavBar, AuthPageHeader } from "../../../components/UIX"; import { useUIXTheme } from "../../../components/UIX/themes/useUIXTheme"; import { ArrowRightIcon, ArrowLeftIcon, CheckIcon, EnvelopeIcon, KeyIcon, } from "@heroicons/react/24/outline"; const InitiateRecovery = () => { const navigate = useNavigate(); const { recoveryManager } = useServices(); const { getThemeClasses } = useUIXTheme(); const [email, setEmail] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); // Refs for cleanup const isMountedRef = useRef(true); // Cleanup on unmount useEffect(() => { isMountedRef.current = true; return () => { isMountedRef.current = false; }; }, []); const handleSubmit = useCallback(async (e) => { e.preventDefault(); setLoading(true); setError(""); try { // Validate email if (!email) { throw new Error("Email address is required"); } if (!email.includes("@")) { throw new Error("Please enter a valid email address"); } if (import.meta.env.DEV) { console.log("[InitiateRecovery] Starting recovery process"); } const response = await recoveryManager.initiateRecovery(email); if (import.meta.env.DEV) { console.log("[InitiateRecovery] Recovery initiated successfully"); console.log("[InitiateRecovery] Response:", response); console.log("[InitiateRecovery] session_id:", response.session_id); console.log("[InitiateRecovery] encrypted_challenge:", response.encrypted_challenge); } // Check if session was actually created (user exists) if (!response.session_id || !response.encrypted_challenge) { // User not found - show generic message for security (prevents email enumeration) if (isMountedRef.current) { setError( "Unable to initiate recovery. Please ensure you entered the correct email address associated with your account. If you need assistance, please contact support.", ); } return; } // Navigate to verification step navigate("/recovery/verify"); } catch (error) { if (import.meta.env.DEV) { console.error("[InitiateRecovery] Recovery initiation failed:", error); } if (isMountedRef.current) { setError(error.message); } } finally { if (isMountedRef.current) { setLoading(false); } } }, [email, recoveryManager, navigate]); const handleBackToLogin = useCallback(() => { navigate("/login"); }, [navigate]); return (
{/* Navigation */} {/* Main Content */}
{/* Progress Indicator */} {/* Header */} {/* Important Notice */}

Before You Begin

You'll need your 12-word recovery phrase to complete this process. Make sure you have it ready before proceeding.

{/* Form Card */}
{/* Error Message */} {error && (

Recovery Error

{error}

)} {/* Form */}
{/* GDPR Notice */}

Data Processing Notice

Your email is temporarily stored in your browser to verify your identity—see our{" "} Privacy Policy {" "} for full details.

{/* Back to Login Button */}
{/* Footer */}
); }; export default InitiateRecovery;