flashlang/src/background/background.ts

87 lines
2.8 KiB
TypeScript

import browser, { type Runtime } from "webextension-polyfill";
import { GTranslate } from "./translate";
import { Flashcards } from "./database";
import { BackgroundMessenger } from "../background_frontend_commands";
import content_script from "../frontend/content_script/content_script.ts?file";
const con = new BackgroundMessenger();
const scraper = new GTranslate();
con.addMessageListener("translate", async (toTranslate, sender) => {
return scraper.translate(toTranslate, await getCurrentLanguages());
});
con.addMessageListener("getLanguages", () => scraper.get_languages());
const db = new Flashcards();
window.flashcardDB = db;
con.addMessageListener("addFlashcard", (c) => db.addFlashcard(c));
con.addMessageListener("removeFlashcard", (c) => db.removeFlashcard(c));
const getCurrentLanguages = async () => {
const langs = await scraper.get_languages();
const srcLangCode =
(await browser.storage.local.get("srcLang"))["srcLang"] ?? "de";
const dstLangCode =
(await browser.storage.local.get("dstLang"))["dstLang"] ?? "en";
const srcLang = langs.filter((l) => l.code == srcLangCode).pop()!;
const dstLang = langs.filter((l) => l.code == dstLangCode).pop()!;
return { srcLang: srcLang, dstLang: dstLang };
};
const setCurrentLanguages = async (l: Partial<LanguagePair>) => {
if (l.srcLang) await browser.storage.local.set({ srcLang: l.srcLang.code });
if (l.dstLang) await browser.storage.local.set({ dstLang: l.dstLang.code });
};
con.addMessageListener("getCurrentLanguages", getCurrentLanguages);
con.addMessageListener("setCurrentLanguages", setCurrentLanguages);
const getTabID = async (s: Runtime.MessageSender): Promise<number> => {
if (s.tab?.id) return s.tab.id;
const tabs = await browser.tabs.query({
active: true,
currentWindow: true,
});
return tabs[0].id!;
};
const isEnabledSession = async (tabID: number): Promise<boolean> =>
(await browser.sessions.getTabValue(tabID, "lingoEnabled")) ?? false;
const setEnabledSession = async (tabID: number, value: boolean) =>
await browser.sessions.setTabValue(tabID, "lingoEnabled", value);
const injectScript = async (tabID: number, enabled?: boolean) => {
await browser.tabs.executeScript(tabID, {
file: content_script,
});
if (enabled === undefined) enabled = await isEnabledSession(tabID);
con.runCommand("setEnabled", enabled, tabID);
};
con.addMessageListener(
"setEnabled",
async (v: boolean, s?: Runtime.MessageSender) => {
const tab = await getTabID(s!);
if ((await isEnabledSession(tab)) == v) return;
injectScript(tab);
await setEnabledSession(tab, v);
}
);
con.addMessageListener("getEnabled", async (s: Runtime.MessageSender) => {
const tab = await getTabID(s);
return isEnabledSession(tab);
});
browser.tabs.onUpdated.addListener(async (tabID, changeInfo) => {
if (changeInfo.status == "complete") {
if (await isEnabledSession(tabID)) {
injectScript(tabID);
}
}
});