diff --git a/.changeset/quiet-explorer-console.md b/.changeset/quiet-explorer-console.md new file mode 100644 index 0000000..18f92ba --- /dev/null +++ b/.changeset/quiet-explorer-console.md @@ -0,0 +1,5 @@ +--- +"@quartz-community/explorer": patch +--- + +Remove leftover debug `console.log` calls that fired on every navigation, and coalesce the `nav`/`render` event handlers so the file tree is rebuilt once per navigation instead of twice. diff --git a/src/components/scripts/explorer.inline.ts b/src/components/scripts/explorer.inline.ts index 2e2c2a1..869b8e9 100644 --- a/src/components/scripts/explorer.inline.ts +++ b/src/components/scripts/explorer.inline.ts @@ -109,9 +109,7 @@ function processTrie(trie, sortFn, filterFn, mapFn) { // Build trie from content index data async function buildFileTrie(dataFns) { try { - console.log("[Explorer] Fetching content index..."); const data = await fetchData; - console.log("[Explorer] Fetched data keys:", Object.keys(data).slice(0, 5)); if (!data) { console.error("[Explorer] No data received"); @@ -122,15 +120,12 @@ async function buildFileTrie(dataFns) { const contentData = data.content || data; const entries = Object.entries(contentData); - console.log("[Explorer] Entry count:", entries.length); - if (entries.length === 0) { console.warn("[Explorer] No content entries found"); return null; } const trie = FileTrieNode.fromEntries(entries); - console.log("[Explorer] Trie root children:", trie.children.length); // Parse data functions from string if provided let sortFn = defaultSortFn; @@ -237,10 +232,8 @@ function renderTree(node, container, currentSlug, folderBehavior, savedState, pa async function handleNavOrRender(e) { const thisGeneration = ++currentRenderGeneration; try { - console.log("[Explorer] Nav event received, generation:", thisGeneration); const currentSlug = (e.detail?.url || "").replace(/^\/+/, ""); const allExplorers = document.querySelectorAll("div.explorer"); - console.log("[Explorer] Found", allExplorers.length, "explorers"); const savedState = {}; try { @@ -267,22 +260,17 @@ async function handleNavOrRender(e) { const folderBehavior = explorer.dataset.behavior || "collapse"; // Build and render the tree - console.log("[Explorer] Starting tree build..."); const trie = await buildFileTrie(dataFns); // Check if another nav event started while we were fetching if (thisGeneration === currentRenderGeneration) { - console.log("[Explorer] Render generation is current, rendering tree"); - console.log("[Explorer] Trie result:", trie ? "success" : "null"); if (trie && trie.children && trie.children.length > 0) { // Clear again before rendering to ensure clean state explorerUl.innerHTML = '
  • '; - console.log("[Explorer] Rendering", trie.children.length, "children"); for (const child of trie.children) { renderTree(child, explorerUl, currentSlug, folderBehavior, savedState, ""); } - console.log("[Explorer] Render complete, final list length:", explorerUl.children.length); } else { console.warn("[Explorer] No trie or empty children"); } @@ -297,8 +285,6 @@ async function handleNavOrRender(e) { activeElement.scrollIntoView({ behavior: "smooth" }); } } - } else { - console.log("[Explorer] Stale render generation, skipping tree render"); } // Always set up event listeners, regardless of render generation @@ -409,8 +395,36 @@ async function handleNavOrRender(e) { } } -document.addEventListener("nav", handleNavOrRender); -document.addEventListener("render", handleNavOrRender); +// "nav" and "render" can both fire for the same navigation (e.g. a plugin +// that dispatches "render" right after "nav" to signal a content-index +// update). Coalesce same-tick dispatches into a single tree rebuild instead +// of rebuilding once per event, while still keeping the most recent url. +let pendingDetail = null; +let isRenderScheduled = false; + +function scheduleNavOrRender(e) { + const previousUrl = pendingDetail?.url; + pendingDetail = { ...(pendingDetail || {}), ...(e?.detail || {}) }; + // Only fall back to the previous url if this event didn't carry one at + // all (e.g. "render" with no detail) — an explicit "" url (root page) is + // a real value and must not be discarded. + if (pendingDetail.url == null && previousUrl != null) { + pendingDetail.url = previousUrl; + } + + if (!isRenderScheduled) { + isRenderScheduled = true; + queueMicrotask(() => { + const detail = pendingDetail; + isRenderScheduled = false; + pendingDetail = null; + handleNavOrRender({ detail }); + }); + } +} + +document.addEventListener("nav", scheduleNavOrRender); +document.addEventListener("render", scheduleNavOrRender); document.addEventListener("prenav", () => { const explorer = document.querySelector(".explorer-ul");