// Rôle : affiche une toolbox dans la liste, avec actions rapides et icône personnalisable. import React, { useEffect, useRef, useState } from "react"; import { Icon } from "../../components/Icon.jsx"; import { DEFAULT_TOOLBOX_ICON, normalizeToolboxIcon, TOOLBOX_ICONS } from "./storage/toolboxStorage.js"; export function getGameCardCover(game) { return game?.images?.cardCover || game?.image || ""; } export function getGameCardBackground(game) { return game?.cover || "var(--gradient-nebula)"; } export function formatDate(value) { return new Intl.DateTimeFormat("fr-FR", { dateStyle: "medium", timeStyle: "short" }).format(new Date(value)); } export function ToolboxCard({ toolbox, game, actions, draggingToolboxId, dropTarget, onDragStart }) { const gameCoverImage = getGameCardCover(game); const coverImage = gameCoverImage || toolbox.icon || DEFAULT_TOOLBOX_ICON; const isDragging = draggingToolboxId === toolbox.id; const isDropTarget = dropTarget.id === toolbox.id; const className = [ "card", "toolbox-card", isDragging ? "is-dragging" : "", isDropTarget ? "is-drop-target" : "", isDropTarget && dropTarget.placement === "after" ? "drop-after" : "" ].filter(Boolean).join(" "); return (
{game

{game ? game.title : "Toolbox libre"}

{toolbox.name}

Modifiée le {formatDate(toolbox.updatedAt)}
); } export function ToolboxIconPicker({ toolbox, onChange }) { const [open, setOpen] = useState(false); const pickerRef = useRef(null); const icon = normalizeToolboxIcon(toolbox.icon); useEffect(() => { if (!open) return undefined; function handlePointerDown(event) { if (!pickerRef.current?.contains(event.target)) setOpen(false); } function handleKeyDown(event) { if (event.key === "Escape") setOpen(false); } document.addEventListener("pointerdown", handlePointerDown); document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("pointerdown", handlePointerDown); document.removeEventListener("keydown", handleKeyDown); }; }, [open]); function selectIcon(nextIcon) { onChange(nextIcon); setOpen(false); } return (
{open && (
{TOOLBOX_ICONS.map((path) => ( ))}
)}
); } export function ToolboxGameIcon({ game }) { const gameCoverImage = getGameCardCover(game); return (
); }