/** * Login Page - Xpeditis * * Modern split-screen login page with: * - Left side: Login form with social authentication * - Right side: Brand features and visual elements */ 'use client'; import { useState } from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { useAuth } from '@/lib/context/auth-context'; interface FieldErrors { email?: string; password?: string; } // Map backend error messages to French user-friendly messages function getErrorMessage(error: any): { message: string; field?: 'email' | 'password' | 'general' } { const errorMessage = error?.message || error?.response?.message || ''; // Network or server errors if (error?.name === 'TypeError' || errorMessage.includes('fetch')) { return { message: 'Impossible de se connecter au serveur. Vérifiez votre connexion internet.', field: 'general' }; } // Backend error messages if (errorMessage.includes('Invalid credentials') || errorMessage.includes('Identifiants')) { return { message: 'Email ou mot de passe incorrect', field: 'general' }; } if (errorMessage.includes('inactive') || errorMessage.includes('désactivé')) { return { message: 'Votre compte a été désactivé. Contactez le support pour plus d\'informations.', field: 'general' }; } if (errorMessage.includes('not found') || errorMessage.includes('introuvable')) { return { message: 'Aucun compte trouvé avec cet email', field: 'email' }; } if (errorMessage.includes('password') || errorMessage.includes('mot de passe')) { return { message: 'Mot de passe incorrect', field: 'password' }; } if (errorMessage.includes('Too many') || errorMessage.includes('rate limit')) { return { message: 'Trop de tentatives de connexion. Veuillez réessayer dans quelques minutes.', field: 'general' }; } // Default error return { message: errorMessage || 'Une erreur est survenue. Veuillez réessayer.', field: 'general' }; } export default function LoginPage() { const { login } = useAuth(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [rememberMe, setRememberMe] = useState(false); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(''); const [fieldErrors, setFieldErrors] = useState({}); // Validate form fields const validateForm = (): boolean => { const errors: FieldErrors = {}; // Email validation if (!email.trim()) { errors.email = 'L\'adresse email est requise'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { errors.email = 'L\'adresse email n\'est pas valide'; } // Password validation if (!password) { errors.password = 'Le mot de passe est requis'; } else if (password.length < 6) { errors.password = 'Le mot de passe doit contenir au moins 6 caractères'; } setFieldErrors(errors); return Object.keys(errors).length === 0; }; // Handle input changes - keep errors visible until successful login const handleEmailChange = (e: React.ChangeEvent) => { setEmail(e.target.value); }; const handlePasswordChange = (e: React.ChangeEvent) => { setPassword(e.target.value); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); setFieldErrors({}); // Validate form before submission if (!validateForm()) { return; } setIsLoading(true); try { await login(email, password); // Navigation is handled by the login function in auth context } catch (err: any) { const { message, field } = getErrorMessage(err); if (field === 'email') { setFieldErrors({ email: message }); } else if (field === 'password') { setFieldErrors({ password: message }); } else { setError(message); } } finally { setIsLoading(false); } }; return (
{/* Left Side - Form */}
{/* Logo */}
Xpeditis
{/* Header */}

Connexion

Bienvenue ! Connectez-vous pour accéder à votre compte

{/* Error Message */} {error && (

{error}

)} {/* Form */}
{/* Email */}
{fieldErrors.email && (

{fieldErrors.email}

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

{fieldErrors.password}

)}
{/* Remember Me & Forgot Password */}
Mot de passe oublié ?
{/* Submit Button */}
{/* Sign Up Link */}

Vous n'avez pas de compte ?{' '} Créer un compte

{/* Footer Links */}
Centre d'aide Contactez-nous Confidentialité Conditions
{/* Right Side - Brand Features */}
{/* Background Gradient */}
{/* Content */}

Simplifiez votre fret maritime

Accédez à des tarifs en temps réel de plus de 50 compagnies maritimes. Réservez, suivez et gérez vos expéditions LCL en quelques clics.

{/* Features */}

Tarifs instantanés

Comparez les prix de toutes les compagnies en temps réel

Réservation simplifiée

Réservez vos conteneurs en moins de 5 minutes

Suivi en temps réel

Suivez vos expéditions à chaque étape du voyage

{/* Stats */}
50+
Compagnies
10k+
Expéditions
99.5%
Satisfaction
{/* Decorative Elements */}
); }