import { Alert, AlertDescription } from "~/components/ui/alert"; import { AlertCircleIcon, ArrowRight, LoaderCircle, LogIn, MailIcon, } from "lucide-react"; import { Label } from "~/components/ui/label"; import { Input } from "~/components/ui/input"; import { Button } from "~/components/ui/button"; import { useEffect, useState } from "react"; import { AuthLayout, SUPPORT_MAIL } from "~/layout"; import { useNavigate, useSearchParams } from "react-router"; import { capitalizeFirstLetter } from "~/lib/utils"; import { Combobox } from "~/components/combobox"; import { getClasses, getNames, registerUser } from "~/lib/api"; export function meta() { return [ { title: "Khollisé - Inscription" }, { name: "description", content: "Connectez-vous à Khollisé" }, ]; } export default function Register() { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const email = searchParams.get("email")!; const [emailFirst, emailLast] = getNameFromEmail(email); const [className, setClassName] = useState(""); const [name, setName] = useState(""); const token = searchParams.get("token"); useEffect(() => { if (!email || !token) { navigate("/login", { replace: true }); return; } }, [email, token]); const [classes, setClasses] = useState<{ value: string; label: string }[]>( [] ); useEffect(() => { getClasses().then((data) => { setClasses(data); }); }, []); const [error, setError] = useState(null); const [isLoading, setIsLoading] = useState(false); const [names, setNames] = useState<{ value: string; label: string, userId: number }[]>([]); const hasSubmitted = names.length > 0; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!hasSubmitted) { // Validate inputs if (!className) return setError("Veuillez sélectionner votre classe."); setIsLoading(true); await getNames(className) .then((names) => { setNames(names); setIsLoading(false); // Try to default name from email const possibleName = names.find( (n: { label: string }) => n.label === `${emailFirst} ${emailLast}` ); if (possibleName) { setName(possibleName.value); } }) .catch((err) => { setIsLoading(false); setError(err.message); }); } else { // Register user if (!name) return setError("Veuillez compléter votre nom."); const userId = names.find( (n) => n.value === name )?.userId; if (!userId) return setError("Une erreur est survenue, veuillez réessayer."); await registerUser(userId, className, token!) .then(() => { setIsLoading(false); navigate("/", { replace: true, }); }) .catch((err) => { setIsLoading(false); setError(err.message); }); } }; return (
0} />

Si votre classe n'est pas dans la liste, contactez-nous par{" "} mail {" "} pour l'ajouter.

{hasSubmitted && (
)} {error && ( {error} )}
); } function getNameFromEmail(email: string): [string, string] { const parts = email.split("@")[0].split("."); if (parts.length < 2) return ["", ""]; const firstName = capitalizeFirstLetter(parts[0]); const lastName = parts.slice(1).join(" ").toUpperCase(); return [firstName, lastName]; }