"use client"; import { useState, useMemo, useRef, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Team } from "@/lib/types"; import { Search, Building2, ChevronDown, Check, Code2 } from "lucide-react"; interface RegisterFormProps { teams: Team[]; onSubmit: (data: { firstName: string; lastName: string; email: string; password: string; teamId: string; }) => void; onSwitchToLogin: () => void; loading?: boolean; error?: string | null; } export function RegisterForm({ teams, onSubmit, onSwitchToLogin, loading = false, error = null, }: RegisterFormProps) { const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [teamId, setTeamId] = useState(""); const [searchTerm, setSearchTerm] = useState(""); const [isTeamDropdownOpen, setIsTeamDropdownOpen] = useState(false); const teamDropdownRef = useRef(null); const [dropdownPosition, setDropdownPosition] = useState<"below" | "above">( "below" ); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (password !== confirmPassword) { alert("Les mots de passe ne correspondent pas"); return; } if (firstName && lastName && email && password && teamId) { onSubmit({ firstName, lastName, email, password, teamId }); } }; const isValid = firstName.length > 0 && lastName.length > 0 && email.length > 0 && password.length > 0 && password === confirmPassword && teamId.length > 0; // Group teams by direction and filter by search term const teamsByDirection = useMemo(() => { const filteredTeams = teams.filter( (team) => team.name.toLowerCase().includes(searchTerm.toLowerCase()) || team.direction.toLowerCase().includes(searchTerm.toLowerCase()) ); return filteredTeams.reduce((acc, team) => { if (!acc[team.direction]) { acc[team.direction] = []; } acc[team.direction].push(team); return acc; }, {} as Record); }, [teams, searchTerm]); // Calculate dropdown position when opening const handleDropdownToggle = () => { if (!isTeamDropdownOpen && teamDropdownRef.current) { const rect = teamDropdownRef.current.getBoundingClientRect(); const viewportHeight = window.innerHeight; const spaceBelow = viewportHeight - rect.bottom; const spaceAbove = rect.top; const dropdownHeight = 300; setDropdownPosition( spaceBelow >= dropdownHeight || spaceBelow > spaceAbove ? "below" : "above" ); } setIsTeamDropdownOpen(!isTeamDropdownOpen); }; // Close dropdown when clicking outside useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( teamDropdownRef.current && !teamDropdownRef.current.contains(event.target as Node) ) { setIsTeamDropdownOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const selectedTeam = teams.find((team) => team.id === teamId); return (
PeakSkills

Créer un compte

Rejoignez PeakSkills et commencez votre évaluation

Inscription Créez votre compte pour commencer {error && (

{error}

)}
setFirstName(e.target.value)} placeholder="Votre prénom" required className="bg-white/10 border-white/20 text-white placeholder:text-slate-400" />
setLastName(e.target.value)} placeholder="Votre nom" required className="bg-white/10 border-white/20 text-white placeholder:text-slate-400" />
setEmail(e.target.value)} placeholder="votre@email.com" required className="bg-white/10 border-white/20 text-white placeholder:text-slate-400" />
setPassword(e.target.value)} placeholder="Mot de passe" required className="bg-white/10 border-white/20 text-white placeholder:text-slate-400" />
setConfirmPassword(e.target.value)} placeholder="Confirmer" required className="bg-white/10 border-white/20 text-white placeholder:text-slate-400" />
{isTeamDropdownOpen && (
setSearchTerm(e.target.value)} className="pl-8 h-8 text-sm bg-gray-700 border-white/20 text-white" autoFocus />
{Object.entries(teamsByDirection).map( ([direction, directionTeams]) => (
{direction}
{directionTeams.map((team) => ( ))}
) )} {Object.keys(teamsByDirection).length === 0 && (
Aucune équipe trouvée pour "{searchTerm}"
)}
)}

Déjà un compte ?{" "}

); }