Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { withSimpleController } from "./controllers.mjs";
const useKeyEvent =
keyEventName => (target, keyCombination, callback, options) => {
const parts = keyCombination.split("+");
const keys = parts.map(part => part.toLowerCase());
const modifiers = ["ctrl", "alt", "shift", "meta"];
const handleKeyEvent = event => {
const isModifierCorrect = modifiers.every(
modifier => keys.includes(modifier) === event[`${modifier}Key`]
);
const actualKey = keys.find(key => !modifiers.includes(key));
// We check the code value rather than key since key value
// can be missleading without prevent default e.g. option + N = ñ
const isKeyCorrect =
event.code.toLowerCase() === `key${actualKey}`.toLowerCase() ||
event.code.toLowerCase() === actualKey.toLowerCase();
if (isModifierCorrect && isKeyCorrect) {
if (options?.preventDefault) {
event.preventDefault();
}
callback?.(event);
}
};
target.addEventListener(keyEventName, handleKeyEvent);
return () => {
target.removeEventListener(keyEventName, handleKeyEvent);
};
};
export const handleKeyPress = (host, ...args) =>
new (withSimpleController(host, useKeyEvent("keydown"), ...args))();