blob: 7d86153812b1081ee2243a2dd9862c02efa0c4f9 [file]
import type { AppSettings } from '@maka/core';
import type { SettingsStore } from '@maka/storage';
export interface ClientSettingsEffects {
apply(settings: AppSettings, notifyRenderer: boolean): Promise<boolean>;
refresh(notifyRenderer: boolean): Promise<boolean>;
}
interface ClientSettingsEffectDependencies {
readonly settingsStore: Pick<SettingsStore, 'get'>;
readonly applyKeepSystemAwake: (enabled: boolean) => Promise<void>;
readonly applyBotSettings: (settings: AppSettings['botChat']) => Promise<void>;
readonly emitExternalChanged: () => void;
}
export function createClientSettingsEffects(
dependencies: ClientSettingsEffectDependencies,
): ClientSettingsEffects {
let rendererFingerprint: string | undefined;
let botFingerprint: string | undefined;
let keepSystemAwake: boolean | undefined;
let tail = Promise.resolve();
const schedule = (
load: () => AppSettings | Promise<AppSettings>,
notifyRenderer: boolean,
): Promise<boolean> => {
const run = tail.then(async () => {
const settings = await load();
const nextRendererFingerprint = JSON.stringify(settings);
const nextBotFingerprint = JSON.stringify(settings.botChat);
const rendererChanged = nextRendererFingerprint !== rendererFingerprint;
const keepAwakeChanged = settings.system.keepSystemAwake !== keepSystemAwake;
const botChanged = nextBotFingerprint !== botFingerprint;
if (keepAwakeChanged) {
await dependencies.applyKeepSystemAwake(settings.system.keepSystemAwake);
keepSystemAwake = settings.system.keepSystemAwake;
}
if (botChanged) {
await dependencies.applyBotSettings(settings.botChat);
botFingerprint = nextBotFingerprint;
}
rendererFingerprint = nextRendererFingerprint;
if (notifyRenderer && rendererChanged) dependencies.emitExternalChanged();
return rendererChanged || keepAwakeChanged || botChanged;
});
tail = run.then(
() => undefined,
() => undefined,
);
return run;
};
return {
apply: (settings, notifyRenderer) => schedule(() => settings, notifyRenderer),
refresh: (notifyRenderer) => schedule(() => dependencies.settingsStore.get(), notifyRenderer),
};
}