( keyFilter: KeyFilter, eventHandler: (event: KeyboardEvent, key: KeyType) => void, option?: Options, )
| 236 | const defaultEvents: KeyEvent[] = ['keydown']; |
| 237 | |
| 238 | function useKeyPress( |
| 239 | keyFilter: KeyFilter, |
| 240 | eventHandler: (event: KeyboardEvent, key: KeyType) => void, |
| 241 | option?: Options, |
| 242 | ) { |
| 243 | const { events = defaultEvents, target, exactMatch = false, useCapture = false } = option || {}; |
| 244 | const eventHandlerRef = useLatest(eventHandler); |
| 245 | const keyFilterRef = useLatest(keyFilter); |
| 246 | |
| 247 | useDeepCompareEffectWithTarget( |
| 248 | () => { |
| 249 | const el = getTargetElement(target, window); |
| 250 | if (!el) { |
| 251 | return; |
| 252 | } |
| 253 | |
| 254 | const callbackHandler = (event: Event) => { |
| 255 | const keyEvent = event as KeyboardEvent; |
| 256 | const genGuard = genKeyFormatter(keyFilterRef.current, exactMatch); |
| 257 | const keyGuard = genGuard(keyEvent); |
| 258 | const firedKey = isValidKeyType(keyGuard) ? keyGuard : keyEvent.key; |
| 259 | |
| 260 | if (keyGuard) { |
| 261 | return eventHandlerRef.current?.(keyEvent, firedKey); |
| 262 | } |
| 263 | }; |
| 264 | |
| 265 | for (const eventName of events) { |
| 266 | el?.addEventListener?.(eventName, callbackHandler, useCapture); |
| 267 | } |
| 268 | return () => { |
| 269 | for (const eventName of events) { |
| 270 | el?.removeEventListener?.(eventName, callbackHandler, useCapture); |
| 271 | } |
| 272 | }; |
| 273 | }, |
| 274 | [events], |
| 275 | target, |
| 276 | ); |
| 277 | } |
| 278 | |
| 279 | export default useKeyPress; |
no test coverage detected
searching dependent graphs…