src/app/inputs.ts

Summary

Maintainability
A
25 mins
Test Coverage
import * as $ from 'jquery';
import * as hotkeys from '../_helpers/hotkeys.js';

export default class Inputs {

    private static _instance: Inputs;
    private events: any;

    constructor() {
        this.events = {};
    }

    public addEvent(key: string, once: boolean = false, params: any = {}, handler: any): void {
        const scope = typeof params.key !== 'undefined' ? params.key.split('.')[0] : 'default';
        const eventData = $.extend({}, params, {eventKey: key, once: once, handler: typeof handler === 'function'});

        this.on(key, handler, scope, once, eventData);
    }

    private on(key: string, handler: any, scope: string = 'default', reset: boolean = false, eventData: any): void {
        const self = this;
        this.registerEvent(eventData);
        hotkeys(key, (e) => {
            e.preventDefault();
            if (typeof handler !== 'undefined') {
                handler(e);
            }
            if (reset) {
                self.off(key, eventData);
            }
            return false;
        }, undefined, eventData);
    }

    public removeEvent(key, eventData = {}): void {
        this.off(key, eventData);
    }

    private off(key, eventData = {}): void {
        if (this.checkKeyRegistration(key)) {
            hotkeys.unbind(key, undefined, eventData);
            this.purgeEvent(key, eventData);
        }
    }

    public getEventList(onlyButtons: boolean = false) {
        let results = this.events;
        if (onlyButtons) {
            let resultsWithButton = [];
            for (let i: number = 0; i < results.length; i++) {
                if (results[i]['button']) {
                    resultsWithButton.push(results[i]);
                }
            }
            return resultsWithButton;
        }
        return results;
    }

    private registerEvent(params): void {
        if (!this.events[0]) {
            this.events = [];
        }
        this.events.push(params);
        $('body').trigger('event-change', params);
    }

    private checkKeyRegistration(key): boolean {
        for (let i: number = 0; i < this.events.length; i++) {
            if (this.events[i]['eventKey'] === key) {
                return true;
            }
        }
        return false;
    }

    private purgeEvent(key, eventData): void {
        for (let i: number = 0; i < this.events.length; i++) {
            if (this.events[i]['eventKey'] === key) {
                delete this.events[i];
            }
        }
        // Clean up empty slots of events list
        this.events = this.events.filter(Boolean);
        $('body').trigger('event-change', eventData);
    }

    public static get instance() {
        return this._instance || (this._instance = new this());
    }
}