// File: monorepo/web/maplefile-frontend/src/pages/Anonymous/Register/VerifySuccess.jsx // UIX version - Registration Success (100% UIX Components) import { useState, useEffect, useCallback, useMemo, useRef } from "react"; import { useNavigate } from "react-router"; import { Card, Button, Alert, GDPRFooter, Navigation, PageContainer, } from "../../../components/UIX"; import { useUIXTheme } from "../../../components/UIX/themes/useUIXTheme"; import { ArrowRightIcon, CheckCircleIcon, LockClosedIcon, ShieldCheckIcon, UserIcon, DocumentCheckIcon, KeyIcon, CloudArrowUpIcon, SparklesIcon, InformationCircleIcon, } from "@heroicons/react/24/outline"; const VerifySuccess = () => { const navigate = useNavigate(); const { getThemeClasses } = useUIXTheme(); // Refs for cleanup const isMountedRef = useRef(true); const timerRef = useRef(null); const [email, setEmail] = useState(""); const [userRole, setUserRole] = useState(null); const [countdown, setCountdown] = useState(10); useEffect(() => { isMountedRef.current = true; // Get data from sessionStorage const registeredEmail = sessionStorage.getItem("registeredEmail"); const storedUserRole = sessionStorage.getItem("userRole"); if (!registeredEmail || !storedUserRole) { // Redirect back to registration if no data found if (import.meta.env.DEV) { console.log("[VerifySuccess] No registration data found, redirecting to register"); } navigate("/register"); return; } // Validate email format to prevent XSS/tampering const emailRegex = /^[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; if (!emailRegex.test(registeredEmail)) { if (import.meta.env.DEV) { console.error("[VerifySuccess] Invalid email format in sessionStorage"); } sessionStorage.removeItem("registeredEmail"); sessionStorage.removeItem("userRole"); navigate("/register"); return; } // Validate user role (must be 1, 2, or 3) const roleNumber = parseInt(storedUserRole, 10); if (isNaN(roleNumber) || roleNumber < 1 || roleNumber > 3) { if (import.meta.env.DEV) { console.error("[VerifySuccess] Invalid user role in sessionStorage"); } sessionStorage.removeItem("registeredEmail"); sessionStorage.removeItem("userRole"); navigate("/register"); return; } if (isMountedRef.current) { setEmail(registeredEmail); setUserRole(roleNumber); } return () => { isMountedRef.current = false; if (timerRef.current) { clearInterval(timerRef.current); } }; }, [navigate]); // Auto-redirect countdown useEffect(() => { timerRef.current = setInterval(() => { setCountdown((prev) => { if (prev <= 1) { return 0; } return prev - 1; }); }, 1000); return () => { if (timerRef.current) { clearInterval(timerRef.current); } }; }, []); // Separate effect to handle navigation when countdown reaches 0 useEffect(() => { if (countdown === 0) { // Clear session storage before redirecting sessionStorage.removeItem("registrationResult"); sessionStorage.removeItem("registeredEmail"); sessionStorage.removeItem("userRole"); navigate("/login"); } }, [countdown, navigate]); const getUserRoleText = useCallback((role) => { switch (role) { case 1: return { text: "Root User", className: "bg-purple-100 text-purple-700", }; case 2: return { text: "Company User", className: "bg-blue-100 text-blue-700", }; case 3: return { text: "Individual User", className: "bg-green-100 text-green-700", }; default: return { text: "Unknown", className: "bg-gray-100 text-gray-700", }; } }, []); const handleRegisterAnother = useCallback(() => { // Clear session storage sessionStorage.removeItem("registrationResult"); sessionStorage.removeItem("registeredEmail"); sessionStorage.removeItem("userRole"); navigate("/register"); }, [navigate]); const handleGoToLogin = useCallback(() => { // Clear session storage sessionStorage.removeItem("registrationResult"); sessionStorage.removeItem("registeredEmail"); sessionStorage.removeItem("userRole"); // Navigate to login page navigate("/login"); }, [navigate]); // Memoize role info const roleInfo = useMemo(() => getUserRoleText(userRole), [userRole, getUserRoleText]); // Memoize navigation links const navLinks = useMemo(() => [], []); // No links on success page if (!email || userRole === null) { return (

Loading...

Loading success page...

); } return ( {/* Navigation */}
Registration Complete
{/* Main Content */}
{/* Success Animation */}

Welcome to MapleFile!

Your account has been successfully created

{/* GDPR Notice */}

Data Processing Notice

Your account data is stored securely and processed in compliance with GDPR. You have the right to access, rectify, or delete your data at any time. (Legal basis: Contract - necessary for service provision)

{/* Account Details Card */}

Account Details

Email Address {email}
User Role {roleInfo.text}
Account Status Active
{/* What's Next Section */}

What's Next?

Secure Your Recovery Phrase

Keep your 12-word recovery phrase in a safe place

Start Uploading Files

Your files are encrypted before leaving your device

Organize Your Documents

Create collections to organize your files

Share Securely

Share files with end-to-end encryption

{/* Security Reminder */}

Security Reminder

Your account uses end-to-end encryption. Your recovery phrase is the only way to recover your data if you forget your password. Make sure it's stored securely in a physical location!

{/* Auto-redirect Notice */}

Redirecting to login page in{" "} {countdown}{" "} seconds...

{/* Action Buttons */}
{/* Footer */} {/* CSS Animations */}
); }; export default VerifySuccess;