Move Appearance tab to ts
This commit is contained in:
parent
0fd5714e21
commit
81922231ed
9 changed files with 295 additions and 180 deletions
110
src/theme.js
110
src/theme.js
|
@ -19,114 +19,8 @@ import {_t} from "./languageHandler";
|
|||
|
||||
export const DEFAULT_THEME = "light";
|
||||
import Tinter from "./Tinter";
|
||||
import dis from "./dispatcher/dispatcher";
|
||||
import SettingsStore, {SettingLevel} from "./settings/SettingsStore";
|
||||
import ThemeController from "./settings/controllers/ThemeController";
|
||||
|
||||
export class ThemeWatcher {
|
||||
static _instance = null;
|
||||
|
||||
constructor() {
|
||||
this._themeWatchRef = null;
|
||||
this._systemThemeWatchRef = null;
|
||||
this._dispatcherRef = null;
|
||||
|
||||
// we have both here as each may either match or not match, so by having both
|
||||
// we can get the tristate of dark/light/unsupported
|
||||
this._preferDark = global.matchMedia("(prefers-color-scheme: dark)");
|
||||
this._preferLight = global.matchMedia("(prefers-color-scheme: light)");
|
||||
|
||||
this._currentTheme = this.getEffectiveTheme();
|
||||
}
|
||||
|
||||
start() {
|
||||
this._themeWatchRef = SettingsStore.watchSetting("theme", null, this._onChange);
|
||||
this._systemThemeWatchRef = SettingsStore.watchSetting("use_system_theme", null, this._onChange);
|
||||
if (this._preferDark.addEventListener) {
|
||||
this._preferDark.addEventListener('change', this._onChange);
|
||||
this._preferLight.addEventListener('change', this._onChange);
|
||||
}
|
||||
this._dispatcherRef = dis.register(this._onAction);
|
||||
}
|
||||
|
||||
stop() {
|
||||
if (this._preferDark.addEventListener) {
|
||||
this._preferDark.removeEventListener('change', this._onChange);
|
||||
this._preferLight.removeEventListener('change', this._onChange);
|
||||
}
|
||||
SettingsStore.unwatchSetting(this._systemThemeWatchRef);
|
||||
SettingsStore.unwatchSetting(this._themeWatchRef);
|
||||
dis.unregister(this._dispatcherRef);
|
||||
}
|
||||
|
||||
_onChange = () => {
|
||||
this.recheck();
|
||||
};
|
||||
|
||||
_onAction = (payload) => {
|
||||
if (payload.action === 'recheck_theme') {
|
||||
// XXX forceTheme
|
||||
this.recheck(payload.forceTheme);
|
||||
}
|
||||
};
|
||||
|
||||
// XXX: forceTheme param added here as local echo appears to be unreliable
|
||||
// https://github.com/vector-im/riot-web/issues/11443
|
||||
recheck(forceTheme) {
|
||||
const oldTheme = this._currentTheme;
|
||||
this._currentTheme = forceTheme === undefined ? this.getEffectiveTheme() : forceTheme;
|
||||
if (oldTheme !== this._currentTheme) {
|
||||
setTheme(this._currentTheme);
|
||||
}
|
||||
}
|
||||
|
||||
getEffectiveTheme() {
|
||||
// Dev note: Much of this logic is replicated in the AppearanceUserSettingsTab
|
||||
|
||||
// XXX: checking the isLight flag here makes checking it in the ThemeController
|
||||
// itself completely redundant since we just override the result here and we're
|
||||
// now effectively just using the ThemeController as a place to store the static
|
||||
// variable. The system theme setting probably ought to have an equivalent
|
||||
// controller that honours the same flag, although probablt better would be to
|
||||
// have the theme logic in one place rather than split between however many
|
||||
// different places.
|
||||
if (ThemeController.isLogin) return 'light';
|
||||
|
||||
// If the user has specifically enabled the system matching option (excluding default),
|
||||
// then use that over anything else. We pick the lowest possible level for the setting
|
||||
// to ensure the ordering otherwise works.
|
||||
const systemThemeExplicit = SettingsStore.getValueAt(
|
||||
SettingLevel.DEVICE, "use_system_theme", null, false, true);
|
||||
if (systemThemeExplicit) {
|
||||
console.log("returning explicit system theme");
|
||||
if (this._preferDark.matches) return 'dark';
|
||||
if (this._preferLight.matches) return 'light';
|
||||
}
|
||||
|
||||
// If the user has specifically enabled the theme (without the system matching option being
|
||||
// enabled specifically and excluding the default), use that theme. We pick the lowest possible
|
||||
// level for the setting to ensure the ordering otherwise works.
|
||||
const themeExplicit = SettingsStore.getValueAt(
|
||||
SettingLevel.DEVICE, "theme", null, false, true);
|
||||
if (themeExplicit) {
|
||||
console.log("returning explicit theme: " + themeExplicit);
|
||||
return themeExplicit;
|
||||
}
|
||||
|
||||
// If the user hasn't really made a preference in either direction, assume the defaults of the
|
||||
// settings and use those.
|
||||
if (SettingsStore.getValue('use_system_theme')) {
|
||||
if (this._preferDark.matches) return 'dark';
|
||||
if (this._preferLight.matches) return 'light';
|
||||
}
|
||||
console.log("returning theme value");
|
||||
return SettingsStore.getValue('theme');
|
||||
}
|
||||
|
||||
isSystemThemeSupported() {
|
||||
return this._preferDark.matches || this._preferLight.matches;
|
||||
}
|
||||
}
|
||||
import SettingsStore from "./settings/SettingsStore";
|
||||
import ThemeWatcher from "./settings/watchers/ThemeWatcher";
|
||||
|
||||
export function enumerateThemes() {
|
||||
const BUILTIN_THEMES = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue