2023-02-07 19:20:01 +00:00
|
|
|
import { DOCUMENT } from '@angular/common';
|
|
|
|
import { Inject, Injectable } from '@angular/core';
|
|
|
|
import { EventManager } from '@angular/platform-browser';
|
|
|
|
import { Observable } from 'rxjs';
|
2023-02-07 16:05:38 +00:00
|
|
|
|
2023-02-07 19:20:01 +00:00
|
|
|
interface Options {
|
2023-02-07 16:05:38 +00:00
|
|
|
element: any;
|
|
|
|
keys: string;
|
2023-02-07 19:20:01 +00:00
|
|
|
};
|
2023-02-07 16:05:38 +00:00
|
|
|
|
|
|
|
@Injectable({ providedIn: 'root' })
|
|
|
|
export class HotKeysService {
|
|
|
|
defaults: Partial<Options> = {
|
|
|
|
element: this.document
|
2023-02-07 19:20:01 +00:00
|
|
|
};
|
2023-02-07 16:05:38 +00:00
|
|
|
|
|
|
|
constructor(private eventManager: EventManager, @Inject(DOCUMENT) private document: Document) {
|
|
|
|
}
|
|
|
|
|
|
|
|
addShortcut(options: Partial<Options>) {
|
|
|
|
const merged = { ...this.defaults, ...options };
|
|
|
|
const event = `keydown.${merged.keys}`;
|
|
|
|
|
|
|
|
return new Observable(observer => {
|
|
|
|
const handler = (e: KeyboardEvent) => {
|
|
|
|
if (document.URL.endsWith('/slides'))
|
|
|
|
{
|
2023-02-07 19:20:01 +00:00
|
|
|
e.preventDefault();
|
2023-02-07 16:05:38 +00:00
|
|
|
observer.next(e);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const dispose = this.eventManager.addEventListener(
|
|
|
|
merged.element, event, handler
|
|
|
|
);
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
dispose();
|
|
|
|
};
|
2023-02-07 19:20:01 +00:00
|
|
|
});
|
2023-02-07 16:05:38 +00:00
|
|
|
}
|
2023-02-07 19:20:01 +00:00
|
|
|
}
|