-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathoptions.js
118 lines (109 loc) · 3.86 KB
/
options.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
const DEFAULTS = {
whitespaceOpacity: 0.4,
copyableWhitespace: false,
space: '·',
tab: '→',
};
const ui = {};
function init() {
ui.form = document.querySelector('form');
ui.whitespaceOpacity = ui.form.querySelector('[name="whitespace-opacity"]');
ui.copyableWhitespace = ui.form.querySelector('[name="copyable-whitespace"]');
ui.space = ui.form.querySelector('[name="space"]');
ui.tab = ui.form.querySelector('[name="tab"]');
ui.submitButton = ui.form.querySelector('[type="submit"]');
ui.whitespaceIndicatorInputs = Array.from(ui.form.querySelectorAll('.whitespace-indicator-input'));
ui.status = document.querySelector('#status');
ui.preview = document.querySelector('#preview');
ui.restoreDefaultsBtn = document.querySelector('#restore-defaults');
browser.storage.sync.get(DEFAULTS).then(restoreOptions, onError);
ui.whitespaceOpacity.addEventListener('input', updatePreview);
for (const input of ui.whitespaceIndicatorInputs) {
input.addEventListener('focus', function(evt) {
evt.target.select();
});
input.addEventListener('input', updatePreview);
}
ui.form.addEventListener('submit', function(e) {
e.preventDefault();
saveOptions();
});
for (const eventName of ['input', 'change']) {
ui.form.addEventListener(eventName, function() {
ui.status.innerText = 'Unsaved changes';
ui.restoreDefaultsBtn.disabled = areSettingsEqualToDefault();
});
}
ui.restoreDefaultsBtn.addEventListener('click', function() {
restoreOptions(DEFAULTS);
ui.status.innerText = 'Unsaved changes';
ui.restoreDefaultsBtn.disabled = true;
});
}
document.addEventListener('DOMContentLoaded', init);
function saveOptions() {
ui.submitButton.disabled = true;
ui.status.innerText = 'Saving...';
browser.storage.sync.set(getFormValues()).then(function() {
ui.submitButton.disabled = false;
ui.status.innerText = 'Saved';
}, function(error) {
ui.submitButton.disabled = false;
ui.status.innerText = "Error: ${error}";
onError(error);
});
}
function restoreOptions({whitespaceOpacity, copyableWhitespace, space, tab}) {
ui.whitespaceOpacity.value = whitespaceOpacity;
ui.copyableWhitespace.checked = copyableWhitespace;
ui.space.value = space;
ui.tab.value = tab;
ui.restoreDefaultsBtn.disabled = areSettingsEqualToDefault();
updatePreview();
}
function getFormValues() {
return {
whitespaceOpacity: +ui.whitespaceOpacity.value,
copyableWhitespace: ui.copyableWhitespace.checked,
space: ui.space.value,
tab: ui.tab.value
};
}
function updatePreview() {
ui.preview.innerText = `${ui.tab.value.padEnd(4)}${ui.space.value.repeat(3)}`;
ui.preview.style.opacity = ui.whitespaceOpacity.value;
}
function areSettingsEqualToDefault() {
const formValues = getFormValues();
return Object.keys(DEFAULTS).every(k => DEFAULTS[k] === formValues[k])
}
function onError(error) {
console.log(error);
}
const browser = typeof window.browser !== 'undefined' ? window.browser : {
storage: {
sync: {
get(...args) {
return chromeCallbackToPromise(function(...xs) {
chrome.storage.sync.get(...xs);
}, ...args);
},
set(...args) {
return chromeCallbackToPromise(function(...xs) {
chrome.storage.sync.set(...xs);
}, ...args);
}
}
}
};
function chromeCallbackToPromise(fn, ...args) {
return new Promise(function(resolve, reject) {
fn(...args, function(...callbackArgs) {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError);
} else {
resolve(...callbackArgs);
}
});
});
}