feat: options to add, edit, remove source lists (#36)

* feat: options to add, edit, remove source lists

* fix: failure recovery even if one or more sources fail
This commit is contained in:
Mitesh 2020-09-12 23:58:30 +05:30 committed by GitHub
parent 17a069bee5
commit 1c4e6ffcfb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 116 additions and 56 deletions

View File

@ -1,4 +1,4 @@
var DEFAULT_LIST_URL = let DEFAULT_LIST_URL =
"https://cdn.jsdelivr.net/gh/nileshtrivedi/better/defaultlist.json"; "https://cdn.jsdelivr.net/gh/nileshtrivedi/better/defaultlist.json";
var BETTER_ALTERNATIVES = []; var BETTER_ALTERNATIVES = [];
@ -14,14 +14,14 @@ chrome.runtime.onStartup.addListener(() => {
}); });
function fetchAllLists(listUrls) { function fetchAllLists(listUrls) {
var promises = listUrls.map((listUrl) => var promises = listUrls.map(
fetch(listUrl) (listUrl) => fetch(listUrl).then((resp) => resp.json())
.then((resp) => resp.json()) // .catch((e) => console.log("List errored out", e))
.catch((e) => console.log("List errored out", e))
); );
Promise.all(promises).then((results) => { // wait for all requests to complete, ignore errors
BETTER_ALTERNATIVES = results; Promise.all(promises.map((p) => p.catch((e) => null))).then((results) => {
BETTER_ALTERNATIVES = results.filter((item) => item != null);
chrome.storage.local.set({ betterSourceData: results }, function () { chrome.storage.local.set({ betterSourceData: results }, function () {
console.log("Set betterSource"); console.log("Set betterSource");
}); });
@ -29,11 +29,15 @@ function fetchAllLists(listUrls) {
} }
function onStartup() { function onStartup() {
chrome.storage.sync.get(["betterSourceURL"], function (result) { chrome.storage.sync.get(["betterSourceUrls"], function (result) {
var listUrl = result.betterSourceURL || DEFAULT_LIST_URL; let betterSourceUrls = [];
// Uncomment this when testing list changes locally if (result && result.betterSourceUrls) {
// listUrl = "/defaultlist.json"; betterSourceUrls = JSON.parse(result.betterSourceUrls);
fetchAllLists([listUrl, "/lists/t1.json", "/lists/t2.json"]); }
if (betterSourceUrls.length === 0) {
betterSourceUrls = [DEFAULT_LIST_URL];
}
fetchAllLists(betterSourceUrls);
}); });
} }

View File

@ -1,39 +1,49 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<style>
body {
margin: 40px auto;
max-width:650px;
line-height:1.6;
font-size:18px;
color:#444;
padding:0 10px
}
h1,h2,h3 {
line-height:1.2
}
input[type=url] { <head>
width: 100%; <style>
padding: 12px 20px; body {
margin: 8px 0; margin: 40px auto;
box-sizing: border-box; max-width: 650px;
} line-height: 1.6;
font-size: 18px;
color: #444;
padding: 0 10px
}
button { h1,
padding: 5px 5px; h2,
font-size: 16px; h3 {
} line-height: 1.2
</style> }
</head>
<body> input[type=url] {
<div> width: 100%;
<h3>Choose a different source of suggestions!</h3> padding: 12px 20px;
<!-- TODO: Fetch the current option value and set in URL field below --> margin: 8px 0;
<input id="betterSourceText" type="url" placeholder="https://cdn.jsdelivr.net/gh/nileshtrivedi/better/defaultlist.json" /> box-sizing: border-box;
<button id="betterSourceSubmit" value="Save">Save</button> }
button {
padding: 5px 5px;
font-size: 16px;
}
</style>
</head>
<body>
<div>
<h3>Choose a different source of suggestions!</h3>
<!-- TODO: Fetch the current option value and set in URL field below -->
<div id="betterSourceInputContainer">
</div> </div>
</body> <button id="addSourceButton">Add a new source +</button>
<script src="options.js"></script>
<button id="betterSourceSubmit" value="Save">Save</button>
</div>
<p><small>To delete a source: empty the field, hit save, and refresh the page.</small></p>
</body>
<script src="options.js"></script>
</html> </html>

View File

@ -1,14 +1,60 @@
let input = document.getElementById('betterSourceText'); let DEFAULT_LIST_URL =
let submit = document.getElementById('betterSourceSubmit'); "https://cdn.jsdelivr.net/gh/nileshtrivedi/better/defaultlist.json";
let addSourceButton = document.getElementById("addSourceButton");
let submit = document.getElementById("betterSourceSubmit");
let betterSourceInputContainer = document.getElementById(
"betterSourceInputContainer"
);
submit.addEventListener('click', function() { function storePrefs(sourceUrls) {
chrome.storage.sync.set({betterSourceURL: input.value}, function() { sourceUrls = sourceUrls.filter((url) => url != "");
console.log('Set betterSource = ' + input.value); let prefs = {
}); betterSourceUrls: JSON.stringify(sourceUrls),
};
chrome.storage.sync.set(prefs, function () {
console.log("Saved", prefs);
});
}
chrome.runtime.sendMessage({type: 'reloadList', url: input.value}, (response) => { function addUrlInput(value) {
if (response) { let newInput = document.createElement("input");
console.log("BETTER_ALTERNATIVES list is reloaded"); newInput.setAttribute("name", "url[]");
} newInput.setAttribute("type", "url");
}); newInput.setAttribute("placeholder", "https://source.com/list.json");
if (value) {
newInput.setAttribute("value", value);
}
betterSourceInputContainer.appendChild(newInput);
}
addSourceButton.addEventListener("click", function (e) {
e.preventDefault();
addUrlInput(null);
});
submit.addEventListener("click", function () {
let $sourceUrls = document.querySelectorAll("[name='url[]']");
let sourceUrls = Array.from($sourceUrls).map((elem) => elem.value);
storePrefs(sourceUrls);
chrome.runtime.sendMessage({ type: "reloadList" }, (response) => {
if (response) {
console.log("BETTER_ALTERNATIVES list is reloaded");
}
});
});
chrome.storage.sync.get(["betterSourceUrls"], (result) => {
// populate input fields from stored sources or show default source
let betterSourceUrls = [];
if (result && result.betterSourceUrls) {
betterSourceUrls = JSON.parse(result.betterSourceUrls);
}
if (betterSourceUrls.length === 0) {
betterSourceUrls = [DEFAULT_LIST_URL];
}
betterSourceUrls.map((sourceUrl) => {
addUrlInput(sourceUrl);
});
}); });