// ============================================================ // Login screen // ============================================================ const Login = ({ onLogin, authStatus = 'unauthenticated', onRetry }) => { const [selected, setSelected] = useState(null); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [error, setError] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const isLocalDemo = window.persistenceAdapter.mode === 'local_demo' && window.APP_CONFIG.AUTH.ALLOW_LOCAL_DEMO; const listaUsuarios = isLocalDemo ? window.persistenceAdapter.getLocalDemoUsers() : []; const safeErrorMessage = (loginError) => { if (loginError?.status === 401) return 'Usuario o contraseña incorrectos.'; if (loginError?.status === 403) return 'La cuenta se encuentra inactiva. Contacta al administrador.'; if (loginError?.status === 422) return 'Revisa los datos de acceso e inténtalo de nuevo.'; if (loginError?.status === 0) return 'No fue posible conectar con el servidor. Verifica que Apache y MySQL estén activos.'; return 'No fue posible iniciar sesión. Inténtalo nuevamente.'; }; const handleLogin = async (e) => { e && e.preventDefault(); if (authStatus !== 'unauthenticated' || isSubmitting) return; if (isLocalDemo && !selected) { setError('Selecciona un usuario'); return; } if (!isLocalDemo && !username.trim()) { setError('Ingresa tu usuario'); return; } if (!password) { setError('Ingresa tu contraseña'); return; } setIsSubmitting(true); setError(''); try { const user = await window.persistenceAdapter.login( isLocalDemo ? selected.id : username.trim(), password ); onLogin(user); } catch (loginError) { setPassword(''); setError(safeErrorMessage(loginError)); } finally { setIsSubmitting(false); } }; return (