import { Injectable, Inject } from '@angular/core'; import { EventManager } from '@angular/platform-browser'; import { Observable } from 'rxjs'; interface HotkeyOptions { element: any; description: string | undefined; keys: string; } @Injectable({ providedIn: 'root' }) export class TTHotkeys { hotkeys = new Map(); defaults: Partial = { element: document }; constructor(private eventManager: EventManager) { } addShortcut(options: Partial) { const merged = { ...this.defaults, ...options }; if (merged.keys.indexOf('ctrl') > -1) { merged.keys = merged.keys.replace('ctrl', 'control'); } const event = `keydown.${merged.keys}`; if (merged.description) { this.hotkeys.set(merged.keys, merged.description); } return new Observable(observer => { const handler = (e) => { e.preventDefault(); observer.next(e); }; const dispose = this.eventManager.addEventListener(merged.element, event, handler); return () => { dispose(); this.hotkeys.delete(merged.keys); }; }); } }