From 9c4a9769a50d1886a8521150919529932370ef78 Mon Sep 17 00:00:00 2001 From: sudacode Date: Mon, 9 Feb 2026 23:09:59 -0800 Subject: [PATCH] refactor: extract overlay shortcut lifecycle runtime --- .../overlay-shortcut-lifecycle-service.ts | 52 +++++++++++++++++++ src/main.ts | 49 +++++++++++------ 2 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 src/core/services/overlay-shortcut-lifecycle-service.ts diff --git a/src/core/services/overlay-shortcut-lifecycle-service.ts b/src/core/services/overlay-shortcut-lifecycle-service.ts new file mode 100644 index 0000000..2ce0514 --- /dev/null +++ b/src/core/services/overlay-shortcut-lifecycle-service.ts @@ -0,0 +1,52 @@ +import { OverlayShortcutHandlers, registerOverlayShortcutsService, unregisterOverlayShortcutsService } from "./overlay-shortcut-service"; +import { ConfiguredShortcuts } from "../utils/shortcut-config"; + +export interface OverlayShortcutLifecycleDeps { + getConfiguredShortcuts: () => ConfiguredShortcuts; + getOverlayHandlers: () => OverlayShortcutHandlers; + cancelPendingMultiCopy: () => void; + cancelPendingMineSentenceMultiple: () => void; +} + +export function registerOverlayShortcutsRuntimeService( + deps: OverlayShortcutLifecycleDeps, +): boolean { + return registerOverlayShortcutsService( + deps.getConfiguredShortcuts(), + deps.getOverlayHandlers(), + ); +} + +export function unregisterOverlayShortcutsRuntimeService( + shortcutsRegistered: boolean, + deps: OverlayShortcutLifecycleDeps, +): boolean { + if (!shortcutsRegistered) return shortcutsRegistered; + deps.cancelPendingMultiCopy(); + deps.cancelPendingMineSentenceMultiple(); + unregisterOverlayShortcutsService(deps.getConfiguredShortcuts()); + return false; +} + +export function syncOverlayShortcutsRuntimeService( + shouldBeActive: boolean, + shortcutsRegistered: boolean, + deps: OverlayShortcutLifecycleDeps, +): boolean { + if (shouldBeActive) { + return registerOverlayShortcutsRuntimeService(deps); + } + return unregisterOverlayShortcutsRuntimeService(shortcutsRegistered, deps); +} + +export function refreshOverlayShortcutsRuntimeService( + shouldBeActive: boolean, + shortcutsRegistered: boolean, + deps: OverlayShortcutLifecycleDeps, +): boolean { + const cleared = unregisterOverlayShortcutsRuntimeService( + shortcutsRegistered, + deps, + ); + return syncOverlayShortcutsRuntimeService(shouldBeActive, cleared, deps); +} diff --git a/src/main.ts b/src/main.ts index 3413084..8832b42 100644 --- a/src/main.ts +++ b/src/main.ts @@ -111,13 +111,17 @@ import { } from "./core/services/shortcut-fallback-service"; import { registerOverlayShortcutsService, - unregisterOverlayShortcutsService, } from "./core/services/overlay-shortcut-service"; import { runOverlayShortcutLocalFallback } from "./core/services/overlay-shortcut-fallback-runner"; import { createOverlayShortcutRuntimeHandlers } from "./core/services/overlay-shortcut-runtime-service"; import { createNumericShortcutSessionService } from "./core/services/numeric-shortcut-session-service"; import { handleCliCommandService } from "./core/services/cli-command-service"; import { cycleSecondarySubModeService } from "./core/services/secondary-subtitle-service"; +import { + refreshOverlayShortcutsRuntimeService, + syncOverlayShortcutsRuntimeService, + unregisterOverlayShortcutsRuntimeService, +} from "./core/services/overlay-shortcut-lifecycle-service"; import { copyCurrentSubtitleService, handleMineSentenceDigitService, @@ -986,28 +990,43 @@ function handleMineSentenceDigit(count: number): void { } function registerOverlayShortcuts(): void { - const shortcuts = getConfiguredShortcuts(); - const handlers = getOverlayShortcutRuntimeHandlers(); shortcutsRegistered = registerOverlayShortcutsService( - shortcuts, - handlers.overlayHandlers, + getConfiguredShortcuts(), + getOverlayShortcutRuntimeHandlers().overlayHandlers, ); } +function getOverlayShortcutLifecycleDeps() { + return { + getConfiguredShortcuts: () => getConfiguredShortcuts(), + getOverlayHandlers: () => getOverlayShortcutRuntimeHandlers().overlayHandlers, + cancelPendingMultiCopy: () => cancelPendingMultiCopy(), + cancelPendingMineSentenceMultiple: () => cancelPendingMineSentenceMultiple(), + }; +} + function unregisterOverlayShortcuts(): void { - if (!shortcutsRegistered) return; - - cancelPendingMultiCopy(); - cancelPendingMineSentenceMultiple(); - - unregisterOverlayShortcutsService(getConfiguredShortcuts()); - - shortcutsRegistered = false; + shortcutsRegistered = unregisterOverlayShortcutsRuntimeService( + shortcutsRegistered, + getOverlayShortcutLifecycleDeps(), + ); } function shouldOverlayShortcutsBeActive(): boolean { return overlayRuntimeInitialized; } -function syncOverlayShortcuts(): void { if (shouldOverlayShortcutsBeActive()) { registerOverlayShortcuts(); } else { unregisterOverlayShortcuts(); } } -function refreshOverlayShortcuts(): void { unregisterOverlayShortcuts(); syncOverlayShortcuts(); } +function syncOverlayShortcuts(): void { + shortcutsRegistered = syncOverlayShortcutsRuntimeService( + shouldOverlayShortcutsBeActive(), + shortcutsRegistered, + getOverlayShortcutLifecycleDeps(), + ); +} +function refreshOverlayShortcuts(): void { + shortcutsRegistered = refreshOverlayShortcutsRuntimeService( + shouldOverlayShortcutsBeActive(), + shortcutsRegistered, + getOverlayShortcutLifecycleDeps(), + ); +} function updateVisibleOverlayVisibility(): void { updateVisibleOverlayVisibilityService({