fix(core): reset isPressed value when switching from boolean to other keyfilter
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user