87 lines
2.8 KiB
TypeScript
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);
|
|
}
|
|
}
|
|
});
|