import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../contexts/AuthContext.jsx'; import { useToast } from '../contexts/ToastContext.jsx'; import { api } from '../utils/api.js'; import './Login.css'; import SupportModal from '../components/SupportModal.jsx'; export default function Login() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [rememberMe, setRememberMe] = useState(false); const [loading, setLoading] = useState(false); const [showSupport, setShowSupport] = useState(false); const [settings, setSettings] = useState({}); const { login } = useAuth(); const toast = useToast(); const nav = useNavigate(); useEffect(() => { api.getSettings().then(({ settings }) => setSettings(settings)).catch(() => {}); }, []); const handleSubmit = async (e) => { e.preventDefault(); setLoading(true); try { const data = await login(email, password, rememberMe); if (data.mustChangePassword) { nav('/change-password'); } else { nav('/'); } } catch (err) { if (err.message === 'suspended') { toast(`Your account has been suspended. Contact: ${err.adminEmail || 'your admin'} for assistance.`, 'error', 8000); } else { toast(err.message || 'Login failed', 'error'); } } finally { setLoading(false); } }; // Handle suspension error from API directly const handleLoginError = async (email, password, rememberMe) => { setLoading(true); try { const res = await fetch('/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password, rememberMe }) }); const data = await res.json(); if (!res.ok) { if (data.error === 'suspended') { toast(`Your account has been suspended. Contact ${data.adminEmail || 'your administrator'} for assistance.`, 'error', 8000); } else { toast(data.error || 'Login failed', 'error'); } return; } // Success handled by login function above } finally { setLoading(false); } }; const appName = settings.app_name || 'jama'; const logoUrl = settings.logo_url; return (
{logoUrl ? ( {appName} ) : ( jama )}

{appName}

Sign in to continue

{settings.pw_reset_active === 'true' && (
⚠️ ADMPW_RESET is enabled. The admin password is being reset on each restart. Disable ADMPW_RESET in your environment to stop this behavior.
)}
setEmail(e.target.value)} required autoFocus placeholder="your@email.com" />
setPassword(e.target.value)} required placeholder="••••••••" />
{showSupport && setShowSupport(false)} />}
); }