From 9d24d07c12b5f84afbb6409c0dd2f7afb3d73dbe Mon Sep 17 00:00:00 2001 From: Aden Linday Date: Fri, 20 Feb 2026 18:43:02 +1030 Subject: [PATCH] chore: appease codefactor AGAIN --- src/background.ts | 415 ++++++++++++++++------------------- src/seqta/utils/CloudAuth.ts | 2 +- 2 files changed, 191 insertions(+), 226 deletions(-) diff --git a/src/background.ts b/src/background.ts index 0adf7a5d..c7a2d6c8 100644 --- a/src/background.ts +++ b/src/background.ts @@ -14,234 +14,199 @@ function reloadSeqtaPages() { result.then(open, console.error); } +type MessageSender = (response?: any) => void; + +function handleFetchThemes(request: any, sendResponse: MessageSender): boolean { + const { token } = request; + const apiUrl = `https://betterseqta.org/api/themes?type=betterseqta&limit=100&nocache=${Date.now()}`; + const githubUrl = `https://raw.githubusercontent.com/BetterSEQTA/BetterSEQTA-Themes/main/store/themes.json?nocache=${Date.now()}`; + const headers: Record = {}; + if (token) headers["Authorization"] = `Bearer ${token}`; + fetch(apiUrl, { cache: "no-store", headers }) + .then((r) => r.json()) + .then(sendResponse) + .catch((err) => { + console.warn("[Background] fetchThemes API failed, trying GitHub fallback:", err?.message); + fetch(githubUrl, { cache: "no-store" }) + .then((r) => r.json()) + .then((data) => sendResponse({ success: true, data: { themes: data.themes ?? [] } })) + .catch((fallbackErr) => { + console.error("[Background] fetchThemes GitHub fallback error:", fallbackErr); + sendResponse({ success: false, error: fallbackErr?.message }); + }); + }); + return true; +} + +function handleFetchThemeDetails(request: any, sendResponse: MessageSender): boolean { + const { themeId, token } = request; + if (!themeId || typeof themeId !== "string") { + sendResponse({ success: false, error: "Missing themeId" }); + return false; + } + const headers: Record = {}; + if (token) headers["Authorization"] = `Bearer ${token}`; + fetch(`https://betterseqta.org/api/themes/${themeId}`, { cache: "no-store", headers }) + .then((r) => r.json()) + .then(sendResponse) + .catch((err) => { + console.error("[Background] fetchThemeDetails error:", err); + sendResponse({ success: false, error: err?.message }); + }); + return true; +} + +function handleFetchFromUrl(request: any, sendResponse: MessageSender): boolean { + const { url } = request; + if (!url || typeof url !== "string") { + sendResponse({ error: "Missing url" }); + return false; + } + fetch(url, { cache: "no-store" }) + .then((r) => r.json()) + .then((data) => sendResponse({ data })) + .catch((err) => { + console.error("[Background] fetchFromUrl error:", err); + sendResponse({ error: err?.message }); + }); + return true; +} + +async function parseJsonResponse(r: Response): Promise { + const text = await r.text(); + try { + return text ? JSON.parse(text) : {}; + } catch { + return {}; + } +} + +function handleCloudReserveClient(request: any, sendResponse: MessageSender): boolean { + const redirect_uri = request.redirect_uri ?? "https://accounts.betterseqta.org/auth/bsplus/callback"; + fetch("https://accounts.betterseqta.org/api/bsplus/client/reserve", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ redirect_uri }), + }) + .then(async (r) => { + const data = await parseJsonResponse(r); + if (!r.ok) sendResponse({ error: data?.error ?? `Reserve failed (${r.status})` }); + else sendResponse(data); + }) + .catch((err) => { + console.error("[Background] cloudReserveClient error:", err); + sendResponse({ error: err?.message ?? "Network error" }); + }); + return true; +} + +function handleCloudLogin(request: any, sendResponse: MessageSender): boolean { + const { client_id, redirect_uri, login, password } = request; + if (!client_id || !redirect_uri || !login || !password) { + sendResponse({ error: "Missing client_id, redirect_uri, login, or password" }); + return false; + } + fetch("https://accounts.betterseqta.org/api/bsplus/login", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ client_id, redirect_uri, login, password }), + }) + .then(async (r) => { + const data = await parseJsonResponse(r); + if (!r.ok) sendResponse({ error: data?.error ?? "Login failed" }); + else sendResponse(data); + }) + .catch((err) => { + console.error("[Background] cloudLogin error:", err); + sendResponse({ error: err?.message ?? "Network error" }); + }); + return true; +} + +function handleCloudRefresh(request: any, sendResponse: MessageSender): boolean { + const { refresh_token, client_id } = request; + if (!refresh_token || !client_id) { + sendResponse({ error: "Missing refresh_token or client_id" }); + return false; + } + fetch("https://accounts.betterseqta.org/api/bsplus/refresh", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ refresh_token, client_id }), + }) + .then(async (r) => { + const data = await parseJsonResponse(r); + if (!r.ok) sendResponse({ error: data?.error ?? "Refresh failed" }); + else sendResponse(data); + }) + .catch((err) => { + console.error("[Background] cloudRefresh error:", err); + sendResponse({ error: err?.message ?? "Network error" }); + }); + return true; +} + +function handleCloudFavorite(request: any, sendResponse: MessageSender): boolean { + const { themeId, token, action } = request; + if (!themeId || !token) { + sendResponse({ success: false, error: "Theme ID and token required" }); + return false; + } + const isFavorite = action === "favorite"; + fetch(`https://betterseqta.org/api/themes/${themeId}/favorite`, { + method: isFavorite ? "POST" : "DELETE", + headers: { Authorization: `Bearer ${token}` }, + }) + .then((r) => r.json()) + .then(sendResponse) + .catch((err) => { + console.error("[Background] cloudFavorite error:", err); + sendResponse({ success: false, error: err?.message }); + }); + return true; +} + +const MESSAGE_HANDLERS: Record boolean | void> = { + reloadTabs: () => reloadSeqtaPages(), + extensionPages: (req) => { + browser.tabs.query({}).then((tabs) => { + for (const tab of tabs) { + if (tab.url?.includes("chrome-extension://")) browser.tabs.sendMessage(tab.id!, req); + } + }); + }, + currentTab: (req, sendResponse) => { + browser.tabs.query({ active: true, currentWindow: true }).then((tabs) => { + browser.tabs.sendMessage(tabs[0].id!, req).then(sendResponse); + }); + return true; + }, + githubTab: () => { + void browser.tabs.create({ url: "github.com/BetterSEQTA/BetterSEQTA-Plus" }); + }, + setDefaultStorage: () => SetStorageValue(getDefaultValues()), + sendNews: (req, sendResponse) => { + fetchNews(req.source ?? "australia", sendResponse); + return true; + }, + fetchThemes: handleFetchThemes, + fetchThemeDetails: handleFetchThemeDetails, + fetchFromUrl: handleFetchFromUrl, + cloudReserveClient: handleCloudReserveClient, + cloudLogin: handleCloudLogin, + cloudRefresh: handleCloudRefresh, + cloudFavorite: handleCloudFavorite, +}; + browser.runtime.onMessage.addListener( // @ts-ignore - OnMessageListener expects literal true for async, we return boolean - (request: any, _: any, sendResponse: (response?: any) => void) => { - switch (request.type) { - case "reloadTabs": - reloadSeqtaPages(); - break; - - case "extensionPages": - browser.tabs.query({}).then(function (tabs) { - for (let tab of tabs) { - if (tab.url?.includes("chrome-extension://")) { - browser.tabs.sendMessage(tab.id!, request); - } - } - }); - break; - - case "currentTab": - browser.tabs - .query({ active: true, currentWindow: true }) - .then(function (tabs) { - browser.tabs - .sendMessage(tabs[0].id!, request) - .then(function (response) { - sendResponse(response); - }); - }); - return true; - - case "githubTab": - browser.tabs.create({ url: "github.com/BetterSEQTA/BetterSEQTA-Plus" }); - break; - - case "setDefaultStorage": - SetStorageValue(getDefaultValues()); - break; - - case "sendNews": - fetchNews(request.source ?? "australia", sendResponse); - return true; - - case "fetchThemes": { - const { token } = request; - const apiUrl = `https://betterseqta.org/api/themes?type=betterseqta&limit=100&nocache=${Date.now()}`; - const githubUrl = `https://raw.githubusercontent.com/BetterSEQTA/BetterSEQTA-Themes/main/store/themes.json?nocache=${Date.now()}`; - const headers: Record = {}; - if (token) headers["Authorization"] = `Bearer ${token}`; - fetch(apiUrl, { cache: "no-store", headers }) - .then((r) => r.json()) - .then(sendResponse) - .catch((err) => { - console.warn("[Background] fetchThemes API failed, trying GitHub fallback:", err?.message); - fetch(githubUrl, { cache: "no-store" }) - .then((r) => r.json()) - .then((data) => sendResponse({ success: true, data: { themes: data.themes ?? [] } })) - .catch((fallbackErr) => { - console.error("[Background] fetchThemes GitHub fallback error:", fallbackErr); - sendResponse({ success: false, error: fallbackErr?.message }); - }); - }); - return true; - } - - case "fetchThemeDetails": { - const { themeId, token } = request; - if (!themeId || typeof themeId !== "string") { - sendResponse({ success: false, error: "Missing themeId" }); - return false; - } - const headers: Record = {}; - if (token) headers["Authorization"] = `Bearer ${token}`; - fetch(`https://betterseqta.org/api/themes/${themeId}`, { - cache: "no-store", - headers, - }) - .then((r) => r.json()) - .then(sendResponse) - .catch((err) => { - console.error("[Background] fetchThemeDetails error:", err); - sendResponse({ success: false, error: err?.message }); - }); - return true; - } - - case "fetchFromUrl": { - const { url } = request; - if (!url || typeof url !== "string") { - sendResponse({ error: "Missing url" }); - return false; - } - fetch(url, { cache: "no-store" }) - .then((r) => r.json()) - .then((data) => sendResponse({ data })) - .catch((err) => { - console.error("[Background] fetchFromUrl error:", err); - sendResponse({ error: err?.message }); - }); - return true; - } - - case "cloudReserveClient": { - const redirect_uri = - request.redirect_uri ?? "https://accounts.betterseqta.org/auth/bsplus/callback"; - fetch("https://accounts.betterseqta.org/api/bsplus/client/reserve", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ redirect_uri }), - }) - .then(async (r) => { - const text = await r.text(); - let data: any = {}; - try { - data = text ? JSON.parse(text) : {}; - } catch { - sendResponse({ error: "Invalid response from server" }); - return; - } - if (!r.ok) { - sendResponse({ - error: data?.error ?? `Reserve failed (${r.status})`, - }); - } else { - sendResponse(data); - } - }) - .catch((err) => { - console.error("[Background] cloudReserveClient error:", err); - sendResponse({ error: err?.message ?? "Network error" }); - }); - return true; - } - - case "cloudLogin": { - const { client_id, redirect_uri, login, password } = request; - if (!client_id || !redirect_uri || !login || !password) { - sendResponse({ - error: "Missing client_id, redirect_uri, login, or password", - }); - return false; - } - fetch("https://accounts.betterseqta.org/api/bsplus/login", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - client_id, - redirect_uri, - login, - password, - }), - }) - .then(async (r) => { - const text = await r.text(); - let data: any = {}; - try { - data = text ? JSON.parse(text) : {}; - } catch { - sendResponse({ error: "Invalid response from server" }); - return; - } - if (!r.ok) { - sendResponse({ error: data?.error ?? "Login failed" }); - return; - } - sendResponse(data); - }) - .catch((err) => { - console.error("[Background] cloudLogin error:", err); - sendResponse({ error: err?.message ?? "Network error" }); - }); - return true; - } - - case "cloudRefresh": { - const { refresh_token, client_id } = request; - if (!refresh_token || !client_id) { - sendResponse({ error: "Missing refresh_token or client_id" }); - return false; - } - fetch("https://accounts.betterseqta.org/api/bsplus/refresh", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ refresh_token, client_id }), - }) - .then(async (r) => { - const text = await r.text(); - let data: any = {}; - try { - data = text ? JSON.parse(text) : {}; - } catch { - sendResponse({ error: "Invalid response from server" }); - return; - } - if (!r.ok) sendResponse({ error: data?.error ?? "Refresh failed" }); - else sendResponse(data); - }) - .catch((err) => { - console.error("[Background] cloudRefresh error:", err); - sendResponse({ error: err?.message ?? "Network error" }); - }); - return true; - } - - case "cloudFavorite": { - const { themeId, token, action } = request; - if (!themeId || !token) { - sendResponse({ success: false, error: "Theme ID and token required" }); - return false; - } - const isFavorite = action === "favorite"; - const url = `https://betterseqta.org/api/themes/${themeId}/favorite`; - fetch(url, { - method: isFavorite ? "POST" : "DELETE", - headers: { Authorization: `Bearer ${token}` }, - }) - .then((r) => r.json()) - .then(sendResponse) - .catch((err) => { - console.error("[Background] cloudFavorite error:", err); - sendResponse({ success: false, error: err?.message }); - }); - return true; - } - - default: - console.log("Unknown request type"); + (request: any, _: any, sendResponse: MessageSender) => { + const handler = MESSAGE_HANDLERS[request.type]; + if (handler) { + const result = handler(request, sendResponse); + return result === true; } - + console.log("Unknown request type"); return false; }, ); diff --git a/src/seqta/utils/CloudAuth.ts b/src/seqta/utils/CloudAuth.ts index 08ff7a4e..c661e8cb 100644 --- a/src/seqta/utils/CloudAuth.ts +++ b/src/seqta/utils/CloudAuth.ts @@ -24,7 +24,7 @@ export type CloudAuthState = { user: CloudUser | null; }; -type Listener = (_state: CloudAuthState) => void; +type Listener = (state: CloudAuthState) => void; class CloudAuthService { private static instance: CloudAuthService;