"use client"; import { useState, useEffect } from "react"; import { useParams, 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"]; // Mock person data const getPersonData = (id: string) => { return { id: parseInt(id), name: "Jean Dupont", email: "jean.dupont@example.com", tags: ["Frontend", "React", "Junior"], }; }; export default function EditPersonPage() { const params = useParams(); const router = useRouter(); const personId = params.id as string; const [person, setPerson] = useState(null); const [loading, setLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [selectedTags, setSelectedTags] = useState([]); const [tagInput, setTagInput] = useState(""); const [filteredTags, setFilteredTags] = useState([]); const { register, handleSubmit, control, formState: { errors }, reset } = useForm(); // 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]); useEffect(() => { // Simulate API call to fetch person data const fetchPerson = async () => { setLoading(true); try { // In a real app, this would be an API call await new Promise(resolve => setTimeout(resolve, 1000)); const data = getPersonData(personId); setPerson(data); // Extract level from tags (assuming the last tag is the level) const level = data.tags.find(tag => ["Junior", "Medior", "Senior"].includes(tag)) || ""; // Set selected tags (excluding the level) const tags = data.tags.filter(tag => !["Junior", "Medior", "Senior"].includes(tag)); setSelectedTags(tags); // Reset form with person data reset({ name: data.name, email: data.email, level: level }); } catch (error) { console.error("Error fetching person:", error); toast.error("Erreur lors du chargement de la personne"); } finally { setLoading(false); } }; fetchPerson(); }, [personId, reset]); 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 update the person await new Promise(resolve => setTimeout(resolve, 1000)); // Combine form data with selected tags const personData = { ...data, tags: [...selectedTags, data.level] }; toast.success("Personne mise à jour avec succès"); router.push("/persons"); } catch (error) { console.error("Error updating person:", error); toast.error("Erreur lors de la mise à jour de la personne"); } finally { setIsSubmitting(false); } }; if (loading) { return (
); } if (!person) { return (

Personne non trouvée

); } return (

Modifier la personne

Informations de la personne Modifiez les informations et les tags de la personne
{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

); }