|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS101: Remove unnecessary use of Array.from
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS103: Rewrite code to no longer use __guard__, or convert again using --optional-chaining
|
|
|
|
* DS104: Avoid inline assignments
|
|
|
|
* DS206: Consider reworking classes to avoid initClass
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/main/docs/suggestions.md
|
|
|
|
*/
|
|
|
|
(function() {
|
|
|
|
let PREFERENCE_KEYS = undefined;
|
|
|
|
let INTERNAL_KEYS = undefined;
|
|
|
|
const Cls = (app.Settings = class Settings {
|
|
|
|
static initClass() {
|
|
|
|
PREFERENCE_KEYS = [
|
|
|
|
'hideDisabled',
|
|
|
|
'hideIntro',
|
|
|
|
'manualUpdate',
|
|
|
|
'fastScroll',
|
|
|
|
'arrowScroll',
|
|
|
|
'analyticsConsent',
|
|
|
|
'docs',
|
|
|
|
'dark', // legacy
|
|
|
|
'theme',
|
|
|
|
'layout',
|
|
|
|
'size',
|
|
|
|
'tips',
|
|
|
|
'noAutofocus',
|
|
|
|
'autoInstall',
|
|
|
|
'spaceScroll',
|
|
|
|
'spaceTimeout'
|
|
|
|
];
|
|
|
|
|
|
|
|
INTERNAL_KEYS = [
|
|
|
|
'count',
|
|
|
|
'schema',
|
|
|
|
'version',
|
|
|
|
'news'
|
|
|
|
];
|
|
|
|
|
|
|
|
this.prototype.LAYOUTS = [
|
|
|
|
'_max-width',
|
|
|
|
'_sidebar-hidden',
|
|
|
|
'_native-scrollbars',
|
|
|
|
'_text-justify-hyphenate'
|
|
|
|
];
|
|
|
|
|
|
|
|
this.defaults = {
|
|
|
|
count: 0,
|
|
|
|
hideDisabled: false,
|
|
|
|
hideIntro: false,
|
|
|
|
news: 0,
|
|
|
|
manualUpdate: false,
|
|
|
|
schema: 1,
|
|
|
|
analyticsConsent: false,
|
|
|
|
theme: 'auto',
|
|
|
|
spaceScroll: 1,
|
|
|
|
spaceTimeout: 0.5
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this.store = new CookiesStore;
|
|
|
|
this.cache = {};
|
|
|
|
this.autoSupported = window.matchMedia('(prefers-color-scheme)').media !== 'not all';
|
|
|
|
if (this.autoSupported) {
|
|
|
|
this.darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
|
|
this.darkModeQuery.addListener(() => this.setTheme(this.get('theme')));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
get(key) {
|
|
|
|
let left;
|
|
|
|
if (this.cache.hasOwnProperty(key)) { return this.cache[key]; }
|
|
|
|
this.cache[key] = (left = this.store.get(key)) != null ? left : this.constructor.defaults[key];
|
|
|
|
if ((key === 'theme') && (this.cache[key] === 'auto') && !this.darkModeQuery) {
|
|
|
|
return this.cache[key] = 'default';
|
|
|
|
} else {
|
|
|
|
return this.cache[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
set(key, value) {
|
|
|
|
this.store.set(key, value);
|
|
|
|
delete this.cache[key];
|
|
|
|
if (key === 'theme') { this.setTheme(value); }
|
|
|
|
}
|
|
|
|
|
|
|
|
del(key) {
|
|
|
|
this.store.del(key);
|
|
|
|
delete this.cache[key];
|
|
|
|
}
|
|
|
|
|
|
|
|
hasDocs() {
|
|
|
|
try { return !!this.store.get('docs'); } catch (error) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
getDocs() {
|
|
|
|
return __guard__(this.store.get('docs'), x => x.split('/')) || app.config.default_docs;
|
|
|
|
}
|
|
|
|
|
|
|
|
setDocs(docs) {
|
|
|
|
this.set('docs', docs.join('/'));
|
|
|
|
}
|
|
|
|
|
|
|
|
getTips() {
|
|
|
|
return __guard__(this.store.get('tips'), x => x.split('/')) || [];
|
|
|
|
}
|
|
|
|
|
|
|
|
setTips(tips) {
|
|
|
|
this.set('tips', tips.join('/'));
|
|
|
|
}
|
|
|
|
|
|
|
|
setLayout(name, enable) {
|
|
|
|
this.toggleLayout(name, enable);
|
|
|
|
|
|
|
|
const layout = (this.store.get('layout') || '').split(' ');
|
|
|
|
$.arrayDelete(layout, '');
|
|
|
|
|
|
|
|
if (enable) {
|
|
|
|
if (layout.indexOf(name) === -1) { layout.push(name); }
|
|
|
|
} else {
|
|
|
|
$.arrayDelete(layout, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (layout.length > 0) {
|
|
|
|
this.set('layout', layout.join(' '));
|
|
|
|
} else {
|
|
|
|
this.del('layout');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
hasLayout(name) {
|
|
|
|
const layout = (this.store.get('layout') || '').split(' ');
|
|
|
|
return layout.indexOf(name) !== -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
setSize(value) {
|
|
|
|
this.set('size', value);
|
|
|
|
}
|
|
|
|
|
|
|
|
dump() {
|
|
|
|
return this.store.dump();
|
|
|
|
}
|
|
|
|
|
|
|
|
export() {
|
|
|
|
const data = this.dump();
|
|
|
|
for (var key of Array.from(INTERNAL_KEYS)) { delete data[key]; }
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
import(data) {
|
|
|
|
let key, value;
|
|
|
|
const object = this.export();
|
|
|
|
for (key in object) {
|
|
|
|
value = object[key];
|
|
|
|
if (!data.hasOwnProperty(key)) { this.del(key); }
|
|
|
|
}
|
|
|
|
for (key in data) {
|
|
|
|
value = data[key];
|
|
|
|
if (PREFERENCE_KEYS.indexOf(key) !== -1) { this.set(key, value); }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
reset() {
|
|
|
|
this.store.reset();
|
|
|
|
this.cache = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
initLayout() {
|
|
|
|
if (this.get('dark') === 1) {
|
|
|
|
this.set('theme', 'dark');
|
|
|
|
this.del('dark');
|
|
|
|
}
|
|
|
|
this.setTheme(this.get('theme'));
|
|
|
|
for (var layout of Array.from(this.LAYOUTS)) { this.toggleLayout(layout, this.hasLayout(layout)); }
|
|
|
|
this.initSidebarWidth();
|
|
|
|
}
|
|
|
|
|
|
|
|
setTheme(theme) {
|
|
|
|
if (theme === 'auto') {
|
|
|
|
theme = this.darkModeQuery.matches ? 'dark' : 'default';
|
|
|
|
}
|
|
|
|
const {
|
|
|
|
classList
|
|
|
|
} = document.documentElement;
|
|
|
|
classList.remove('_theme-default', '_theme-dark');
|
|
|
|
classList.add('_theme-' + theme);
|
|
|
|
this.updateColorMeta();
|
|
|
|
}
|
|
|
|
|
|
|
|
updateColorMeta() {
|
|
|
|
const color = getComputedStyle(document.documentElement).getPropertyValue('--headerBackground').trim();
|
|
|
|
$('meta[name=theme-color]').setAttribute('content', color);
|
|
|
|
}
|
|
|
|
|
|
|
|
toggleLayout(layout, enable) {
|
|
|
|
const {
|
|
|
|
classList
|
|
|
|
} = document.body;
|
|
|
|
// sidebar is always shown for settings; its state is updated in app.views.Settings
|
|
|
|
if ((layout !== '_sidebar-hidden') || !(app.router != null ? app.router.isSettings : undefined)) { classList.toggle(layout, enable); }
|
|
|
|
classList.toggle('_overlay-scrollbars', $.overlayScrollbarsEnabled());
|
|
|
|
}
|
|
|
|
|
|
|
|
initSidebarWidth() {
|
|
|
|
const size = this.get('size');
|
|
|
|
if (size) { document.documentElement.style.setProperty('--sidebarWidth', size + 'px'); }
|
|
|
|
}
|
|
|
|
});
|
|
|
|
Cls.initClass();
|
|
|
|
return Cls;
|
|
|
|
})();
|
|
|
|
|
|
|
|
function __guard__(value, transform) {
|
|
|
|
return (typeof value !== 'undefined' && value !== null) ? transform(value) : undefined;
|
|
|
|
}
|