import { initializeSettingsState, settingsState, } from "@/seqta/utils/listeners/SettingsState"; import documentLoadCSS from "@/css/documentload.scss?inline"; import icon48 from "@/resources/icons/icon-48.png?base64"; import browser from "webextension-polyfill"; import * as plugins from "@/plugins"; import { main } from "@/seqta/main"; import { delay } from "./seqta/utils/delay"; import { initializeHideSensitiveToggle } from "@/seqta/utils/hideSensitiveToggle"; function registerFetchSeqtaAppLinkListener() { browser.runtime.onMessage.addListener((request, _sender, sendResponse) => { if (request?.type !== "fetchSeqtaAppLink") return false; void (async () => { try { const res = await fetch(`${location.origin}/seqta/student/load/profile`, { method: "POST", headers: { "Content-Type": "application/json" }, credentials: "include", body: JSON.stringify({}), }); const data = await res.json(); const statusOk = data?.status === "200" || data?.status === 200; const raw = data?.payload?.app_link; const appLink = typeof raw === "string" && raw.length > 0 ? raw : null; sendResponse({ appLink: statusOk ? appLink : null }); } catch { sendResponse({ appLink: null }); } })(); return true; }); } export let MenuOptionsOpen = false; var IsSEQTAPage = false; let hasSEQTAText = false; // This check is placed outside of the document load event due to issues with EP (https://github.com/BetterSEQTA/BetterSEQTA-Plus/issues/84) if (document.childNodes[1]) { hasSEQTAText = document.childNodes[1].textContent?.includes( "Copyright (c) SEQTA Software", ) ?? false; init(); } async function init() { if ( hasSEQTAText && (document.title.includes("SEQTA Learn") || document.title.includes("SEQTA Engage")) && !IsSEQTAPage ) { IsSEQTAPage = true; console.info("[BetterSEQTA+] Verified SEQTA Page"); if (typeof window !== "undefined" && window === window.top) { void browser.runtime.sendMessage({ type: "cloudSettingsPoll" }).catch(() => {}); } registerFetchSeqtaAppLinkListener(); const documentLoadStyle = document.createElement("style"); documentLoadStyle.textContent = documentLoadCSS; document.head.appendChild(documentLoadStyle); replaceIcons(); const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { if ( mutation.type === "attributes" && mutation.target instanceof HTMLLinkElement && mutation.target.rel.includes("icon") && mutation.attributeName === "href" ) { replaceIcons(); return; } } }); observer.observe(document.head, { subtree: true, attributes: true, attributeFilter: ["href"], }); try { await initializeSettingsState(); if (typeof settingsState.onoff === "undefined") { await browser.runtime.sendMessage({ type: "setDefaultStorage" }); await delay(5); } await main(); plugins.Monofile(); if (settingsState.onoff) { await plugins.initializePlugins(); } if (settingsState.devMode) { initializeHideSensitiveToggle(); } console.info( "[BetterSEQTA+] Successfully initialised BetterSEQTA+, starting to load assets.", ); } catch (error) { console.error(error); } } } function replaceIcons() { document .querySelectorAll('link[rel*="icon"]') .forEach((link) => { if (link.href !== icon48) { link.href = icon48; } }); }