aboutsummaryrefslogtreecommitdiff
path: root/docs/_static/settings.js
diff options
context:
space:
mode:
authorJosh <[email protected]>2020-08-30 09:17:44 +1000
committerRapptz <[email protected]>2020-12-18 21:18:56 -0500
commitc2e5b734ad60d69909d0ca4da0d01c54fa8d9faf (patch)
treee8f7acf8765b6ef20064f370b234f0485f20c1a4 /docs/_static/settings.js
parentReduce CSS variable usage (diff)
downloaddiscord.py-c2e5b734ad60d69909d0ca4da0d01c54fa8d9faf.tar.xz
discord.py-c2e5b734ad60d69909d0ca4da0d01c54fa8d9faf.zip
[matrix] Refactor JS & add searchbar to mobile.
Diffstat (limited to 'docs/_static/settings.js')
-rw-r--r--docs/_static/settings.js106
1 files changed, 106 insertions, 0 deletions
diff --git a/docs/_static/settings.js b/docs/_static/settings.js
new file mode 100644
index 00000000..0573f856
--- /dev/null
+++ b/docs/_static/settings.js
@@ -0,0 +1,106 @@
+'use-strict';
+
+let settingsModal;
+
+class Setting {
+ constructor(name, defaultValue, setter) {
+ this.name = name;
+ this.defaultValue = defaultValue;
+ this.setValue = setter;
+ }
+
+ setElement() {
+ throw new TypeError('Abstract methods should be implemented.');
+ }
+
+ load() {
+ let value = JSON.parse(localStorage.getItem(this.name));
+ this.value = value === null ? this.defaultValue : value;
+ try {
+ this.setValue(value);
+ } catch (error) {
+ console.error(`Failed to apply setting "${this.name}" With value:`, this.value);
+ console.error(error);
+ }
+ }
+
+ update() {
+ throw new TypeError('Abstract methods should be implemented.');
+ }
+
+}
+
+class CheckboxSetting extends Setting {
+
+ setElement() {
+ let element = document.querySelector(`input[name=${this.name}]`);
+ element.checked = this.value;
+ }
+
+ update(element) {
+ localStorage.setItem(this.name, element.checked);
+ this.setValue(element.checked);
+ }
+
+}
+
+class RadioSetting extends Setting {
+
+ setElement() {
+ let element = document.querySelector(`input[name=${this.name}][value=${this.value}]`);
+ element.checked = true;
+ }
+
+ update(element) {
+ localStorage.setItem(this.name, `"${element.value}"`);
+ this.setValue(element.value);
+ }
+
+}
+
+function getRootAttributeToggle(attributeName, valueName) {
+ function toggleRootAttribute(set) {
+ if (set) {
+ document.documentElement.setAttribute(`data-${attributeName}`, valueName);
+ } else {
+ document.documentElement.removeAttribute(`data-${attributeName}`);
+ }
+ }
+ return toggleRootAttribute;
+}
+
+function setTheme(value) {
+ if (value === 'automatic') {
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ document.documentElement.setAttribute('data-theme', 'dark');
+ } else {
+ document.documentElement.setAttribute('data-theme', 'light');
+ }
+ }
+ else {
+ document.documentElement.setAttribute('data-theme', value);
+ }
+}
+
+const settings = [
+ new CheckboxSetting('useSerifFont', false, getRootAttributeToggle('font', 'serif')),
+ new RadioSetting('setTheme', 'automatic', setTheme)
+]
+
+function updateSetting(element) {
+ let setting = settings.find((s) => s.name == element.name);
+ if (setting) {
+ setting.update(element);
+ }
+}
+
+for (const setting of settings) {
+ setting.load();
+}
+
+document.addEventListener('DOMContentLoaded', () => {
+ settingsModal = new Modal(document.querySelector('div#settings.modal'));
+ for (const setting of settings) {
+ setting.setElement();
+ }
+});