Files
ContabilidadSaPolar/frontend/src/pages/Login.tsx
T

73 lines
2.2 KiB
TypeScript

import { useState } from 'react';
import { useNavigate, Navigate } from 'react-router-dom';
import { useAuth } from '../contexts/AuthContext';
export default function Login() {
const { isAuthenticated, loading: authLoading, login } = useAuth();
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const navigate = useNavigate();
if (authLoading) return null;
if (isAuthenticated) return <Navigate to="/dashboard" replace />;
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setError('');
setLoading(true);
try {
await login(username, password);
navigate('/dashboard');
} catch {
setError('Credenciales inválidas');
} finally {
setLoading(false);
}
};
return (
<div className="login-container">
<div className="login-card">
<div className="login-logo">
<h1>Sa Polar</h1>
<p>Gestión de Alquileres</p>
</div>
{error && (
<div className="login-error">
<span></span>
<span>{error}</span>
</div>
)}
<form className="login-form" onSubmit={handleSubmit}>
<div className="form-group">
<label className="form-label">Usuario</label>
<input
type="text"
placeholder="Ingresa tu usuario"
value={username}
onChange={(e) => setUsername(e.target.value)}
required
autoFocus
/>
</div>
<div className="form-group">
<label className="form-label">Contraseña</label>
<input
type="password"
placeholder="Ingresa tu contraseña"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
/>
</div>
<button type="submit" className="btn btn-primary" disabled={loading}>
{loading ? 'Iniciando sesión...' : 'Iniciar sesión'}
</button>
</form>
</div>
</div>
);
}