Path: blob/master/src/packages/frontend/account/dark-mode.ts
5857 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { isEqual, debounce } from "lodash";67import { DARK_MODE_DEFAULTS } from "@cocalc/util/db-schema/accounts";8import { AccountStore } from "./store";910export const DARK_MODE_KEYS = ["brightness", "contrast", "sepia"] as const;1112type Config = Record<(typeof DARK_MODE_KEYS)[number], number>;1314export const DARK_MODE_MINS: Config = {15brightness: 30,16contrast: 30,17sepia: 0,18} as const;1920// Returns number between 0 and 100.21function to_number(x: any, default_value: number): number {22if (x == null) return default_value;23try {24x = parseInt(x);25if (isNaN(x)) {26return default_value;27}28if (x < 0) {29x = 0;30}31if (x > 100) {32x = 100;33}34return x;35} catch (_) {36return default_value;37}38}3940export function get_dark_mode_config(other_settings?: {41dark_mode_brightness?: number;42dark_mode_contrast?: number;43dark_mode_sepia?: number;44}): Config {45const config = {} as Config;4647for (const key of DARK_MODE_KEYS) {48config[key] = Math.max(49DARK_MODE_MINS[key],50to_number(other_settings?.[`dark_mode_${key}`], DARK_MODE_DEFAULTS[key]),51);52}5354return config;55}5657let currentDarkMode: boolean = false;58let last_dark_mode: boolean = false;59let last_config: Config | undefined = undefined;6061export function init_dark_mode(account_store: AccountStore): void {62account_store.on(63"change",64debounce(65async () => {66const dark_mode = !!account_store.getIn([67"other_settings",68"dark_mode",69]);70currentDarkMode = dark_mode;71const config = get_dark_mode_config(72account_store.get("other_settings")?.toJS(),73);74if (75dark_mode == last_dark_mode &&76(!dark_mode || isEqual(last_config, config))77) {78return;79}80const { enable, disable } = await import("darkreader");81last_dark_mode = dark_mode;82last_config = config;83if (dark_mode) {84disable();85enable(config);86} else {87disable();88}89},901000,91{ trailing: true, leading: false },92),93);94}9596export function inDarkMode() {97return currentDarkMode;98}99100101