diff options
| author | Josh <[email protected]> | 2020-08-30 09:17:44 +1000 |
|---|---|---|
| committer | Rapptz <[email protected]> | 2020-12-18 21:18:56 -0500 |
| commit | c2e5b734ad60d69909d0ca4da0d01c54fa8d9faf (patch) | |
| tree | e8f7acf8765b6ef20064f370b234f0485f20c1a4 /docs/_static/settings.js | |
| parent | Reduce CSS variable usage (diff) | |
| download | discord.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.js | 106 |
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(); + } +}); |