mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-03-06 19:57:26 -08:00
74 lines
2.7 KiB
TypeScript
74 lines
2.7 KiB
TypeScript
import type { ConfigHotReloadDiff } from '../../core/services/config-hot-reload';
|
|
import { resolveKeybindings } from '../../core/utils/keybindings';
|
|
import { DEFAULT_KEYBINDINGS } from '../../config';
|
|
import type { ConfigHotReloadPayload, ResolvedConfig, SecondarySubMode } from '../../types';
|
|
|
|
type ConfigHotReloadAppliedDeps = {
|
|
setKeybindings: (keybindings: ConfigHotReloadPayload['keybindings']) => void;
|
|
refreshGlobalAndOverlayShortcuts: () => void;
|
|
setSecondarySubMode: (mode: SecondarySubMode) => void;
|
|
broadcastToOverlayWindows: (channel: string, payload: unknown) => void;
|
|
applyAnkiRuntimeConfigPatch: (patch: { ai: ResolvedConfig['ankiConnect']['ai'] }) => void;
|
|
};
|
|
|
|
type ConfigHotReloadMessageDeps = {
|
|
showMpvOsd: (message: string) => void;
|
|
showDesktopNotification: (title: string, options: { body: string }) => void;
|
|
};
|
|
|
|
export function resolveSubtitleStyleForRenderer(config: ResolvedConfig) {
|
|
if (!config.subtitleStyle) {
|
|
return null;
|
|
}
|
|
return {
|
|
...config.subtitleStyle,
|
|
nPlusOneColor: config.ankiConnect.nPlusOne.nPlusOne,
|
|
knownWordColor: config.ankiConnect.nPlusOne.knownWord,
|
|
enableJlpt: config.subtitleStyle.enableJlpt,
|
|
frequencyDictionary: config.subtitleStyle.frequencyDictionary,
|
|
};
|
|
}
|
|
|
|
export function buildConfigHotReloadPayload(config: ResolvedConfig): ConfigHotReloadPayload {
|
|
return {
|
|
keybindings: resolveKeybindings(config, DEFAULT_KEYBINDINGS),
|
|
subtitleStyle: resolveSubtitleStyleForRenderer(config),
|
|
secondarySubMode: config.secondarySub.defaultMode,
|
|
};
|
|
}
|
|
|
|
export function createConfigHotReloadAppliedHandler(deps: ConfigHotReloadAppliedDeps) {
|
|
return (diff: ConfigHotReloadDiff, config: ResolvedConfig): void => {
|
|
const payload = buildConfigHotReloadPayload(config);
|
|
deps.setKeybindings(payload.keybindings);
|
|
|
|
if (diff.hotReloadFields.includes('shortcuts')) {
|
|
deps.refreshGlobalAndOverlayShortcuts();
|
|
}
|
|
|
|
if (diff.hotReloadFields.includes('secondarySub.defaultMode')) {
|
|
deps.setSecondarySubMode(payload.secondarySubMode);
|
|
deps.broadcastToOverlayWindows('secondary-subtitle:mode', payload.secondarySubMode);
|
|
}
|
|
|
|
if (diff.hotReloadFields.includes('ankiConnect.ai')) {
|
|
deps.applyAnkiRuntimeConfigPatch({ ai: config.ankiConnect.ai });
|
|
}
|
|
|
|
if (diff.hotReloadFields.length > 0) {
|
|
deps.broadcastToOverlayWindows('config:hot-reload', payload);
|
|
}
|
|
};
|
|
}
|
|
|
|
export function createConfigHotReloadMessageHandler(deps: ConfigHotReloadMessageDeps) {
|
|
return (message: string): void => {
|
|
deps.showMpvOsd(message);
|
|
deps.showDesktopNotification('SubMiner', { body: message });
|
|
};
|
|
}
|
|
|
|
export function buildRestartRequiredConfigMessage(fields: string[]): string {
|
|
return `Config updated; restart required for: ${fields.join(', ')}`;
|
|
}
|