/** * Page de connexion. * * Formulaire email + mot de passe, appel de `signIn` (Supabase via auth-client). * Si la session devient active (arrivée déjà connecté OU succès de signIn), * `useAuth` propage l'état et le useEffect redirige vers /dashboard. On évite * ainsi un double `navigate` concurrent depuis le handler de submit. */ import { useEffect, useState, type FormEvent } from 'react' import { Link, useNavigate } from 'react-router-dom' import { Loader2 } from 'lucide-react' import { Button } from '@/shared/components/ui/button' import { Input } from '@/shared/components/ui/input' import { Label } from '@/shared/components/ui/label' import { signIn } from '@/shared/lib/auth-client' import { useAuth } from '../hooks/useAuth' function mapSignInError(message: string | undefined): string { if (!message) return 'Connexion impossible. Réessayez dans quelques instants.' if (message === 'Invalid login credentials') { return 'Email ou mot de passe incorrect.' } if (message.includes('Email not confirmed')) { return 'Email non confirmé. Vérifiez votre boîte mail.' } return 'Connexion impossible. Réessayez dans quelques instants.' } export function LoginPage() { const navigate = useNavigate() const { isAuthenticated, isLoading } = useAuth() const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) useEffect(() => { if (!isLoading && isAuthenticated) { navigate('/dashboard', { replace: true }) } }, [isLoading, isAuthenticated, navigate]) if (isLoading || isAuthenticated) { return (
) } async function handleSubmit(e: FormEvent) { e.preventDefault() setError(null) setIsSubmitting(true) try { const { error: signInError } = await signIn(email, password) if (signInError) { setError(mapSignInError(signInError.message)) } } finally { setIsSubmitting(false) } } return (

Se connecter

Accédez à votre espace Expria.

{error && (
{error}
)}
setEmail(e.target.value)} disabled={isSubmitting} />
setPassword(e.target.value)} disabled={isSubmitting} />

Pas encore de compte ?{' '} Créer un compte

) } export default LoginPage