UNPKG

fullstack-form-app-sinclqir

Version:

Application de gestion des utilisateurs avec authentification JWT - Frontend React + Backend Python FastAPI

103 lines (88 loc) 3 kB
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;