@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
102 lines • 2.9 kB
JavaScript
import { warn, keycode } from "../component-helper.js";
export 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 = 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) {
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) {
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) {}
}
}
//# sourceMappingURL=Shortcuts.js.map