schoolbox web extension :)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(plugins/homepageSwitcher): hot reload

willow 134e0920 99f442ac

+42 -14
+37 -12
src/entrypoints/plugins/homepageSwitcher.ts
··· 1 1 import { browser } from "#imports"; 2 2 import { definePlugin } from "@/utils/plugin"; 3 3 4 + let logos: HTMLAnchorElement[] | null = null; 5 + let controller = new AbortController(); 6 + 4 7 export default function init() { 5 8 definePlugin( 6 9 "homepageSwitcher", 7 10 (settings) => { 8 - const logos = Array.from(document.getElementsByClassName("logo")) as HTMLAnchorElement[]; 9 - logos.forEach((logo) => { 10 - logo.addEventListener("click", async function (e) { 11 - if (window.location.pathname === "/") return; 12 - e.preventDefault(); 13 - const tab = logos[0].href; 14 - if (settings?.toggle.closeCurrentTab === true) { 15 - window.close(); 16 - } 17 - browser.runtime.sendMessage({ toTab: tab }); 18 - }); 19 - }); 11 + if (logos !== null) return; 12 + 13 + logos = Array.from(document.getElementsByClassName("logo")) as HTMLAnchorElement[]; 14 + 15 + // add event listeners 16 + const closeCurrentTab = settings?.toggle.closeCurrentTab === true; 17 + for (const logo of logos) { 18 + logo.addEventListener( 19 + "click", 20 + (e) => { 21 + if (window.location.pathname === "/") return; 22 + 23 + e.preventDefault(); 24 + 25 + if (logos) { 26 + const tab = logos[0].href; 27 + console.log("closeCurrentTab", closeCurrentTab); 28 + if (closeCurrentTab) window.close(); // TODO: Scripts may only close windows that were opened by a script. 29 + browser.runtime.sendMessage({ toTab: tab }); 30 + } 31 + }, 32 + { 33 + signal: controller.signal, 34 + }, 35 + ); 36 + } 37 + }, 38 + () => { 39 + if (logos === null) return; 40 + 41 + // remove event listeners 42 + controller.abort(); 43 + 44 + logos = null; 20 45 }, 21 46 [".logo"], 22 47 );
+5 -2
src/utils/plugin.ts
··· 9 9 toggle: Record<string, boolean>; 10 10 slider: Record<string, Slider>; 11 11 }) => Promise<void> | void, 12 - uninjectCallback: () => void, 12 + uninjectCallback: (settings?: { 13 + toggle: Record<string, boolean>; 14 + slider: Record<string, Slider>; 15 + }) => Promise<void> | void, 13 16 elementsToWaitFor: string[] = [], 14 17 ) { 15 18 const plugin = await plugins[pluginId].toggle.storage.getValue(); ··· 27 30 28 31 const uninject = () => { 29 32 logger.info(`uninjecting plugin: ${plugins[pluginId].name}`); 30 - uninjectCallback(); 33 + uninjectCallback(getSettingsValues(plugins[pluginId]?.settings)); 31 34 }; 32 35 33 36 const initWatchers = () => {