feat: added new hot key hook since useKey doesnt ignore special keys
replaced all alpha numeric shortcutspull/3083/head
parent
f5cd3ba1f9
commit
cf34db53c8
@ -0,0 +1,66 @@
|
|||||||
|
import useKey, { Handler, KeyPredicate, UseKeyOptions } from 'react-use/lib/useKey';
|
||||||
|
|
||||||
|
function specialKeyPressed(event: KeyboardEvent) {
|
||||||
|
const pressed = [];
|
||||||
|
|
||||||
|
if (event.metaKey) {
|
||||||
|
pressed.push('super');
|
||||||
|
}
|
||||||
|
if (event.ctrlKey) {
|
||||||
|
pressed.push('ctrl');
|
||||||
|
}
|
||||||
|
if (event.altKey) {
|
||||||
|
pressed.push('alt');
|
||||||
|
}
|
||||||
|
if (event.shiftKey) {
|
||||||
|
pressed.push('shift');
|
||||||
|
}
|
||||||
|
|
||||||
|
return pressed.join(' + ');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useHotkey(
|
||||||
|
key: string,
|
||||||
|
onPress: (event: KeyboardEvent) => void | Promise<void>,
|
||||||
|
disabled?: boolean
|
||||||
|
) {
|
||||||
|
const opts: UseKeyOptions<HTMLElement> = {};
|
||||||
|
|
||||||
|
const predicate: KeyPredicate = event => {
|
||||||
|
const lowerKey = key.toLowerCase();
|
||||||
|
const eventKey = event.key.toLowerCase();
|
||||||
|
|
||||||
|
window.log.debug(
|
||||||
|
`WIP: [useHotkey] key: ${key} lowerKey: ${lowerKey} eventKey: ${eventKey} event.target: ${JSON.stringify(event)}`
|
||||||
|
);
|
||||||
|
|
||||||
|
switch (lowerKey) {
|
||||||
|
case 'esc':
|
||||||
|
case 'escape':
|
||||||
|
return eventKey === 'escape' || eventKey === 'esc';
|
||||||
|
default:
|
||||||
|
return eventKey === lowerKey;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handler: Handler = event => {
|
||||||
|
if (disabled) {
|
||||||
|
window.log.debug(`WIP: [useHotkey] '${key}' is disabled. Triggered by ${event.key}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const specialKeys = specialKeyPressed(event);
|
||||||
|
|
||||||
|
if (specialKeys) {
|
||||||
|
window.log.debug(
|
||||||
|
`WIP: [useHotkey] '${key}' was ignored because it was pressed with ${specialKeys}. Triggered by ${event.key} + ${specialKeys}`
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.log.debug(`WIP: [useHotkey] '${key}' onPress event. Triggered by ${event.key}`);
|
||||||
|
void onPress(event);
|
||||||
|
};
|
||||||
|
|
||||||
|
useKey(predicate, handler, opts);
|
||||||
|
}
|
Loading…
Reference in New Issue