import React, { useState, useEffect } from 'react'; import { StorageService } from '../services/storageService'; import { PlatformService } from '../services/platformService'; import { useNavigate } from 'react-router-dom'; import { UserProfile, UserRole } from '../types'; import { Button } from '../components/ui/Button'; import { Loader2, Eye, EyeOff, GraduationCap, Users, BookOpen, Sun, Moon, KeyRound, ChevronLeft, AtSign, ArrowLeft, CheckSquare, Square, AlertCircle, ShieldCheck, X, Facebook, Globe } from 'lucide-react'; import { Logo } from '../components/ui/Logo'; const Auth: React.FC = () => { const [isLogin, setIsLogin] = useState(true); const [loading, setLoading] = useState(false); const [showPassword, setShowPassword] = useState(false); const [role, setRole] = useState('student'); const [error, setError] = useState(''); const [rememberMe, setRememberMe] = useState(true); const [isDarkMode, setIsDarkMode] = useState(() => { if (typeof window !== 'undefined') { const savedTheme = localStorage.getItem('theme'); if (savedTheme) return savedTheme === 'dark'; return true; } return true; }); const [showDemoMenu, setShowDemoMenu] = useState(false); const navigate = useNavigate(); const [formData, setFormData] = useState({ email: '', password: '', name: '', username: '', schoolName: '', birthCertificateId: '', studentId: '', guardianName: '', grade: '', subjects: '', profession: '' }); const [passwordStrength, setPasswordStrength] = useState(0); const [passwordFeedback, setPasswordFeedback] = useState([]); useEffect(() => { const root = window.document.documentElement; if (isDarkMode) { root.classList.add('dark'); localStorage.setItem('theme', 'dark'); } else { root.classList.remove('dark'); localStorage.setItem('theme', 'light'); } }, [isDarkMode]); const validatePassword = (pass: string) => { const feedback = []; let score = 0; if (pass.length >= 8) score++; else feedback.push("At least 8 characters"); if (/[A-Z]/.test(pass)) score++; else feedback.push("One uppercase letter"); if (/[0-9]/.test(pass)) score++; else feedback.push("One number"); if (/[^A-Za-z0-9]/.test(pass)) score++; else feedback.push("One special character"); if (pass.length > 12) score++; setPasswordStrength(score); setPasswordFeedback(feedback); return score; }; const handleChange = (e: React.ChangeEvent) => { setFormData({ ...formData, [e.target.name]: e.target.value }); if (e.target.name === 'password') { validatePassword(e.target.value); } }; const validateEmail = (email: string) => { return String(email) .toLowerCase() .match( /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ ); }; const handleDemoLogin = async (type: 'student' | 'teacher') => { setLoading(true); let email = ''; const password = 'demo123'; switch (type) { case 'student': email = 'student@demo.com'; break; case 'teacher': email = 'teacher@demo.com'; break; } try { const { success, error } = await StorageService.login(email, password, true); if (success) { navigate('/greeting'); } else { setError(error || "Demo login failed."); setLoading(false); } } catch (e) { setError("Login error"); setLoading(false); } }; const handleSocialLogin = async (provider: 'facebook' | 'google') => { setLoading(true); // Simulate API delay await new Promise(r => setTimeout(r, 1500)); // Simulate account linking PlatformService.connect(provider, { username: provider === 'facebook' ? 'fb_user' : 'goog_user' }); // Login with a demo account to proceed to app // In a real app, this would get a token and create/fetch a user const { success } = await StorageService.login('student@demo.com', 'demo123', true); if (success) { navigate('/greeting'); } else { setError("Social Auth Failed"); setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!validateEmail(formData.email)) { setError("Please enter a valid email address."); return; } if (!isLogin) { if (passwordStrength < 3) { setError("Password is too weak. Please meet the requirements."); return; } } setLoading(true); try { if (isLogin) { const { success, error } = await StorageService.login(formData.email, formData.password, rememberMe); if (success) { navigate('/greeting'); } else { setError(error || "Invalid credentials."); } } else { const newProfile: UserProfile = { id: '', email: formData.email, name: formData.name, username: formData.username || formData.email.split('@')[0], role: role, schoolName: (role === 'student' || role === 'teacher') ? formData.schoolName : undefined, birthCertificateId: role === 'student' ? formData.birthCertificateId : undefined, studentId: role === 'student' ? formData.studentId : undefined, guardianName: role === 'student' ? formData.guardianName : undefined, grade: role === 'student' ? formData.grade : undefined, subjects: (role === 'student' || role === 'teacher') && formData.subjects ? formData.subjects.split(',').map(s => s.trim()) : undefined, profession: role === 'citizen' ? formData.profession : (role === 'teacher' ? 'Teacher' : undefined), points: 0, xp: 0 }; const { success, error } = await StorageService.register(newProfile, formData.password, true); if (success) { navigate('/greeting'); } else { setError(error || "Registration failed."); } } } catch (err) { setError("An unexpected error occurred."); } finally { setLoading(false); } }; return (

Welcome to Rudraksha

Secure Digital Portal

{isLogin ? "Authenticate to Access World" : "Create your digital identity"}

{error && (
{error}
)} {!isLogin && (
{[{id: 'student', icon: GraduationCap, label: 'Student'}, {id: 'teacher', icon: BookOpen, label: 'Teacher'}, {id: 'citizen', icon: Users, label: 'Citizen'}].map((r) => ( ))}
)}
{!isLogin && formData.password && (
{[1, 2, 3, 4, 5].map((i) => (
= i ? (passwordStrength < 3 ? 'bg-red-500' : (passwordStrength < 4 ? 'bg-yellow-500' : 'bg-green-500')) : 'opacity-0' }`} /> ))}
)}
{isLogin && (
)} {!isLogin && (
)} {isLogin && (
Or Continue With
{!showDemoMenu ? ( ) : (
Select Role
)}
)}
); }; export default Auth;