// Rôle : fournit l'outil liens avec ajout manuel et import texte. import { useCallback, useState } from "react"; import { Icon } from "../../../components/Icon.jsx"; import { useDraftForm } from "../../../hooks/useDraftForm.js"; import { moveItem, useGroupedReorder } from "../../../hooks/useGroupedReorder.js"; import { TextImportModal } from "./TextImportModal.jsx"; import { parseColonImportLines } from "./textImport.js"; export function LinksModule({ toolboxId, moduleId, context, editing }) { const data = context.normalizeLinksData(context.getModuleData(toolboxId, moduleId, { links: [] })); const textContent = context.moduleText?.links || {}; const linkDraft = useDraftForm({ title: "", url: "" }); const [textImport, setTextImport] = useState(""); const [importOpen, setImportOpen] = useState(false); const [copiedId, setCopiedId] = useState(""); const closeImportModal = useCallback(() => setImportOpen(false), []); const { itemReorder, getItemProps, isItemDragging, isItemDropTarget, getDropPlacement } = useGroupedReorder({ namespace: "links", items: data.links, getItemId: (link) => link.id, getParentId: () => moduleId, onItemMove: (operation) => save(moveItem(data.links, operation.sourceId, operation.targetId, operation.placement)), hierarchy: { enabled: true, stickyParents: true } }); function save(links) { context.setModuleData(toolboxId, moduleId, { links }); } function addLink(event) { linkDraft.handleSubmit(event, (draft, { reset }) => { const cleanUrl = context.normalizeUrl(draft.url); if (!cleanUrl) return; save([ ...data.links, { id: context.uid("link"), title: draft.title.trim(), url: cleanUrl } ]); reset(); }); } function importLinks(event) { event.preventDefault(); const imported = parseColonImportLines(textImport) .map((entry) => ({ id: context.uid("link"), title: entry.label, url: context.normalizeUrl(entry.value) })) .filter((link) => link.url); if (!imported.length) return; save([...data.links, ...imported]); setTextImport(""); setImportOpen(false); context.notify?.("Import de liens terminé."); } async function copyUrl(link) { const copied = await context.copyText(link.url); if (!copied) return; setCopiedId(link.id); context.notify?.(textContent.copiedTitle || "Copié"); window.setTimeout(() => setCopiedId(""), 1400); } return ( <> {editing && (