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";
var BETTER_ALTERNATIVES = [];
@ -14,14 +14,14 @@ chrome.runtime.onStartup.addListener(() => {
});
function fetchAllLists(listUrls) {
var promises = listUrls.map((listUrl) =>
fetch(listUrl)
.then((resp) => resp.json())
.catch((e) => console.log("List errored out", e))
var promises = listUrls.map(
(listUrl) => fetch(listUrl).then((resp) => resp.json())
// .catch((e) => console.log("List errored out", e))
);
Promise.all(promises).then((results) => {
BETTER_ALTERNATIVES = results;
// wait for all requests to complete, ignore errors
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 () {
console.log("Set betterSource");
});
@ -29,11 +29,15 @@ function fetchAllLists(listUrls) {
}
function onStartup() {
chrome.storage.sync.get(["betterSourceURL"], function (result) {
var listUrl = result.betterSourceURL || DEFAULT_LIST_URL;
// Uncomment this when testing list changes locally
// listUrl = "/defaultlist.json";
fetchAllLists([listUrl, "/lists/t1.json", "/lists/t2.json"]);
chrome.storage.sync.get(["betterSourceUrls"], function (result) {
let betterSourceUrls = [];
if (result && result.betterSourceUrls) {
betterSourceUrls = JSON.parse(result.betterSourceUrls);
}
if (betterSourceUrls.length === 0) {
betterSourceUrls = [DEFAULT_LIST_URL];
}
fetchAllLists(betterSourceUrls);
});
}

View File

@ -1,39 +1,49 @@
<!DOCTYPE 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] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
box-sizing: border-box;
}
<head>
<style>
body {
margin: 40px auto;
max-width: 650px;
line-height: 1.6;
font-size: 18px;
color: #444;
padding: 0 10px
}
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 -->
<input id="betterSourceText" type="url" placeholder="https://cdn.jsdelivr.net/gh/nileshtrivedi/better/defaultlist.json" />
<button id="betterSourceSubmit" value="Save">Save</button>
h1,
h2,
h3 {
line-height: 1.2
}
input[type=url] {
width: 100%;
padding: 12px 20px;
margin: 8px 0;
box-sizing: border-box;
}
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>
</body>
<script src="options.js"></script>
<button id="addSourceButton">Add a new source +</button>
<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>

View File

@ -1,14 +1,60 @@
let input = document.getElementById('betterSourceText');
let submit = document.getElementById('betterSourceSubmit');
let DEFAULT_LIST_URL =
"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() {
chrome.storage.sync.set({betterSourceURL: input.value}, function() {
console.log('Set betterSource = ' + input.value);
});
function storePrefs(sourceUrls) {
sourceUrls = sourceUrls.filter((url) => url != "");
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) => {
if (response) {
console.log("BETTER_ALTERNATIVES list is reloaded");
}
});
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) {
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);
});
});