refactor: extract global shortcuts runtime wiring

This commit is contained in:
2026-02-20 03:18:22 -08:00
parent 2ffd503898
commit 2d89dd43f2
5 changed files with 136 additions and 49 deletions

View File

@@ -0,0 +1,57 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import type { ConfiguredShortcuts } from '../../core/utils/shortcut-config';
import { createGlobalShortcutsRuntimeHandlers } from './global-shortcuts-runtime-handlers';
function createShortcuts(): ConfiguredShortcuts {
return {
toggleVisibleOverlayGlobal: 'CommandOrControl+Shift+O',
toggleInvisibleOverlayGlobal: 'CommandOrControl+Shift+I',
copySubtitle: 's',
copySubtitleMultiple: 'CommandOrControl+s',
updateLastCardFromClipboard: 'c',
triggerFieldGrouping: null,
triggerSubsync: null,
mineSentence: 'q',
mineSentenceMultiple: 'w',
multiCopyTimeoutMs: 5000,
toggleSecondarySub: null,
markAudioCard: null,
openRuntimeOptions: null,
openJimaku: null,
};
}
test('global shortcuts runtime handlers compose get/register/refresh flow', () => {
const calls: string[] = [];
const shortcuts = createShortcuts();
const runtime = createGlobalShortcutsRuntimeHandlers({
getConfiguredShortcutsMainDeps: {
getResolvedConfig: () => ({}) as never,
defaultConfig: {} as never,
resolveConfiguredShortcuts: () => shortcuts,
},
buildRegisterGlobalShortcutsMainDeps: (getConfiguredShortcuts) => ({
getConfiguredShortcuts,
registerGlobalShortcutsCore: (options) => {
calls.push('register');
assert.equal(options.shortcuts, shortcuts);
},
toggleVisibleOverlay: () => calls.push('toggle-visible'),
toggleInvisibleOverlay: () => calls.push('toggle-invisible'),
openYomitanSettings: () => calls.push('open-yomitan'),
isDev: false,
getMainWindow: () => null,
}),
buildRefreshGlobalAndOverlayShortcutsMainDeps: (registerGlobalShortcuts) => ({
unregisterAllGlobalShortcuts: () => calls.push('unregister'),
registerGlobalShortcuts: () => registerGlobalShortcuts(),
syncOverlayShortcuts: () => calls.push('sync-overlay'),
}),
});
assert.equal(runtime.getConfiguredShortcuts(), shortcuts);
runtime.registerGlobalShortcuts();
runtime.refreshGlobalAndOverlayShortcuts();
assert.deepEqual(calls, ['register', 'unregister', 'register', 'sync-overlay']);
});

View File

@@ -0,0 +1,60 @@
import type { ConfiguredShortcuts } from '../../core/utils/shortcut-config';
import {
createGetConfiguredShortcutsHandler,
createRefreshGlobalAndOverlayShortcutsHandler,
createRegisterGlobalShortcutsHandler,
} from './global-shortcuts';
import {
createBuildGetConfiguredShortcutsMainDepsHandler,
createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler,
createBuildRegisterGlobalShortcutsMainDepsHandler,
} from './global-shortcuts-main-deps';
type GetConfiguredShortcutsMainDeps = Parameters<
typeof createBuildGetConfiguredShortcutsMainDepsHandler
>[0];
type RegisterGlobalShortcutsMainDeps = Parameters<
typeof createBuildRegisterGlobalShortcutsMainDepsHandler
>[0];
type RefreshGlobalAndOverlayShortcutsMainDeps = Parameters<
typeof createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler
>[0];
export function createGlobalShortcutsRuntimeHandlers(deps: {
getConfiguredShortcutsMainDeps: GetConfiguredShortcutsMainDeps;
buildRegisterGlobalShortcutsMainDeps: (
getConfiguredShortcuts: () => ConfiguredShortcuts,
) => RegisterGlobalShortcutsMainDeps;
buildRefreshGlobalAndOverlayShortcutsMainDeps: (
registerGlobalShortcuts: () => void,
) => RefreshGlobalAndOverlayShortcutsMainDeps;
}) {
const getConfiguredShortcutsMainDeps = createBuildGetConfiguredShortcutsMainDepsHandler(
deps.getConfiguredShortcutsMainDeps,
)();
const getConfiguredShortcutsHandler =
createGetConfiguredShortcutsHandler(getConfiguredShortcutsMainDeps);
const getConfiguredShortcuts = () => getConfiguredShortcutsHandler();
const registerGlobalShortcutsMainDeps = createBuildRegisterGlobalShortcutsMainDepsHandler(
deps.buildRegisterGlobalShortcutsMainDeps(getConfiguredShortcuts),
)();
const registerGlobalShortcutsHandler =
createRegisterGlobalShortcutsHandler(registerGlobalShortcutsMainDeps);
const registerGlobalShortcuts = () => registerGlobalShortcutsHandler();
const refreshGlobalAndOverlayShortcutsMainDeps =
createBuildRefreshGlobalAndOverlayShortcutsMainDepsHandler(
deps.buildRefreshGlobalAndOverlayShortcutsMainDeps(registerGlobalShortcuts),
)();
const refreshGlobalAndOverlayShortcutsHandler = createRefreshGlobalAndOverlayShortcutsHandler(
refreshGlobalAndOverlayShortcutsMainDeps,
);
const refreshGlobalAndOverlayShortcuts = () => refreshGlobalAndOverlayShortcutsHandler();
return {
getConfiguredShortcuts,
registerGlobalShortcuts,
refreshGlobalAndOverlayShortcuts,
};
}