fix(core): reset isPressed value when switching from boolean to other keyfilter

This commit is contained in:
braks
2023-08-21 17:44:20 +02:00
committed by Braks
parent 65c3a05d84
commit 505ecc4c21
+29 -13
View File
@@ -71,25 +71,37 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | null>, onCha
watch( watch(
() => toValue(keyFilter), () => toValue(keyFilter),
(unrefKeyFilter) => { (nextKeyFilter, previousKeyFilter) => {
if (window && typeof window.addEventListener !== 'undefined') { if (window && typeof window.addEventListener !== 'undefined') {
useEventListener(window, 'blur', () => { useEventListener(window, 'blur', () => {
isPressed.value = false isPressed.value = false
}) })
} }
if (isBoolean(unrefKeyFilter)) { // if the previous keyFilter was a boolean but is now something else, we need to reset the isPressed value
isPressed.value = unrefKeyFilter if (isBoolean(previousKeyFilter) && !isBoolean(nextKeyFilter)) {
reset()
}
// if the keyFilter is null, we just set the isPressed value to false
if (nextKeyFilter === null) {
reset()
return return
} }
if (Array.isArray(unrefKeyFilter) || (isString(unrefKeyFilter) && unrefKeyFilter.includes('+'))) { // if the keyFilter is a boolean, we just set the isPressed value to that boolean
unrefKeyFilter = createKeyPredicate(unrefKeyFilter, pressedKeys) if (isBoolean(nextKeyFilter)) {
isPressed.value = nextKeyFilter
return
} }
if (unrefKeyFilter) { if (Array.isArray(nextKeyFilter) || (isString(nextKeyFilter) && nextKeyFilter.includes('+'))) {
nextKeyFilter = createKeyPredicate(nextKeyFilter, pressedKeys)
}
if (nextKeyFilter) {
onKeyStroke( onKeyStroke(
unrefKeyFilter, nextKeyFilter,
(e) => { (e) => {
modifierPressed = wasModifierPressed(e) modifierPressed = wasModifierPressed(e)
@@ -105,18 +117,14 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | null>, onCha
) )
onKeyStroke( onKeyStroke(
unrefKeyFilter, nextKeyFilter,
(e) => { (e) => {
if (isPressed.value) { if (isPressed.value) {
if (!modifierPressed && isInputDOMNode(e)) { if (!modifierPressed && isInputDOMNode(e)) {
return return
} }
modifierPressed = false reset()
pressedKeys.clear()
isPressed.value = false
} }
}, },
{ eventName: 'keyup' }, { eventName: 'keyup' },
@@ -129,4 +137,12 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | null>, onCha
) )
return isPressed return isPressed
function reset() {
modifierPressed = false
pressedKeys.clear()
isPressed.value = false
}
} }