import { useState, useEffect, type FormEvent } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { Eye, EyeOff } from 'lucide-react'; import { AUTH_TOKEN_KEY, loginUser, registerUser, type AuthUser } from '../lib/authClient'; import BrandLogo from './BrandLogo'; type AuthMode = 'login' | 'register'; type AuthPageProps = { onLoggedIn: (user: AuthUser) => void; initialMode?: AuthMode; onBackToLanding?: () => void; }; export default function AuthPage({ onLoggedIn, initialMode = 'login', onBackToLanding, }: AuthPageProps) { const [mode, setMode] = useState(initialMode); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const [showPassword, setShowPassword] = useState(false); const [error, setError] = useState(''); const [loading, setLoading] = useState(false); useEffect(() => { setMode(initialMode); setError(''); }, [initialMode]); const isLogin = mode === 'login'; const handleSubmit = async (event: FormEvent) => { event.preventDefault(); setLoading(true); setError(''); if (!email || !password) { setError('Please fill in all required fields.'); setLoading(false); return; } if (!isLogin) { if (!name.trim()) { setError('Please enter your full name.'); setLoading(false); return; } if (password !== confirmPassword) { setError('Passwords do not match.'); setLoading(false); return; } } if (password.length < 6) { setError('Password must be at least 6 characters long.'); setLoading(false); return; } try { if (isLogin) { const { token, user } = await loginUser(email, password); localStorage.setItem(AUTH_TOKEN_KEY, token); window.setTimeout(() => onLoggedIn(user), 450); } else { const { token, user } = await registerUser(email, password, name.trim()); localStorage.setItem(AUTH_TOKEN_KEY, token); window.setTimeout(() => onLoggedIn(user), 450); } } catch (err: unknown) { const message = err instanceof Error ? err.message : 'Something went wrong.'; setError(message); } finally { setLoading(false); } }; return (
{/* Background elements */}
{/* Box */} {/* Logo */}
{/* Toggle */}
{/* Welcome text */}

{isLogin ? "Welcome back. Let's get started." : 'Join us. Create your account.'}

{/* Form */}
{!isLogin && (
setName(e.target.value)} className="w-full rounded-md border border-transparent bg-[#1a1a1a] px-4 py-3 text-[14px] text-white placeholder-gray-500 outline-none transition-colors focus:border-white/10 focus:bg-[#222]" />
)}
setEmail(e.target.value)} className="w-full rounded-md border border-transparent bg-[#1a1a1a] px-4 py-3 text-[14px] text-white placeholder-gray-500 outline-none transition-colors focus:border-white/10 focus:bg-[#222]" />
setPassword(e.target.value)} className="w-full rounded-md border border-transparent bg-[#1a1a1a] py-3 pl-4 pr-10 text-[14px] text-white placeholder-gray-500 outline-none transition-colors focus:border-white/10 focus:bg-[#222]" />
{!isLogin && (
setConfirmPassword(e.target.value)} className="w-full rounded-md border border-transparent bg-[#1a1a1a] py-3 pl-4 pr-10 text-[14px] text-white placeholder-gray-500 outline-none transition-colors focus:border-white/10 focus:bg-[#222]" />
{password && confirmPassword && (
{password === confirmPassword ? ( Passwords match ) : ( Passwords do not match )}
)}
)}
{error &&
{error}
} {/* Separator */}
or
{/* Google button */} {/* Subtexts */}
Secured by RYP infrastructure
Skip & continue to{' '}
); } function CircuitCorner({ className }: { className?: string }) { return ( ); }