"use client"; import { motion } from "framer-motion"; import { AlignLeft, BadgeCheck, Check, Copy, FileText, Globe, MapPin, Tag, User, } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { useMemo, useState } from "react"; export type Project = { id?: string; joueur: string; etat: "En cours" | "Terminé" | "Pause"; monde: "Overworld" | "Nether" | "End"; projet: string; description: string; coords: string; tags: string[]; }; export default function ProjectTable({ data, hidePlayerFilter = false, }: { data: Project[]; hidePlayerFilter?: boolean; }) { const [copied, setCopied] = useState(null); const [search, setSearch] = useState(""); const [etat, setEtat] = useState(""); const [monde, setMonde] = useState(""); const [joueur, setJoueur] = useState(""); const filtered = useMemo(() => { return data.filter((p) => { const matchesSearch = p.projet.toLowerCase().includes(search.toLowerCase()); const matchesEtat = etat ? p.etat === etat : true; const matchesMonde = monde ? p.monde === monde : true; const matchesJoueur = hidePlayerFilter ? true : joueur ? p.joueur === joueur : true; return matchesSearch && matchesEtat && matchesMonde && matchesJoueur; }); }, [data, search, etat, monde, joueur, hidePlayerFilter]); const joueurs = [...new Set(data.map((p) => p.joueur))]; const etats = ["En cours", "Terminé", "Pause"]; const mondes = ["Overworld", "Nether", "End"]; const headers = [ { label: "Joueur", icon: User }, { label: "État", icon: BadgeCheck }, { label: "Monde", icon: Globe }, { label: "Projet", icon: FileText }, { label: "Description", icon: AlignLeft }, { label: "Coordonnées", icon: MapPin }, { label: "Tags", icon: Tag }, ]; function resolveWorldId(monde: Project["monde"]): string { switch (monde) { case "Overworld": return "world"; case "Nether": return "world_nether"; case "End": return "world_the_end"; default: return "world"; // fallback } } if (!data.length) { return

Aucun projet enregistré pour le moment.

; } return (
setSearch(e.target.value)} className="rounded-md border border-white/20 bg-white/10 px-3 py-1 text-sm text-amber-50 placeholder-white/60 focus:outline-none focus:ring-2 focus:ring-orange-500" /> {!hidePlayerFilter && ( )}
{headers.map(({ label, icon: Icon }) => ( ))} {filtered.map((p, i) => ( ))}
{label}
((e.target as HTMLImageElement).style.display = "none")} /> {hidePlayerFilter ? ( {p.joueur} ) : ( {p.joueur} )}
{p.projet}
{p.description}
{p.coords} {p.coords && ( DynMap )}
{ navigator.clipboard.writeText(p.coords); setCopied(i); setTimeout(() => setCopied(null), 1200); }} className="grid h-7 w-7 flex-shrink-0 place-items-center rounded bg-white/10 hover:bg-white/20" > {copied === i ? ( ) : ( )}
{p.tags.map((t, idx) => )}
); } function Td({ children }: { children: React.ReactNode }) { return {children}; } function EtatBadge({ v }: { v: Project["etat"] }) { const cls = v === "En cours" ? "bg-yellow-400/90 text-black" : v === "Terminé" ? "bg-green-600/90" : "bg-red-600/90"; return {v}; } function MondeBadge({ v }: { v: Project["monde"] }) { const map = { Overworld: "bg-emerald-700/80", Nether: "bg-red-700/80", End: "bg-violet-800/90", } as const; return {v}; } function TagBadge({ v }: { v: string }) { const palette: Record = { spawn: "bg-fuchsia-700/90", build: "bg-emerald-700/90", usine: "bg-orange-600/90", }; return {v}; }