File size: 953 Bytes
4d70170
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { onMounted, onUnmounted } from 'vue'

type KeyboardHandler = (event: KeyboardEvent) => boolean | void | Promise<boolean | void>

function handleKeyboard(type: 'keyup' | 'keydown', cb: KeyboardHandler, force: boolean) {
  function handler(event: KeyboardEvent) {
    if (!force && (
      typeof HTMLElement !== 'undefined' && event.target instanceof HTMLElement && (
        event.target.tagName === 'INPUT'
        || event.target.tagName === 'TEXTAREA'
      )
    )) {
      return
    }

    const result = cb(event)
    if (result === false) {
      event.preventDefault()
    }
  }

  onMounted(() => {
    document.addEventListener(type, handler)
  })

  onUnmounted(() => {
    document.removeEventListener(type, handler)
  })
}

export function onKeyUp(cb: KeyboardHandler, force = false) {
  handleKeyboard('keyup', cb, force)
}

export function onKeyDown(cb: KeyboardHandler, force = false) {
  handleKeyboard('keydown', cb, force)
}