json-joy
Version:
Collection of libraries for building collaborative editing apps.
47 lines (46 loc) • 1.66 kB
JavaScript
/**
* Keeps track of all pressed down keys.
*/
export class KeyController {
opts;
/**
* All currently pressed keys.
*/
pressed = new Set();
constructor(opts) {
this.opts = opts;
}
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(', ')} ] }`;
}
}