fullstack-form-app-sinclqir
Version:
Application de gestion des utilisateurs avec authentification JWT - Frontend React + Backend Python FastAPI
103 lines (88 loc) • 3 kB
JSX
import { useState } from 'react';
import axios from 'axios';
import { API_ENDPOINTS } from '../../../config/api';
import './LoginForm.css';
const LoginForm = ({ onLoginSuccess, onSwitchToRegistration }) => {
const [loginData, setLoginData] = useState({
email: '',
password: ''
});
const [loading, setLoading] = useState(false);
const [error, setError] = useState('');
const handleInputChange = (e) => {
const { name, value } = e.target;
setLoginData(prev => ({
...prev,
[name]: value
}));
};
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
setError('');
try {
console.log('Tentative de connexion avec:', loginData.email);
const response = await axios.post(API_ENDPOINTS.LOGIN, {
email: loginData.email,
password: loginData.password
});
console.log('Réponse de l\'API:', response.data);
const { access_token, user } = response.data;
console.log('Token extrait:', access_token);
console.log('User extrait:', user);
localStorage.setItem('token', access_token);
localStorage.setItem('user', JSON.stringify(user));
setLoginData({ email: '', password: '' });
console.log('Utilisateur connecté:', user);
if (onLoginSuccess) {
onLoginSuccess(access_token, user);
}
} catch (err) {
console.error('Erreur de connexion:', err.response?.data || err.message);
setError(err.response?.data?.detail || 'Erreur de connexion');
} finally {
setLoading(false);
}
};
return (
<div className="login-form">
{error && <div className="alert error">{error}</div>}
<form onSubmit={handleSubmit} className="login-content">
<div className="form-group">
<label htmlFor="login-email" className="form-label">
Email
</label>
<input
type="email"
id="login-email"
name="email"
className="form-input"
placeholder="votre@email.com"
value={loginData.email}
onChange={handleInputChange}
required
/>
</div>
<div className="form-group">
<label htmlFor="login-password" className="form-label">
Mot de passe
</label>
<input
type="password"
id="login-password"
name="password"
className="form-input"
placeholder="••••••••"
value={loginData.password}
onChange={handleInputChange}
required
/>
</div>
<button type="submit" disabled={loading} className="submit-btn">
{loading ? 'Connexion...' : 'Se connecter'}
</button>
</form>
</div>
);
};
export default LoginForm;