-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuse-keyboard-event.ts
36 lines (34 loc) · 1.02 KB
/
use-keyboard-event.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { DependencyList } from 'react';
import { useEventListener } from '@/hooks';
type Modifiers = {
control?: boolean;
shift?: boolean;
alt?: boolean;
meta?: boolean;
};
export const useKeyboardEvent = (
type: 'keypress' | 'keyup' | 'keydown',
keyCode: string | string[],
callback: (e: KeyboardEvent) => void,
deps: DependencyList,
modifiers?: Modifiers,
) => {
useEventListener(
null,
type,
(e) => {
const event = e as KeyboardEvent;
if (
(typeof keyCode === 'object' ? keyCode.includes(event.code) : event.code === keyCode) &&
(!modifiers ||
((modifiers.control === undefined || event.ctrlKey === !!modifiers.control) &&
(modifiers.shift === undefined || event.shiftKey === !!modifiers.shift) &&
(modifiers.alt === undefined || event.altKey === !!modifiers.alt) &&
(modifiers.meta === undefined || event.metaKey === !!modifiers.meta)))
) {
callback(event);
}
},
[...(deps ?? []), modifiers],
);
};