From 988905478d9ea1b08f8268608262d056c6b78f55 Mon Sep 17 00:00:00 2001 From: 4gray Date: Fri, 22 May 2026 03:08:44 +0300 Subject: [PATCH] refactor(workspace): use runtime shortcuts capability --- ...rkspace-keyboard-shortcuts.service.spec.ts | 28 +++++++++++++++++++ .../workspace-keyboard-shortcuts.service.ts | 7 ++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.spec.ts b/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.spec.ts index 5b1fdf24f..9dbaa0d37 100644 --- a/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.spec.ts +++ b/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.spec.ts @@ -1,11 +1,13 @@ import { TestBed } from '@angular/core/testing'; import { MatDialog } from '@angular/material/dialog'; import { Subject } from 'rxjs'; +import { RuntimeCapabilitiesService } from '@iptvnator/services'; import { WorkspaceKeyboardShortcutsService } from './workspace-keyboard-shortcuts.service'; describe('WorkspaceKeyboardShortcutsService', () => { let afterClosed$: Subject; let dialog: { open: jest.Mock }; + let runtime: { isElectron: boolean }; let service: WorkspaceKeyboardShortcutsService; beforeEach(() => { @@ -15,11 +17,13 @@ describe('WorkspaceKeyboardShortcutsService', () => { afterClosed: () => afterClosed$.asObservable(), }), }; + runtime = { isElectron: true }; TestBed.configureTestingModule({ providers: [ WorkspaceKeyboardShortcutsService, { provide: MatDialog, useValue: dialog }, + { provide: RuntimeCapabilitiesService, useValue: runtime }, ], }); @@ -93,4 +97,28 @@ describe('WorkspaceKeyboardShortcutsService', () => { ); expect(commandPaletteShortcut?.chords[0].keys[0].label).toBe('Ctrl'); }); + + it('includes Electron-only shortcuts when runtime supports Electron', () => { + service.openShortcutsDialog(); + + const dialogData = dialog.open.mock.calls[0][1].data; + const itemIds = dialogData.groups.flatMap((group) => + group.items.map((item) => item.id) + ); + + expect(itemIds).toContain('open-global-search'); + }); + + it('uses runtime capabilities for Electron-only shortcuts', () => { + runtime.isElectron = false; + + service.openShortcutsDialog(); + + const dialogData = dialog.open.mock.calls[0][1].data; + const itemIds = dialogData.groups.flatMap((group) => + group.items.map((item) => item.id) + ); + + expect(itemIds).not.toContain('open-global-search'); + }); }); diff --git a/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.ts b/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.ts index 2b6f38daa..c4d750cf8 100644 --- a/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.ts +++ b/libs/workspace/shell/feature/src/lib/workspace-keyboard-shortcuts/workspace-keyboard-shortcuts.service.ts @@ -6,6 +6,7 @@ import { isKeyboardShortcutHelpTrigger, isTypingInInput, } from '@iptvnator/portal/shared/util'; +import { RuntimeCapabilitiesService } from '@iptvnator/services'; import { WorkspaceKeyboardShortcutsDialogComponent, WorkspaceKeyboardShortcutsDialogData, @@ -15,6 +16,7 @@ import { export class WorkspaceKeyboardShortcutsService { private readonly dialog = inject(MatDialog); private readonly destroyRef = inject(DestroyRef); + private readonly runtime = inject(RuntimeCapabilitiesService); private readonly onDocumentKeydown = (event: KeyboardEvent): void => this.handleKeydown(event); @@ -49,7 +51,7 @@ export class WorkspaceKeyboardShortcutsService { data: { groups: getKeyboardShortcutGroups({ isMac: platform === 'mac', - isElectron: this.isElectron(), + isElectron: this.runtime.isElectron, }), platformIcon: platform === 'mac' ? 'laptop_mac' : 'desktop_windows', @@ -93,7 +95,4 @@ export class WorkspaceKeyboardShortcutsService { return /Mac|iPhone|iPad|iPod/i.test(platform) ? 'mac' : 'other'; } - private isElectron(): boolean { - return typeof window !== 'undefined' && !!window.electron; - } }