From 230c20f6499203d2db0a2ee78d73d0e91aa9ba16 Mon Sep 17 00:00:00 2001 From: ae Date: Sat, 7 Sep 2024 17:01:13 +0300 Subject: [PATCH] feat: re-highlighting with debounced MutationObserver --- iltapulu.fi/ip-highlight.js | 72 ++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/iltapulu.fi/ip-highlight.js b/iltapulu.fi/ip-highlight.js index 44cf14c..6a98f7b 100644 --- a/iltapulu.fi/ip-highlight.js +++ b/iltapulu.fi/ip-highlight.js @@ -22,33 +22,71 @@ const highlightCodes = { } const findSportsItems = () => { - let rawItems = [] - + let sportsItems = [] channelTags.forEach((tag) => { const query = `${tag} .op` const channelItems = document.querySelectorAll(query) - rawItems.push(...channelItems) + + channelItems.forEach((item) => { + const afterStyle = window.getComputedStyle(item, "::after") + + if (afterStyle.content !== "none" && afterStyle.content !== '""') { + sportsItems.push(item) + } + }) }) - - let sportsItems = [] - - rawItems.forEach((item) => { - const afterStyle = window.getComputedStyle(item, "::after") - - if (afterStyle.content !== "none" && afterStyle.content !== '""') { - sportsItems.push(item) - } - }) - return sportsItems } -window.addEventListener("load", () => { +const applyHighlight = () => { const sportsItems = findSportsItems() sportsItems.forEach((item) => { - item.parentElement.style.backgroundColor = highlightCodes["sport"] + if (item.parentElement.style.backgroundColor !== highlightCodes["sport"]) { + item.parentElement.style.backgroundColor = highlightCodes["sport"] + } }) console.log("ip-highlight.js: All sports events highlighted successfully!") -}) +} + +const createUpdateObserver = () => { + let debounceTimer + + const callback = (mutationsList, _observer) => { + clearTimeout(debounceTimer) + + debounceTimer = setTimeout(() => { + for (let mutation of mutationsList) { + if (mutation.type === "childList") { + console.log( + "ip-highlight.js: Re-applying highlighting due to changes in the catalog" + ) + applyHighlight() + break + } + } + }, 100) // Debounce for 100ms + } + + return new MutationObserver(callback) +} + +const initializeHighlighter = () => { + const targetNode = document.getElementById("programtable") + + if (targetNode) { + applyHighlight() + const observer = createUpdateObserver() + observer.observe(targetNode, { childList: true, subtree: true }) + } else { + console.log("ip-highlight.js: Program table not found, retrying in 100ms") + setTimeout(initializeHighlighter, 100) + } +} + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", initializeHighlighter) +} else { + initializeHighlighter() +}