49 lines
1.3 KiB
TypeScript
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';
|
|
}
|
|
}
|