Import source: popup/popup

Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
arsam
2026-09-18 23:07:29 +03:30
parent 5daceff61c
commit 1d2fbd36c6
3 changed files with 424 additions and 0 deletions
+118
View File
@@ -0,0 +1,118 @@
(() => {
"use strict";
const DEFAULTS = {
enabled: true,
fixDirection: true,
useFont: true,
fixInputs: true,
disabledSites: []
};
const els = {
host: document.getElementById("host"),
status: document.getElementById("siteStatus"),
thisSite: document.getElementById("thisSite"),
fixDirection: document.getElementById("fixDirection"),
useFont: document.getElementById("useFont"),
fixInputs: document.getElementById("fixInputs"),
enabled: document.getElementById("enabled")
};
let hostname = "";
let supportedPage = false;
let storageFailed = false;
let state = { ...DEFAULTS };
function pageInfo(url) {
try {
const parsed = new URL(url);
const supported = (parsed.protocol === "http:" || parsed.protocol === "https:") && !!parsed.hostname;
return { hostname: supported ? parsed.hostname : "", supported };
} catch (error) {
return { hostname: "", supported: false };
}
}
function setDisabled(el, disabled) {
el.disabled = disabled;
const row = el.closest(".setting-row");
if (row) row.classList.toggle("is-disabled", disabled);
}
function setStatus(text, tone) {
els.status.textContent = text;
els.status.dataset.tone = tone;
}
function render() {
const siteDisabled = hostname ? state.disabledSites.includes(hostname) : false;
const masterOff = !state.enabled;
els.host.textContent = supportedPage ? hostname : "Unavailable";
els.enabled.checked = !!state.enabled;
els.thisSite.checked = supportedPage && !siteDisabled;
els.fixDirection.checked = !!state.fixDirection;
els.useFont.checked = !!state.useFont;
els.fixInputs.checked = !!state.fixInputs;
setDisabled(els.thisSite, storageFailed || masterOff || !supportedPage);
setDisabled(els.fixDirection, storageFailed || masterOff);
setDisabled(els.useFont, storageFailed || masterOff);
setDisabled(els.fixInputs, storageFailed || masterOff);
if (storageFailed) setStatus("Settings unavailable", "error");
else if (!supportedPage) setStatus("This page cannot be modified", "error");
else if (masterOff) setStatus("Extension paused everywhere", "paused");
else if (siteDisabled) setStatus("Paused on this site", "paused");
else setStatus("Persian correction active", "active");
}
function save(patch) {
Object.assign(state, patch);
chrome.storage.local.set(patch, () => {
if (chrome.runtime.lastError) storageFailed = true;
render();
});
render();
}
function init() {
chrome.storage.local.get(DEFAULTS, (stored) => {
if (chrome.runtime.lastError) storageFailed = true;
else state = { ...DEFAULTS, ...stored };
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
const info = pageInfo(tabs && tabs[0] ? tabs[0].url || "" : "");
hostname = info.hostname;
supportedPage = info.supported;
render();
});
});
}
els.enabled.addEventListener("change", (event) => save({ enabled: event.target.checked }));
els.fixDirection.addEventListener("change", (event) => save({ fixDirection: event.target.checked }));
els.useFont.addEventListener("change", (event) => save({ useFont: event.target.checked }));
els.fixInputs.addEventListener("change", (event) => save({ fixInputs: event.target.checked }));
els.thisSite.addEventListener("change", (event) => {
if (!hostname) return;
const disabledSites = state.disabledSites.filter((site) => site !== hostname);
if (!event.target.checked) disabledSites.push(hostname);
save({ disabledSites });
});
chrome.storage.onChanged.addListener((changes, area) => {
if (area !== "local") return;
let changed = false;
for (const key of Object.keys(DEFAULTS)) {
if (changes[key]) {
state[key] = changes[key].newValue;
changed = true;
}
}
if (changed) render();
});
init();
})();