import { useState, useCallback, useEffect } from 'react'; import { Link, useNavigate, useLocation } from 'react-router-dom'; import { useAuth } from '../../contexts/AuthContext'; export default function LoginPage() { const { login, isAuthenticated } = useAuth(); const navigate = useNavigate(); const location = useLocation(); const from = (location.state as { from?: Location })?.from?.pathname ?? '/'; const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [errors, setErrors] = useState<{ email?: string; password?: string; form?: string }>({}); const [loading, setLoading] = useState(false); useEffect(() => { if (isAuthenticated) navigate(from, { replace: true }); }, [isAuthenticated, from, navigate]); const validate = (): boolean => { const next: typeof errors = {}; if (!email.trim()) next.email = 'Email is required.'; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) next.email = 'Enter a valid email address.'; if (!password) next.password = 'Password is required.'; setErrors(next); return Object.keys(next).length === 0; }; const handleSubmit = useCallback(async (e: React.FormEvent) => { e.preventDefault(); if (!validate()) return; setLoading(true); const result = await login(email, password); setLoading(false); if (!result.success) { setErrors({ form: result.error }); } }, [email, password, login]); return (
Authentication

LOGIN

CROWMATE STUDIO / HEADLESS HAZARD COMMUNITY
{/* Demo hint */}
[DEMO] Quick login emails:
{[ { label: 'Dev/Admin', email: 'kestrel@crowmate.dev' }, { label: 'Com Staff', email: 'vesper@crowmate.dev' }, { label: 'User', email: 'glitch@mail.com' }, ].map(({ label, email: e }) => ( ))}
{errors.form && (
[ERROR] {errors.form}
)} {/* Email */}
{ setEmail(e.target.value); setErrors((p) => ({ ...p, email: undefined })); }} aria-describedby={errors.email ? 'email-error' : undefined} /> {errors.email &&
{errors.email}
}
{/* Password */}
{ setPassword(e.target.value); setErrors((p) => ({ ...p, password: undefined })); }} aria-describedby={errors.password ? 'pass-error' : undefined} /> {errors.password &&
{errors.password}
}
No account?{' '} Register here
); }