Change ephemeral settings to only persist in ephemeralConfig

This commit is contained in:
ayumi-signal 2024-03-07 09:36:08 -08:00 committed by GitHub
parent 07e2fb7f60
commit 73e8bec42f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 295 additions and 265 deletions

View file

@ -14,6 +14,7 @@ import type {
IPCEventsValuesType,
IPCEventsCallbacksType,
} from '../util/createIPCEvents';
import type { EphemeralSettings, SettingsValuesType } from '../util/preload';
const EPHEMERAL_NAME_MAP = new Map([
['spellCheck', 'spell-check'],
@ -27,6 +28,9 @@ type ResponseQueueEntry = Readonly<{
reject(error: Error): void;
}>;
type SettingChangeEventType<Key extends keyof SettingsValuesType> =
`change:${Key}`;
export class SettingsChannel extends EventEmitter {
private mainWindow?: BrowserWindow;
@ -70,17 +74,7 @@ export class SettingsChannel extends EventEmitter {
this.installSetting('readReceiptSetting', { setter: false });
this.installSetting('typingIndicatorSetting', { setter: false });
this.installSetting('themeSetting', {
isEphemeral: true,
});
this.installSetting('hideMenuBar');
this.installSetting('systemTraySetting', {
isEphemeral: true,
});
this.installSetting('localeOverride', {
isEphemeral: true,
});
this.installSetting('notificationSetting');
this.installSetting('notificationDrawAttention');
this.installSetting('audioMessage');
@ -88,9 +82,6 @@ export class SettingsChannel extends EventEmitter {
this.installSetting('countMutedConversations');
this.installSetting('sentMediaQualitySetting');
this.installSetting('spellCheck', {
isEphemeral: true,
});
this.installSetting('textFormatting');
this.installSetting('autoConvertEmoji');
@ -116,6 +107,11 @@ export class SettingsChannel extends EventEmitter {
this.installSetting('phoneNumberDiscoverabilitySetting');
this.installSetting('phoneNumberSharingSetting');
this.installEphemeralSetting('themeSetting');
this.installEphemeralSetting('systemTraySetting');
this.installEphemeralSetting('localeOverride');
this.installEphemeralSetting('spellCheck');
installPermissionsHandler({ session: session.defaultSession, userConfig });
// These ones are different because its single source of truth is userConfig,
@ -234,8 +230,7 @@ export class SettingsChannel extends EventEmitter {
{
getter = true,
setter = true,
isEphemeral = false,
}: { getter?: boolean; setter?: boolean; isEphemeral?: boolean } = {}
}: { getter?: boolean; setter?: boolean } = {}
): void {
if (getter) {
ipc.handle(`settings:get:${name}`, async () => {
@ -248,18 +243,89 @@ export class SettingsChannel extends EventEmitter {
}
ipc.handle(`settings:set:${name}`, async (_event, value) => {
if (isEphemeral) {
const ephemeralName = EPHEMERAL_NAME_MAP.get(name);
strictAssert(
ephemeralName !== undefined,
`${name} is not an ephemeral setting`
);
ephemeralConfig.set(ephemeralName, value);
}
await this.setSettingInMainWindow(name, value);
this.emit(`change:${name}`, value);
});
}
private installEphemeralSetting<Name extends keyof EphemeralSettings>(
name: Name
): void {
ipc.handle(`settings:get:${name}`, async () => {
const ephemeralName = EPHEMERAL_NAME_MAP.get(name);
strictAssert(
ephemeralName !== undefined,
`${name} is not an ephemeral setting`
);
return ephemeralConfig.get(ephemeralName);
});
ipc.handle(`settings:set:${name}`, async (_event, value) => {
const ephemeralName = EPHEMERAL_NAME_MAP.get(name);
strictAssert(
ephemeralName !== undefined,
`${name} is not an ephemeral setting`
);
ephemeralConfig.set(ephemeralName, value);
this.emit(`change:${name}`, value);
// Notify main to notify windows of preferences change. As for DB-backed
// settings, those are set by the renderer, and afterwards the renderer IPC sends
// to main the event 'preferences-changed'.
this.emit('ephemeral-setting-changed');
const { mainWindow } = this;
if (!mainWindow || !mainWindow.webContents) {
return;
}
mainWindow.webContents.send(`settings:update:${name}`, value);
});
}
// EventEmitter types
public override on(
type: 'change:systemTraySetting',
callback: (value: string) => void
): this;
public override on(
type: 'ephemeral-setting-changed',
callback: () => void
): this;
public override on(
type: SettingChangeEventType<keyof SettingsValuesType>,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
callback: (...args: Array<any>) => void
): this;
public override on(
type: string | symbol,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
listener: (...args: Array<any>) => void
): this {
return super.on(type, listener);
}
public override emit(
type: 'change:systemTraySetting',
value: string
): boolean;
public override emit(type: 'ephemeral-setting-changed'): boolean;
public override emit(
type: SettingChangeEventType<keyof SettingsValuesType>,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
...args: Array<any>
): boolean;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
public override emit(type: string | symbol, ...args: Array<any>): boolean {
return super.emit(type, ...args);
}
}