"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { useForm, Controller } from "react-hook-form"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { ArrowLeft, Loader2, Save, Plus, X } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; // Type definitions interface PersonFormData { name: string; email: string; level: string; } // Mock data for available tags const availableTags = [ "Frontend", "Backend", "Fullstack", "UX/UI", "DevOps", "React", "Vue", "Angular", "Node.js", "Python", "Java", "PHP", "JavaScript", "TypeScript", "CSS", "Docker", "Kubernetes", "Design", "Figma", "MERN" ]; // Levels const levels = ["Junior", "Medior", "Senior"]; export default function NewPersonPage() { const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); const [selectedTags, setSelectedTags] = useState([]); const [tagInput, setTagInput] = useState(""); const [filteredTags, setFilteredTags] = useState([]); const { register, handleSubmit, control, formState: { errors } } = useForm({ defaultValues: { name: "", email: "", level: "" } }); // Filter available tags based on input useEffect(() => { if (tagInput) { const filtered = availableTags.filter( tag => tag.toLowerCase().includes(tagInput.toLowerCase()) && !selectedTags.includes(tag) ); setFilteredTags(filtered); } else { setFilteredTags([]); } }, [tagInput, selectedTags]); const handleAddTag = (tag: string) => { if (!selectedTags.includes(tag)) { setSelectedTags([...selectedTags, tag]); } setTagInput(""); setFilteredTags([]); }; const handleRemoveTag = (tag: string) => { setSelectedTags(selectedTags.filter(t => t !== tag)); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && tagInput) { e.preventDefault(); if (filteredTags.length > 0) { handleAddTag(filteredTags[0]); } else if (!selectedTags.includes(tagInput)) { // Add as a new tag if it doesn't exist handleAddTag(tagInput); } } }; const onSubmit = async (data: PersonFormData) => { if (selectedTags.length === 0) { toast.error("Veuillez sélectionner au moins un tag"); return; } setIsSubmitting(true); try { // In a real app, this would be an API call to create a new person await new Promise(resolve => setTimeout(resolve, 1000)); // Combine form data with selected tags const personData = { ...data, tags: [...selectedTags, data.level] }; // Simulate a successful response with a person ID const personId = Date.now(); toast.success("Personne créée avec succès"); router.push("/persons"); } catch (error) { console.error("Error creating person:", error); toast.error("Erreur lors de la création de la personne"); } finally { setIsSubmitting(false); } }; return (

Nouvelle personne

Informations de la personne Ajoutez une nouvelle personne à votre projet
{errors.name && (

{errors.name.message}

)}
{errors.email && (

{errors.email.message}

)}
( )} /> {errors.level && (

{errors.level.message}

)}
{selectedTags.map((tag) => ( {tag} ))}
setTagInput(e.target.value)} onKeyDown={handleKeyDown} /> {filteredTags.length > 0 && (
{filteredTags.map((tag) => (
handleAddTag(tag)} > {tag}
))}
)}

Appuyez sur Entrée pour ajouter un tag ou sélectionnez-en un dans la liste

); }