import { useState } from 'react' import { motion } from 'framer-motion' import { ArrowLeft, Mail } from 'lucide-react' import { supa } from '../lib/supabase' import { useFeedback } from '../lib/feedback' import { Button, Field, Input } from '../components/ui' import Logo from '../components/Logo' /** Traduit les messages d'erreur de Supabase Auth. */ function translate(msg: string): string { if (/invalid login/i.test(msg)) return 'Email ou mot de passe incorrect.' if (/email not confirmed/i.test(msg)) return "Cette adresse email n'a pas encore été confirmée." if (/rate limit|too many/i.test(msg)) return 'Trop de tentatives. Réessaie dans une minute.' if (/failed to fetch|network/i.test(msg)) { return 'Impossible de joindre le serveur. Vérifie ta connexion internet.' } return msg } export default function Login(): JSX.Element { const { toast } = useFeedback() const [mode, setMode] = useState<'signin' | 'reset'>('signin') const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [busy, setBusy] = useState(false) const [error, setError] = useState('') const [sent, setSent] = useState(false) const signIn = async (): Promise => { setError('') if (!email.trim() || !password) { setError('Renseigne ton email et ton mot de passe.') return } setBusy(true) try { const { error: e } = await supa().auth.signInWithPassword({ email: email.trim(), password }) if (e) throw e // La bascule vers l'application est pilotée par onAuthStateChange. } catch (e) { setError(translate((e as Error).message)) setBusy(false) } } const sendReset = async (): Promise => { setError('') if (!email.trim()) { setError('Indique ton adresse email.') return } setBusy(true) try { const { error: e } = await supa().auth.resetPasswordForEmail(email.trim()) if (e) throw e setSent(true) toast('Email de réinitialisation envoyé.', 'success') } catch (e) { setError(translate((e as Error).message)) } finally { setBusy(false) } } return (

GameDev Tracker

{mode === 'signin' ? 'Connecte-toi à ton équipe' : 'Réinitialiser le mot de passe'}

{/* Un vrai
: les gestionnaires de mots de passe fonctionnent, l'autocomplétion aussi, et Entrée valide naturellement. */} { e.preventDefault() void (mode === 'signin' ? signIn() : sendReset()) }} className="space-y-3" > {({ id }) => ( setEmail(e.target.value)} /> )} {mode === 'signin' && ( {({ id }) => ( setPassword(e.target.value)} /> )} )} {error && (

{error}

)} {sent && mode === 'reset' && (

Si un compte existe pour cette adresse, un lien de réinitialisation vient d'être envoyé.

)}
{mode === 'signin' ? (

Pas de compte ? Demande à ton administrateur de t'en créer un.

) : ( )}
) }