File size: 1,382 Bytes
84121fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { useEffect } from 'react'

interface KeyboardHandlers {
  onArrowUp?: () => void
  onArrowDown?: () => void
  onArrowLeft?: () => void
  onArrowRight?: () => void
  onEnter?: () => void
  onEscape?: () => void
  onBackspace?: () => void
}

export function useKeyboard(handlers: KeyboardHandlers, enabled: boolean = true) {
  useEffect(() => {
    if (!enabled) return

    const handleKeyDown = (event: KeyboardEvent) => {
      switch (event.key) {
        case 'ArrowUp':
          event.preventDefault()
          handlers.onArrowUp?.()
          break
        case 'ArrowDown':
          event.preventDefault()
          handlers.onArrowDown?.()
          break
        case 'ArrowLeft':
          event.preventDefault()
          handlers.onArrowLeft?.()
          break
        case 'ArrowRight':
          event.preventDefault()
          handlers.onArrowRight?.()
          break
        case 'Enter':
          event.preventDefault()
          handlers.onEnter?.()
          break
        case 'Escape':
          event.preventDefault()
          handlers.onEscape?.()
          break
        case 'Backspace':
          event.preventDefault()
          handlers.onBackspace?.()
          break
      }
    }

    document.addEventListener('keydown', handleKeyDown)
    return () => document.removeEventListener('keydown', handleKeyDown)
  }, [handlers, enabled])
}