json-joy
Version:
Collection of libraries for building collaborative editing apps.
50 lines (49 loc) • 1.81 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.KeyController = void 0;
/**
* Keeps track of all pressed down keys.
*/
class KeyController {
constructor(opts) {
this.opts = opts;
/**
* All currently pressed keys.
*/
this.pressed = new Set();
}
start() {
const onKeyDown = (event) => {
if (event.isComposing || event.key === 'Dead')
return;
this.pressed.add(event.key);
};
const onKeyUp = (event) => {
if (event.isComposing || event.key === 'Dead')
return;
this.pressed.delete(event.key);
};
const onReset = () => {
this.pressed.clear();
};
document.addEventListener('keydown', onKeyDown);
document.addEventListener('keyup', onKeyUp);
document.addEventListener('focus', onReset);
document.addEventListener('compositionstart', onReset);
document.addEventListener('compositionend', onReset);
this.opts.source.addEventListener('blur', onReset);
return () => {
document.removeEventListener('keydown', onKeyDown);
document.removeEventListener('keyup', onKeyUp);
document.removeEventListener('focus', onReset);
document.removeEventListener('compositionstart', onReset);
document.removeEventListener('compositionend', onReset);
this.opts.source.removeEventListener('blur', onReset);
};
}
/** ----------------------------------------------------- {@link Printable} */
toString(tab) {
return `keys { pressed: [ ${[...this.pressed].map((key) => JSON.stringify(key)).join(', ')} ] }`;
}
}
exports.KeyController = KeyController;
;