Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
119 lines
3.9 KiB
JavaScript
119 lines
3.9 KiB
JavaScript
(() => {
|
|
"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();
|
|
})();
|