Add support for keyboard events

This commit is contained in:
Thomas Nordquist
2019-06-24 11:22:50 +02:00
parent f691a7a0ae
commit ba91730f43
8 changed files with 397 additions and 313 deletions

View File

@@ -0,0 +1,24 @@
import { useEffect } from 'react'
import { KeyCodes } from '../utils/KeyCodes'
export function useGlobalKeyEventHandler(
key: KeyCodes | undefined,
callback: (event: KeyboardEvent) => void,
dependencies?: Array<any>
) {
useEffect(() => {
function handleKeyEvent(event: KeyboardEvent) {
if (key === undefined) {
callback(event)
} else if (event.keyCode === key) {
callback(event)
event.preventDefault()
}
}
document.addEventListener('keydown', handleKeyEvent, false)
return function cleanup() {
document.removeEventListener('keydown', handleKeyEvent, false)
}
}, dependencies)
}

View File

@@ -0,0 +1,31 @@
import { KeyCodes } from '../utils/KeyCodes'
import { useCallback } from 'react'
export function useKeyEventHandler(key: KeyCodes, callback: () => void, dependencies: Array<any> = []) {
return useKeyEventHandlers([{ key, callback }], dependencies)
}
export function useKeyEventHandlers(
actions: Array<{
key: KeyCodes
callback: (event: KeyboardEvent) => void
preventDefault?: boolean
stopPropagation?: boolean
}>,
dependencies: Array<any> = []
) {
return useCallback(() => {
return function handleKeyEvent(event: KeyboardEvent) {
const action = actions.find(a => a.key === event.keyCode)
if (action) {
action.callback(event)
if (action.preventDefault !== false) {
event.preventDefault()
}
if (action.stopPropagation !== false) {
event.stopPropagation()
}
}
}
}, dependencies)
}