@tolokoban/ui
Version:
React components with theme
37 lines • 2.52 kB
JavaScript
import * as React from "react";
/**
* A keyboard shortcut to trigger an action.
* Use these prefixes (in that order) for modifiers keys:
* * `C-` for **Control**.
* * `S-` for **Shift**.
* * `M-` for **Alt** (Meta).
* For example, if you want to react at Shift + Control + Enter,
* the hotkey willl be "C-S-enter".
*
* @param hotkey
* @param onKeyDown
* @param enabled
*/
export function useHotKey(hotkey, onKeyDown, enabled = true) {
React.useEffect(() => {
if (!enabled || !hotkey)
return;
const handleKeyDown = (evt) => {
let current = evt.key.toLowerCase();
if (evt.altKey)
current = `M-${current}`;
if (evt.shiftKey)
current = `S-${current}`;
if (evt.ctrlKey)
current = `C-${current}`;
if (current === hotkey) {
evt.preventDefault();
evt.stopPropagation();
onKeyDown();
}
};
window.addEventListener("keydown", handleKeyDown, true);
return () => window.removeEventListener("keydown", handleKeyDown, true);
}, [enabled, hotkey, onKeyDown]);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL2hvdGtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQTRDOUI7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDckIsTUFBMEIsRUFDMUIsU0FBcUIsRUFDckIsT0FBTyxHQUFHLElBQUk7SUFFZCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU07UUFFL0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFrQixFQUFFLEVBQUU7WUFDekMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUNuQyxJQUFJLEdBQUcsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFBO1lBQ3hDLElBQUksR0FBRyxDQUFDLFFBQVE7Z0JBQUUsT0FBTyxHQUFHLEtBQUssT0FBTyxFQUFFLENBQUE7WUFDMUMsSUFBSSxHQUFHLENBQUMsT0FBTztnQkFBRSxPQUFPLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQTtZQUN6QyxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUNwQixHQUFHLENBQUMsZUFBZSxFQUFFLENBQUE7Z0JBQ3JCLFNBQVMsRUFBRSxDQUFBO1lBQ2YsQ0FBQztRQUNMLENBQUMsQ0FBQTtRQUNELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZELE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDM0UsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO0FBQ3BDLENBQUMifQ==