ngx-hotkey
Version:
An easy way to use Hotkeys in Angular.
100 lines • 7.52 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ngx-hotkey.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import Hotkey from './hotkey.model';
import * as i0 from "@angular/core";
export class NgxHotkeyService {
constructor() {
this.hotkeys = [];
document.addEventListener('keydown', this.checkKeyDown.bind(this), false);
document.addEventListener('keyup', this.onKeyUp.bind(this), false);
}
/**
* @param {?} shortcut
* @param {?} callback
* @return {?}
*/
add(shortcut, callback) {
this.hotkeys.push(new Hotkey(shortcut, callback));
}
/**
* @param {?} shortcut
* @return {?}
*/
remove(shortcut) {
this.hotkeys = this.hotkeys.filter((/**
* @param {?} x
* @return {?}
*/
x => x.shortcut !== shortcut));
}
/**
* @private
* @param {?} event
* @return {?}
*/
checkKeyDown(event) {
for (let i = 0; i < this.hotkeys.length; i++) {
/** @type {?} */
const hotkey = this.hotkeys[i];
if (this.checkHotKey(event, hotkey) && !this.isTheSameLastHotkeyFired(hotkey)) {
this.lastHotkeyFired = hotkey;
return hotkey.callback(event);
}
}
return false;
}
/**
* @private
* @return {?}
*/
onKeyUp() {
this.lastHotkeyFired = null;
return false;
}
/**
* @private
* @param {?} event
* @param {?} hotkey
* @return {?}
*/
checkHotKey(event, hotkey) {
return event.altKey === hotkey.altKey
&& event.ctrlKey === hotkey.ctrlKey
&& event.metaKey === hotkey.metaKey
&& event.shiftKey === hotkey.shiftKey
&& event.key.toLowerCase() === hotkey.key;
}
/**
* @private
* @param {?} hotkey
* @return {?}
*/
isTheSameLastHotkeyFired(hotkey) {
return hotkey === this.lastHotkeyFired;
}
}
NgxHotkeyService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxHotkeyService.ctorParameters = () => [];
/** @nocollapse */ NgxHotkeyService.ngInjectableDef = i0.defineInjectable({ factory: function NgxHotkeyService_Factory() { return new NgxHotkeyService(); }, token: NgxHotkeyService, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
NgxHotkeyService.prototype.hotkeys;
/**
* @type {?}
* @private
*/
NgxHotkeyService.prototype.lastHotkeyFired;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWhvdGtleS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWhvdGtleS8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtaG90a2V5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sTUFBTSxNQUFNLGdCQUFnQixDQUFDOztBQUtwQyxNQUFNLE9BQU8sZ0JBQWdCO0lBSXpCO1FBSFEsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUkzQixRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7Ozs7O0lBRUQsR0FBRyxDQUFDLFFBQWdCLEVBQUUsUUFBMkM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7Ozs7SUFFRCxNQUFNLENBQUMsUUFBZ0I7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFDLENBQUM7SUFDckUsQ0FBQzs7Ozs7O0lBRU8sWUFBWSxDQUFDLEtBQW9CO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7a0JBQ3BDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMzRSxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztnQkFDOUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pDO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOzs7OztJQUVPLE9BQU87UUFDWCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOzs7Ozs7O0lBRU8sV0FBVyxDQUFDLEtBQW9CLEVBQUUsTUFBYztRQUNwRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU07ZUFDOUIsS0FBSyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTztlQUNoQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPO2VBQ2hDLEtBQUssQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVE7ZUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2xELENBQUM7Ozs7OztJQUVPLHdCQUF3QixDQUFDLE1BQWM7UUFDM0MsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUMzQyxDQUFDOzs7WUEvQ0osVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7Ozs7Ozs7O0lBRUcsbUNBQStCOzs7OztJQUMvQiwyQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCBIb3RrZXkgZnJvbSAnLi9ob3RrZXkubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hIb3RrZXlTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgaG90a2V5czogSG90a2V5W10gPSBbXTtcclxuICAgIHByaXZhdGUgbGFzdEhvdGtleUZpcmVkOiBIb3RrZXk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuY2hlY2tLZXlEb3duLmJpbmQodGhpcyksIGZhbHNlKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcC5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkKHNob3J0Y3V0OiBzdHJpbmcsIGNhbGxiYWNrOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmhvdGtleXMucHVzaChuZXcgSG90a2V5KHNob3J0Y3V0LCBjYWxsYmFjaykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZShzaG9ydGN1dDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5ob3RrZXlzID0gdGhpcy5ob3RrZXlzLmZpbHRlcih4ID0+IHguc2hvcnRjdXQgIT09IHNob3J0Y3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ob3RrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhvdGtleSA9IHRoaXMuaG90a2V5c1tpXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tIb3RLZXkoZXZlbnQsIGhvdGtleSkgJiYgIXRoaXMuaXNUaGVTYW1lTGFzdEhvdGtleUZpcmVkKGhvdGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEhvdGtleUZpcmVkID0gaG90a2V5O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvdGtleS5jYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uS2V5VXAoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5sYXN0SG90a2V5RmlyZWQgPSBudWxsO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrSG90S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBob3RrZXk6IEhvdGtleSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBldmVudC5hbHRLZXkgPT09IGhvdGtleS5hbHRLZXlcclxuICAgICAgICAgICAgJiYgZXZlbnQuY3RybEtleSA9PT0gaG90a2V5LmN0cmxLZXlcclxuICAgICAgICAgICAgJiYgZXZlbnQubWV0YUtleSA9PT0gaG90a2V5Lm1ldGFLZXlcclxuICAgICAgICAgICAgJiYgZXZlbnQuc2hpZnRLZXkgPT09IGhvdGtleS5zaGlmdEtleVxyXG4gICAgICAgICAgICAmJiBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gaG90a2V5LmtleTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVGhlU2FtZUxhc3RIb3RrZXlGaXJlZChob3RrZXk6IEhvdGtleSkge1xyXG4gICAgICAgIHJldHVybiBob3RrZXkgPT09IHRoaXMubGFzdEhvdGtleUZpcmVkO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==