diff --git a/blog.html b/blog.html index 66f9f63a..701205d7 100644 --- a/blog.html +++ b/blog.html @@ -21502,13 +21502,6 @@ svg { ["reply-placeholder", "replyPlaceholder"], ["legacy-url", "legacyUrl"], ]); - const ZAPTHREADS_ATTRIBUTE_NAMES = [...ZAPTHREADS_ATTRIBUTE_MAP.keys()]; - const zapthreadsInstances = new WeakMap(); - const zapthreadsPendingMounts = new WeakSet(); - const scheduleZapthreadsMicrotask = - typeof queueMicrotask == "function" - ? queueMicrotask - : (callback) => Promise.resolve().then(callback); const zapthreadsDataUtils = { Ti, hi, @@ -21540,49 +21533,18 @@ svg { } return options; } - function cleanupZapthreadsEmbed(element) { - const record = zapthreadsInstances.get(element); - if (!record) return; - record.attributeObserver && record.attributeObserver.disconnect(); - if (typeof record.cleanup === "function") { + const zapthreadsCleanupMap = new WeakMap(); + async function initializeZapthreadsEmbed(element) { + if (!(element instanceof Element)) return; + const previousCleanup = zapthreadsCleanupMap.get(element); + if (typeof previousCleanup === "function") { try { - record.cleanup(); + previousCleanup(); } catch (error) { console.error("[zapthreads] cleanup failed", error); } + zapthreadsCleanupMap.delete(element); } - zapthreadsPendingMounts.delete(element); - zapthreadsInstances.delete(element); - } - function scheduleZapthreadsMount(element) { - if (zapthreadsPendingMounts.has(element)) return; - zapthreadsPendingMounts.add(element); - scheduleZapthreadsMicrotask(() => { - zapthreadsPendingMounts.delete(element); - mountZapthreadsEmbed(element); - }); - } - function observeZapthreadsAttributes(element) { - const observer = new MutationObserver((mutations) => { - if ( - mutations.some( - (mutation) => - mutation.type === "attributes" && - mutation.attributeName && - ZAPTHREADS_ATTRIBUTE_NAMES.includes(mutation.attributeName) - ) - ) { - scheduleZapthreadsMount(element); - } - }); - observer.observe(element, { - attributes: !0, - attributeFilter: ZAPTHREADS_ATTRIBUTE_NAMES, - }); - return observer; - } - async function mountZapthreadsEmbed(element) { - cleanupZapthreadsEmbed(element); if (!element.isConnected) return; try { const cleanup = await initZapthreadsEmbed({ @@ -21590,45 +21552,15 @@ svg { options: getZapthreadsOptions(element), dataUtils: zapthreadsDataUtils, }); - const attributeObserver = observeZapthreadsAttributes(element); - zapthreadsInstances.set(element, { cleanup, attributeObserver }); + zapthreadsCleanupMap.set(element, cleanup); } catch (error) { console.error("[zapthreads] failed to initialize embed", error); } } - function handleAddedNode(node) { - if (!(node instanceof Element)) return; - if (node.tagName === "ZAP-THREADS") { - scheduleZapthreadsMount(node); - } - node.querySelectorAll("zap-threads").forEach((element) => { - scheduleZapthreadsMount(element); - }); - } - function handleRemovedNode(node) { - if (!(node instanceof Element)) return; - if (node.tagName === "ZAP-THREADS") { - cleanupZapthreadsEmbed(node); - } - node.querySelectorAll("zap-threads").forEach((element) => { - cleanupZapthreadsEmbed(element); - }); - } function initializeZapthreadsEmbeds() { - document - .querySelectorAll("zap-threads") - .forEach((element) => scheduleZapthreadsMount(element)); - const observer = new MutationObserver((mutations) => { - for (const mutation of mutations) { - mutation.addedNodes.forEach((node) => { - handleAddedNode(node); - }); - mutation.removedNodes.forEach((node) => { - handleRemovedNode(node); - }); - } + document.querySelectorAll("zap-threads").forEach((element) => { + initializeZapthreadsEmbed(element); }); - observer.observe(document.body, { childList: !0, subtree: !0 }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initializeZapthreadsEmbeds, {