import { useState } from 'react'; import { Lock, User, Eye, EyeOff, MessageCircle } from 'lucide-react'; import './LoginPage.css'; import { loginAdmin, syncAdminUsernameFromJWT } from '../../api/api_admin'; import { useNavigate } from 'react-router-dom'; interface AdminLoginRequest { username: string; password: string; } const LoginCabine = () => { const navigate = useNavigate(); const [formData, setFormData] = useState({ username: '', password: '' }); const [showPassword, setShowPassword] = useState(false); const [errors, setErrors] = useState<{ username?: string; password?: string }>({}); const [isLoading, setIsLoading] = useState(false); const [apiError, setApiError] = useState(''); /** * ✅ Valider le formulaire */ const validateForm = (): boolean => { const newErrors: { username?: string; password?: string } = {}; console.log('🔍 [ADMIN_LOGIN] Validation - Username:', `"${formData.username}"`); console.log('🔍 [ADMIN_LOGIN] Après trim:', `"${formData.username.trim()}"`); if (!formData.username.trim()) { newErrors.username = 'L\'username admin est requis'; } else if (formData.username.trim().length < 3) { newErrors.username = 'Username invalide (minimum 3 caractères)'; } if (!formData.password) { newErrors.password = 'Le mot de passe est requis'; } else if (formData.password.length < 6) { newErrors.password = 'Le mot de passe doit contenir au moins 6 caractères'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; /** * ✅ Soumettre le formulaire */ const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) return; setIsLoading(true); setApiError(''); try { console.log('🔐 [ADMIN_LOGIN] Appel API avec:', { username: formData.username, password: '***' }); // ✅ Appeler la fonction de login admin sécurisée const result = await loginAdmin(formData.username, formData.password); console.log('📋 [ADMIN_LOGIN] Résultat:', { success: result.success, message: result.message, hasToken: !!result.access_token, role: result.user?.role }); if (result.success && result.access_token) { console.log('✅ [ADMIN_LOGIN] Connexion admin réussie!'); // ✅ La synchronisation JWT est AUTOMATIQUE dans loginAdmin() // Pas besoin de le faire ici console.log('✅ [ADMIN_LOGIN] Token et username admin synchronisés'); // ✅ Vérifier la synchronisation const syncedUsername = syncAdminUsernameFromJWT(); console.log('✅ [ADMIN_LOGIN] Username admin synchronisé:', syncedUsername); // ✅ Redirection vers dashboard admin console.log('✅ [ADMIN_LOGIN] Redirection vers /admin/dashboard'); navigate('/cabine/dashboard'); } else { // ❌ Erreur API const errorMessage = result.message || 'Identifiants admin incorrects'; console.error('❌ [ADMIN_LOGIN] Erreur API:', errorMessage); setApiError(errorMessage); setErrors({ username: errorMessage }); } } catch (err) { console.error('💥 [ADMIN_LOGIN] Erreur catch:', err); const errorMessage = err instanceof Error ? err.message : 'Erreur de connexion admin'; setApiError(errorMessage); setErrors({ username: errorMessage }); } finally { setIsLoading(false); } }; /** * ✅ Gérer les changements d'input */ const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); // Effacer l'erreur de ce champ if (errors[name as keyof typeof errors]) { setErrors(prev => ({ ...prev, [name]: undefined })); } // Effacer l'erreur API si l'utilisateur recommence à saisir if (apiError) { setApiError(''); } }; return (

Connexion cabine

Accédez au panneau cabine

{/* ✅ Erreur API globale */} {apiError && (
⚠️ {apiError}
)} {/* Username Admin */}
{errors.username && (

{errors.username}

)}
{/* Password */}
{errors.password && (

{errors.password}

)}
{/* Submit Button */}
{/* Info sécurité */}

Accès réservé aux administrateurs

{/* Footer */}

Besoin d'aide ? Contactez le support technique

); }; export default LoginCabine;