UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

109 lines (108 loc) 3.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createShortcut = void 0; var _componentHelper = require("../component-helper.js"); class createShortcut { constructor() { this.eventTracker = []; this.shortcutExists = []; } add(shortcut, callback, onDone, element = null) { if (typeof window === 'undefined' || typeof document === 'undefined' || this.shortcutExists[shortcut] === true) { return; } try { element = element || document; const timeout = { id: null }; const keyDown = e => { try { const event = e || window.event; const code = (0, _componentHelper.keycode)(event); const shortcuts = shortcut.split('+'); const metaWanted = { cmd: false, ctrl: false, shift: false, alt: false }; const metaPressed = { cmd: event.metaKey, ctrl: event.ctrlKey, shift: event.shiftKey, alt: event.altKey }; let matches = 0; shortcuts.forEach(cut => { switch (cut) { case 'cmd': case 'ctrl': case 'shift': case 'alt': { metaWanted[cut] = true; matches++; } break; default: { if (cut === code) { matches++; } } break; } }); if (matches === shortcuts.length && metaWanted.cmd === metaPressed.cmd && metaWanted.ctrl === metaPressed.ctrl && metaWanted.shift === metaPressed.shift && metaWanted.alt === metaPressed.alt) { callback(event); if (typeof onDone === 'function') { clearTimeout(timeout.id); timeout.id = setTimeout(onDone, 10); } } } catch (e) { (0, _componentHelper.warn)(e); } }; const keyUp = e => { if (typeof onDone === 'function') { onDone(e); } }; element.addEventListener('keydown', keyDown); element.addEventListener('keyup', keyUp); this.eventTracker[shortcut] = { timeout, element, keyDown, keyUp }; this.shortcutExists[shortcut] = true; } catch (e) { (0, _componentHelper.warn)(e); } } remove(shortcut) { try { shortcut = shortcut.toLowerCase(); if (this.eventTracker[shortcut]) { const { timeout, element, keyDown, keyUp } = this.eventTracker[shortcut]; element.removeEventListener('keydown', keyDown, false); element.removeEventListener('keyup', keyUp, false); clearTimeout(timeout.id); delete this.eventTracker[shortcut]; this.shortcutExists[shortcut] = false; } } catch (e) {} } } exports.createShortcut = createShortcut; //# sourceMappingURL=Shortcuts.js.map