Skip to content

Commit b2ff9d0

Browse files
committed
fix(useHotKey): try to derive latin keys from key codes of non-latin characters
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
1 parent c6d722e commit b2ff9d0

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

docs/composables/useHotKey.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ where:
3737
3838
<template>
3939
<div class="container">
40+
<p class="description">{{ loggedKey }}</p>
4041
<p class="description">Press <kbd>W</kbd> <kbd>S</kbd> <kbd>A</kbd> <kbd>D</kbd> keys to move the ball</p>
4142
<div class="square">
4243
<div class="circle" :style="{ left: `${circleX}px`, top: `${circleY}px` }"></div>
@@ -57,12 +58,36 @@ where:
5758
import { ref } from 'vue'
5859
import { useHotKey } from '../../src/composables/useHotKey/index.js'
5960
61+
const isMac = /mac|ipad|iphone|darwin/i.test(navigator.userAgent)
62+
6063
export default {
6164
setup() {
65+
const loggedKey = ref('Press any key')
6266
const circleX = ref(20)
6367
const circleY = ref(20)
6468
const highlighted = ref(false)
6569
70+
const updateLoggedKey = (event) => {
71+
if (['Ctrl', 'Meta', 'Alt', 'Shift'].includes(event.key)) {
72+
return
73+
}
74+
75+
loggedKey.value = `Key pressed: ${event.key} | `
76+
if (event.ctrlKey) {
77+
loggedKey.value += 'Ctrl + '
78+
}
79+
if (event.metaKey) {
80+
loggedKey.value += isMac ? 'Cmd + ' : 'Meta + '
81+
}
82+
if (event.altKey) {
83+
loggedKey.value += 'Alt + '
84+
}
85+
if (event.shiftKey) {
86+
loggedKey.value += 'Shift + '
87+
}
88+
loggedKey.value += event.code
89+
}
90+
6691
const moveUp = (event) => {
6792
circleY.value = Math.max(0, circleY.value - 10)
6893
}
@@ -79,13 +104,15 @@ where:
79104
highlighted.value = !highlighted.value
80105
}
81106
107+
useHotKey(true, updateLoggedKey)
82108
useHotKey('w', moveUp)
83109
useHotKey('s', moveDown)
84110
useHotKey('a', moveLeft)
85111
useHotKey('d', moveRight)
86112
const stop = useHotKey('m', toggleHighlighted, { push: true })
87113
88114
return {
115+
loggedKey,
89116
circleX,
90117
circleY,
91118
highlighted,

src/composables/useHotKey/index.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { onKeyStroke } from '@vueuse/core'
66

77
const disableKeyboardShortcuts = window.OCP?.Accessibility?.disableKeyboardShortcuts?.()
88
const isMac = /mac|ipad|iphone|darwin/i.test(navigator.userAgent)
9+
const derivedKeysRegex = /^[a-zA-Z0-9]$/
10+
const nonAsciiPrintableRegex = /^[^\x20-\x7F]$/
911

1012
export interface UseHotKeyOptions {
1113
/** Make key filter case sensitive */
@@ -124,7 +126,8 @@ export function useHotKey(
124126

125127
/**
126128
* Validates event key to expected key
127-
* FIXME should support any languages / key codes
129+
* If received event.key is not a printable ASCII character code (character code 32-127),
130+
* try to derive it from event.code and match with expected key
128131
*
129132
* @param event keyboard event
130133
* @param key expected key
@@ -134,6 +137,12 @@ export function useHotKey(
134137
if (options.caseSensitive) {
135138
return event.key === key
136139
}
140+
141+
if (derivedKeysRegex.test(key) && nonAsciiPrintableRegex.test(event.key)) {
142+
const derivedKey = event.code.replace(/(Key|Digit|Numpad)/, '')
143+
return derivedKey === key.toUpperCase()
144+
}
145+
137146
return event.key.toLowerCase() === key.toLowerCase()
138147
}
139148

0 commit comments

Comments
 (0)