// Auteur : Simon-Pierre Boucher — contact@spboucher.ai "use client"; import { useState } from "react"; import { ROLES } from "@/lib/roles"; const ERRORS: Record = { "google-non-configure": "La connexion Google n'est pas encore activée sur ce serveur.", "etat-oauth-invalide": "La session Google a expiré — réessayez.", "echange-google-refuse": "Google a refusé l'échange — réessayez.", "id-token-absent": "Réponse Google incomplète — réessayez.", "id-token-invalide": "Réponse Google invalide — réessayez.", "profil-google-incomplet": "Votre compte Google n'a pas de courriel vérifié.", "apple-non-configure": "La connexion Apple n'est pas encore activée sur ce serveur.", "apple-refuse": "La connexion Apple a été annulée — réessayez.", "echange-apple-refuse": "Apple a refusé l'échange — réessayez.", "profil-apple-incomplet": "Votre compte Apple n'a pas de courriel vérifié.", }; export default function AuthForm({ next, error, via, }: { next: string; error?: string; via?: string; }) { const [mode, setMode] = useState<"login" | "register">("login"); const [msg, setMsg] = useState( error ? (ERRORS[error] ?? "Une erreur est survenue — réessayez.") : null, ); const [busy, setBusy] = useState(false); async function submit(e: React.FormEvent) { e.preventDefault(); setBusy(true); setMsg(null); const fd = new FormData(e.currentTarget); const body = Object.fromEntries(fd.entries()); const res = await fetch(`/api/auth/${mode}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); const data = await res.json().catch(() => ({})); if (res.ok) { window.location.href = next; } else { setMsg(data.error ?? "Une erreur est survenue — réessayez."); setBusy(false); } } return (
{via && (

)} {/* « G » officiel Google — couleurs de marque */} Continuer avec Google {/* Pomme Apple — blanche sur noir, style officiel */} Continuer avec Apple
ou par courriel
{( [ ["login", "Se connecter"], ["register", "Créer un compte"], ] as const ).map(([m, label]) => ( ))}
{mode === "register" && ( <>
Vous êtes…
{Object.entries(ROLES).map(([value, r]) => ( ))}

Ce statut sera affiché sur votre carte de membre.

)} {msg && (

{msg}

)}

Un seul compte — le KA ID — pour toutes les plateformes du groupe. En continuant, vous acceptez les{" "} conditions d'utilisation {" "} et la{" "} politique de confidentialité .

); }