-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuse-keyboard-event.ts
36 lines (34 loc) · 1.03 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';
export 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 ?? []), keyCode, modifiers],
);
};