Files
Signal-Desktop/ts/context/NativeThemeListener.ts
2021-06-30 11:57:43 -07:00

49 lines
1.3 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-restricted-syntax */
import { NativeThemeState } from '../types/NativeThemeNotifier.d';
export type Callback = (change: NativeThemeState) => void;
export interface MinimalIPC {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
sendSync(channel: string): any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
on(channel: string, listener: (event: unknown, ...args: any[]) => void): this;
}
export type SystemThemeHolder = { systemTheme: 'dark' | 'light' };
export class NativeThemeListener {
private readonly subscribers = new Array<Callback>();
public theme: NativeThemeState;
constructor(ipc: MinimalIPC, private readonly holder: SystemThemeHolder) {
this.theme = ipc.sendSync('native-theme:init');
this.update();
ipc.on(
'native-theme:changed',
(_event: unknown, change: NativeThemeState) => {
this.theme = change;
this.update();
for (const fn of this.subscribers) {
fn(change);
}
}
);
}
public subscribe(fn: Callback): void {
this.subscribers.push(fn);
}
private update(): void {
this.holder.systemTheme = this.theme.shouldUseDarkColors ? 'dark' : 'light';
}
}