freshroute-server
Version:
Local development server for FreshRoute extension with API mocking and extended functionality
113 lines (112 loc) • 4.54 kB
JavaScript
;
document.addEventListener("DOMContentLoaded", async () => {
const extensionToggle = document.getElementById("extensionToggle");
const notificationsToggle = document.getElementById("notificationsToggle");
const statusDiv = document.getElementById("status");
const statusText = document.getElementById("statusText");
const urlRulesCount = document.getElementById("urlRulesCount");
const headerRulesCount = document.getElementById("headerRulesCount");
const mockRulesCount = document.getElementById("mockRulesCount");
const activeRulesCount = document.getElementById("activeRulesCount");
const manageRulesBtn = document.getElementById("manageRules");
const clearRulesBtn = document.getElementById("clearRules");
await loadSettings();
extensionToggle.addEventListener("change", async (e) => {
const enabled = e.target.checked;
if (enabled) {
const lastActivityTimestamp = Date.now();
await chrome.storage.sync.set({ extensionEnabled: enabled, lastActivityTimestamp });
} else {
await chrome.storage.sync.set({ extensionEnabled: enabled });
}
updateStatus(enabled);
chrome.runtime.sendMessage({ action: "updateRules" });
notifyContentScripts({ action: "updateExtensionSettings", enabled });
});
notificationsToggle.addEventListener("change", async (e) => {
const enabled = e.target.checked;
await chrome.storage.sync.set({ notificationsEnabled: enabled });
});
manageRulesBtn.addEventListener("click", () => {
chrome.runtime.openOptionsPage();
});
clearRulesBtn.addEventListener("click", async () => {
if (confirm("Are you sure you want to clear all rules? This action cannot be undone.")) {
await chrome.storage.local.set({ rules: [], groups: [] });
await loadSettings();
chrome.runtime.sendMessage({ action: "updateRules" });
}
});
async function loadSettings() {
try {
const [syncData, localData] = await Promise.all([
chrome.storage.sync.get(["extensionEnabled", "notificationsEnabled"]),
chrome.storage.local.get(["rules", "groups"])
]);
const { extensionEnabled, notificationsEnabled } = syncData;
const { rules, groups } = localData;
extensionToggle.checked = extensionEnabled !== false;
notificationsToggle.checked = notificationsEnabled !== false;
updateStatus(extensionEnabled !== false);
let allRules = [];
if (groups && groups.length > 0) {
groups.forEach((group) => {
if (group.enabled !== false) {
allRules.push(...group.rules);
}
});
} else if (rules && rules.length > 0) {
allRules = rules;
}
const urlRules = allRules.filter((r) => r.type === "url_rewrite");
const headerRules = allRules.filter((r) => r.type === "modify_headers");
const mockRules = allRules.filter((r) => r.type === "mock");
const activeRules = allRules.filter((r) => r.enabled);
urlRulesCount.textContent = urlRules.length;
headerRulesCount.textContent = headerRules.length;
mockRulesCount.textContent = mockRules.length;
activeRulesCount.textContent = activeRules.length;
} catch (error) {
console.error("Error loading settings:", error);
statusText.textContent = "Error loading settings";
statusDiv.className = "status disabled";
}
}
function updateStatus(enabled) {
if (enabled) {
statusText.textContent = "Extension Enabled";
statusDiv.className = "status enabled";
} else {
statusText.textContent = "Extension Disabled";
statusDiv.className = "status disabled";
}
}
chrome.storage.onChanged.addListener((changes, namespace) => {
if (namespace === "sync" || namespace === "local") {
loadSettings();
}
});
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.action === "updateExtensionEnabled") {
extensionToggle.checked = message.enabled;
updateStatus(message.enabled);
if (message.enabled) {
const lastActivityTimestamp = Date.now();
chrome.storage.sync.set({ lastActivityTimestamp });
}
}
});
async function notifyContentScripts(message) {
try {
const tabs = await chrome.tabs.query({});
for (const tab of tabs) {
try {
await chrome.tabs.sendMessage(tab.id, message);
} catch (error) {
}
}
} catch (error) {
console.error("Error notifying content scripts:", error);
}
}
});