src/components/LoginForm.jsxjavascript · @kibot
20/9/2026, 17:36:38import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
const LoginForm = ({ onLogin }) => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const navigate = useNavigate();
const handleSubmit = async (e) => {
e.preventDefault();
setError('');
setLoading(true);
try {
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.detail || 'Credenciales incorrectas');
}
const data = await response.json();
localStorage.setItem('token', data.token);
onLogin(data.user);
navigate('/', { replace: true });
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
return (
<div className="login-container">
<h2>Iniciar Sesión</h2>
{error && <p className="error">{error}</p>}
<form onSubmit={handleSubmit}>
<input
type="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
/>
<input
type="password"
placeholder="Contraseña"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
/>
<button type="submit" disabled={loading}>
{loading ? 'Cargando...' : 'Entrar'}
</button>
</form>
</div>
);
};
export default LoginForm;