function smoothTextChange(element, newText) { // Temporarily hide the element element.classList.add('hide'); setTimeout(() => { element.innerText = newText; element.classList.remove('hide'); }, 500); // Wait for the transition to finish } (async function() { const $version = await new Promise(r => chrome.management.getSelf(self => r(self.version))); document.getElementById("version").innerText = `v${$version}`; await chrome.storage.local.get().then(items => { document.getElementById("activate").checked = items["cfg_activate"] || false; document.getElementById("username").value = items["cfg_username"] || ""; document.getElementById("password").value = items["cfg_password"] || ""; document.getElementById("frequency").value = items["cfg_frequency"] || 1; document.getElementById("frequency_info").innerText = items["cfg_frequency"] || 1; document.getElementById("status").innerText = items["ctx_statusMsg"] || "unknown"; let currentAppt = items["ctx_currentAppt"] || {"consulate": "somewhere", "date": "some time"}; document.getElementById("currApptConsulate").innerText = currentAppt["consulate"]; document.getElementById("currApptDate").innerText = currentAppt["date"]; document.getElementById("deltaAppt").value = items["cfg_deltaAppt"] || 1; document.getElementById("deltaNow").value = items["cfg_deltaNow"] || 1; }); // update frequency value chrome.storage.onChanged.addListener((changes, area) => { if (changes.cfg_frequency) document.getElementById("frequency_info").innerText = changes.cfg_frequency.newValue; }); // update status chrome.storage.onChanged.addListener((changes, area) => { if (changes.ctx_statusMsg) smoothTextChange(document.getElementById("status"), changes.ctx_statusMsg.newValue); }); // activate checkbox document.getElementById("activate").addEventListener("change", async e => { await chrome.storage.local.set({ "cfg_activate": e.target.checked }); }); // credentials let usernameField = document.getElementById("username"); let passwordField = document.getElementById("password"); let showPasswordButton = document.getElementById("showPassword"); let saveCredsButton = document.getElementById("saveButton"); let saveStatusElement = document.getElementById("saveStatus"); async function save_credentials() { await chrome.storage.local.set({ "cfg_username": usernameField.value, "cfg_password": passwordField.value }); saveStatusElement.classList.add("show"); setTimeout(() => { saveStatusElement.classList.remove("show"); }, 2000); } usernameField.addEventListener("keypress", async e => { if (e.key === "Enter") { await save_credentials(); } }); passwordField.addEventListener("keypress", async e => { if (e.key === "Enter") { await save_credentials(); } }); saveCredsButton.addEventListener("click", async () => { await save_credentials(); await chrome.storage.local.set({ "ctx_signinAttempts": 0 }); }); showPasswordButton.addEventListener("mousedown", function() { passwordField.type = "text"; }); showPasswordButton.addEventListener("mouseup", function() { passwordField.type = "password"; }); // range sliders document.getElementById("frequency").addEventListener("input", function() { chrome.storage.local.set({ cfg_frequency: this.value }); }); document.getElementById("deltaAppt").addEventListener("input", function() { chrome.storage.local.set({ cfg_deltaAppt: this.value }); }); document.getElementById("deltaNow").addEventListener("change", function() { chrome.storage.local.set({ cfg_deltaNow: this.value }); }); // consulates await chrome.storage.local.get(['cfg_consulates', 'ctx_consulates']).then((result) => { let consCfg = result['cfg_consulates']; let consCtx = result['ctx_consulates']; let html = ` ` for (let c in consCtx) { let cSelected = consCfg[c]?.isSelected === true ? "checked" : ""; let cAutoBook = consCfg[c]?.autoBook === true ? "checked" : ""; let cId = consCtx[c].id; html += ` `; } html += `
City Current Date Best Date Book
${c} ${consCtx[c].currentDate || "-"} ${consCtx[c].bestDate || "-"}
`; document.getElementById('consulatesConfig').innerHTML = html; for (let c in consCtx) { let cId = consCtx[c].id; document.getElementById(`isSelected-${cId}`).addEventListener("change", async e => { consCfg[c].isSelected = e.target.checked; await chrome.storage.local.set({ "cfg_consulates": consCfg }); }); document.getElementById(`autoBook-${cId}`).addEventListener("change", async e => { consCfg[c].autoBook = e.target.checked; await chrome.storage.local.set({ "cfg_consulates": consCfg }); }); // update current & best dates chrome.storage.onChanged.addListener((changes, area) => { if (area === 'local' && changes.ctx_consulates) { const newConsulates = changes.ctx_consulates.newValue; for (let c in newConsulates) { if (newConsulates[c].currentDate) { let el = document.getElementById(`currentDate-${c}`); if (el && el.innerText != newConsulates[c].currentDate) smoothTextChange(el, newConsulates[c].currentDate); } if (newConsulates[c].bestDate) { let el = document.getElementById(`bestDate-${c}`); if (el && el.innerText != newConsulates[c].bestDate) smoothTextChange(el, newConsulates[c].bestDate); } } } }); } }); // reset button document.getElementById("resetButton").addEventListener("click", async () => { if (confirm("Are you sure you want to reset?")) { await chrome.storage.local.get().then(items => { chrome.storage.local.clear(); // keep user parameters chrome.storage.local.set({ "cfg_activate": items["cfg_activate"] || false, "cfg_username": items["cfg_username"] || "", "cfg_password": items["cfg_password"] || "", "cfg_frequency": items["cfg_frequency"] || 1, "cfg_deltaAppt": items["cfg_deltaAppt"] || 1, "cfg_deltaNow": items["cfg_deltaNow"] || 1, }); }); document.getElementById("status").innerText = "unknown"; document.getElementById("currApptConsulate").innerText = "somewhere"; document.getElementById("currApptDate").innerText = "some time"; document.getElementById('consulatesConfig').innerHTML = "No consulates found."; document.getElementById("resetStatus").classList.add("show"); setTimeout(() => { document.getElementById("resetStatus").classList.remove("show"); }, 2000); } }); // show config button document.getElementById("showConfigButton").addEventListener("click", async () => { let config = await chrome.storage.local.get(); let configStr = JSON.stringify(config, null, 2); let url = "data:text/plain;charset=utf-8," + encodeURIComponent(configStr); chrome.tabs.create({ url: url }); }); })();