ember-key-manager
Version:
A service for (un)binding key up and down events.
80 lines (64 loc) • 2.35 kB
text/typescript
import Modifier, { ModifierArgs } from 'ember-modifier';
import {inject as service} from '@ember/service';
import {assert} from '@ember/debug';
import { KeyEvent } from '@ember/test-helpers/dom/trigger-key-event';
import KeyManagerService from 'ember-key-manager/services/key-manager';
import { KeyMacroModifierCallback } from 'ember-key-manager/utils/callback';
export type IKeyMacro = {} | null;
const isMac: boolean = window.navigator.platform === "MacIntel";
export const cmdKey: string = isMac ? 'Meta' : 'Control';
type ModifierKey = 'Alt' | 'Control' | 'Shift' | 'Meta';
interface KeyMacroModifierArgs extends ModifierArgs {
positional: [executionKey: string, callback: KeyMacroModifierCallback];
named: {
modifierKeys?: ModifierKey[];
priority?: number;
disabledOnInput?: boolean;
}
}
export default abstract class KeyMacroModifier extends Modifier<KeyMacroModifierArgs> {
keyManager!: KeyManagerService;
private macro: any;
protected abstract keyEvent: KeyEvent;
protected abstract name: string;
private addMacro() {
this.macro = this.keyManager.addMacro({
element: this.element as HTMLElement,
callback: this.callback,
executionKey: this.executionKey,
modifierKeys: this.modifierKeys,
priority: this.priority,
keyEvent: this.keyEvent,
isDisabledOnInput: this.isDisabledOnInput
});
}
private removeMacro() {
if (this.macro) {
this.keyManager.removeMacro(this.macro);
}
}
get callback(): KeyMacroModifierCallback {
assert(`A callback function must be supplied as the second parameter of a ${this.name} modifier`, this.args.positional.length > 1);
return this.args.positional[1] as KeyMacroModifierCallback;
}
get executionKey(): string {
assert(`executionKey must be supplied as the first parameter of a ${this.name} modifier`, this.args.positional.length > 0);
return this.args.positional[0] as string;
}
get modifierKeys(): string[] {
return this.args.named.modifierKeys || [];
}
get priority(): number {
return this.args.named.priority || 0;
}
get isDisabledOnInput(): boolean {
return this.args.named.disabledOnInput || false;
}
public didReceiveArguments() {
this.removeMacro();
this.addMacro();
}
public willDestroy() {
this.removeMacro();
}
}