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>
<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] {
width: 100%; width: 100%;
padding: 12px 20px; padding: 12px 20px;
margin: 8px 0; margin: 8px 0;
box-sizing: border-box; box-sizing: border-box;
} }
button { button {
padding: 5px 5px; padding: 5px 5px;
font-size: 16px; font-size: 16px;
} }
</style> </style>
</head> </head>
<body>
<body>
<div> <div>
<h3>Choose a different source of suggestions!</h3> <h3>Choose a different source of suggestions!</h3>
<!-- TODO: Fetch the current option value and set in URL field below --> <!-- TODO: Fetch the current option value and set in URL field below -->
<input id="betterSourceText" type="url" placeholder="https://cdn.jsdelivr.net/gh/nileshtrivedi/better/defaultlist.json" /> <div id="betterSourceInputContainer">
</div>
<button id="addSourceButton">Add a new source +</button>
<button id="betterSourceSubmit" value="Save">Save</button> <button id="betterSourceSubmit" value="Save">Save</button>
</div> </div>
</body> <p><small>To delete a source: empty the field, hit save, and refresh the page.</small></p>
<script src="options.js"></script> </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) {
let newInput = document.createElement("input");
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) { if (response) {
console.log("BETTER_ALTERNATIVES list is reloaded"); 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);
});
});