/* global React, Icon, SOPStore, SOPExport */ /* HistoryPanel — drawer lateral derecho con timeline de versiones del SOP activo. Permite: ver lista, restaurar versión, descargar versión específica (JSON/DOCX), borrar versión, limpiar historial. */ const { useState: useStateHP, useEffect: useEffectHP, useMemo: useMemoHP } = React; function fmtRelativeHP(ts) { if (!ts) return ""; const diff = (Date.now() - ts) / 1000; if (diff < 5) return "ahora"; if (diff < 60) return `hace ${Math.round(diff)} s`; if (diff < 3600) return `hace ${Math.round(diff / 60)} min`; if (diff < 86400) return `hace ${Math.round(diff / 3600)} h`; if (diff < 86400 * 7) return `hace ${Math.round(diff / 86400)} d`; return new Date(ts).toLocaleDateString(); } function fmtFullHP(ts) { if (!ts) return ""; const d = new Date(ts); return d.toLocaleString(); } function HistoryPanel({ docId, open, onClose, onRestore, onToast }) { const [versions, setVersions] = useStateHP([]); const [confirming, setConfirming] = useStateHP(null); // ts de la versión que pide confirm const refresh = () => { if (!docId) { setVersions([]); return; } const v = window.SOPStore.loadHistory(docId); // Más reciente primero setVersions([...v].sort((a, b) => b.ts - a.ts)); }; useEffectHP(() => { if (open) refresh(); }, [open, docId]); // Esc cierra useEffectHP(() => { if (!open) return; const onKey = (e) => { if (e.key === "Escape") onClose(); }; document.addEventListener("keydown", onKey); return () => document.removeEventListener("keydown", onKey); }, [open, onClose]); if (!open) return null; const doRestore = (ts) => { const restored = window.SOPStore.restoreVersion(docId, ts); if (restored && onRestore) { // El doc restaurado debe mantener su id original (no creamos uno nuevo) onRestore(restored); onToast && onToast("Versión restaurada ✓"); onClose(); } }; const doDelete = (ts) => { window.SOPStore.deleteVersion(docId, ts); setConfirming(null); refresh(); onToast && onToast("Versión eliminada"); }; const doDownloadJSON = (v) => { window.SOPExport.exportJSON(v.doc); onToast && onToast("JSON descargado"); }; const doDownloadDOCX = (v) => { window.SOPExport.exportDOCX(v.doc); onToast && onToast("DOCX descargado"); }; const clearAll = () => { if (!confirm("¿Borrar TODO el historial de este SOP? No se puede deshacer.")) return; window.SOPStore.clearHistoryFor(docId); refresh(); onToast && onToast("Historial limpiado"); }; return (