import React, { useState, useEffect } from 'react'; import { UserRole } from '../types'; import { LogIn, ShieldCheck, Construction, Calculator, Briefcase, User as UserIcon, Mail, Lock } from 'lucide-react'; interface AuthProps { onUserChange: (user: any | null) => void; } const Auth: React.FC = ({ onUserChange }) => { const [isSignup, setIsSignup] = useState(false); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [role, setRole] = useState('DIRECTOR'); const [error, setError] = useState(null); // Auto-login if token exists useEffect(() => { const token = localStorage.getItem('auth_token'); if (token) { fetch('/api/auth/me', { headers: { 'Authorization': `Bearer ${token}` } }) .then(res => { if (!res.ok) throw new Error("Invalid token"); return res.json(); }) .then(data => onUserChange(data.user)) .catch(err => { console.error("Auto-login failed:", err); localStorage.removeItem('auth_token'); localStorage.removeItem('local_user_uid'); }); } }, [onUserChange]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); try { const endpoint = isSignup ? '/api/auth/signup' : '/api/auth/login'; const body = isSignup ? { name, email, password, role } : { email, password }; const res = await fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const data = await res.json(); if (!res.ok) throw new Error(data.error || (isSignup ? "Signup failed" : "Login failed")); if (!isSignup) { if (data.token && data.user) { localStorage.setItem('auth_token', data.token); localStorage.setItem('local_user_uid', data.user.uid); onUserChange(data.user); } } else { setIsSignup(false); alert("Signup successful! Please login."); } } catch (e: any) { setError(e.message); } }; return (

BuildTrack

{isSignup ? 'Create an account to begin' : 'Welcome back'}

{error &&
{error}
}
{isSignup && (
setName(e.target.value)} className="w-full pl-10 pr-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-blue-600 outline-none text-sm transition-all" placeholder="Enter your name" />
)}
setEmail(e.target.value)} className="w-full pl-10 pr-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-blue-600 outline-none text-sm transition-all" placeholder="Enter email" />
setPassword(e.target.value)} className="w-full pl-10 pr-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:ring-2 focus:ring-blue-600 outline-none text-sm transition-all" placeholder="Enter password" />
{isSignup && (
{[ { r: 'DIRECTOR', icon: }, { r: 'MANAGER', icon: }, { r: 'ENGINEER', icon: }, { r: 'ACCOUNTANT', icon: } ].map((item) => ( ))}
)}
); }; export default Auth;