From 505ecc4c217a98ae93b50be15accb962cdbd5129 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Fri, 18 Aug 2023 23:09:54 +0200 Subject: [PATCH] fix(core): reset `isPressed` value when switching from boolean to other keyfilter --- packages/core/src/composables/useKeyPress.ts | 42 ++++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/packages/core/src/composables/useKeyPress.ts b/packages/core/src/composables/useKeyPress.ts index 50b0b8b2..c2907a19 100644 --- a/packages/core/src/composables/useKeyPress.ts +++ b/packages/core/src/composables/useKeyPress.ts @@ -71,25 +71,37 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter, onCha watch( () => toValue(keyFilter), - (unrefKeyFilter) => { + (nextKeyFilter, previousKeyFilter) => { if (window && typeof window.addEventListener !== 'undefined') { useEventListener(window, 'blur', () => { isPressed.value = false }) } - if (isBoolean(unrefKeyFilter)) { - isPressed.value = unrefKeyFilter + // if the previous keyFilter was a boolean but is now something else, we need to reset the isPressed value + if (isBoolean(previousKeyFilter) && !isBoolean(nextKeyFilter)) { + reset() + } + + // if the keyFilter is null, we just set the isPressed value to false + if (nextKeyFilter === null) { + reset() return } - if (Array.isArray(unrefKeyFilter) || (isString(unrefKeyFilter) && unrefKeyFilter.includes('+'))) { - unrefKeyFilter = createKeyPredicate(unrefKeyFilter, pressedKeys) + // if the keyFilter is a boolean, we just set the isPressed value to that boolean + if (isBoolean(nextKeyFilter)) { + isPressed.value = nextKeyFilter + return } - if (unrefKeyFilter) { + if (Array.isArray(nextKeyFilter) || (isString(nextKeyFilter) && nextKeyFilter.includes('+'))) { + nextKeyFilter = createKeyPredicate(nextKeyFilter, pressedKeys) + } + + if (nextKeyFilter) { onKeyStroke( - unrefKeyFilter, + nextKeyFilter, (e) => { modifierPressed = wasModifierPressed(e) @@ -105,18 +117,14 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter, onCha ) onKeyStroke( - unrefKeyFilter, + nextKeyFilter, (e) => { if (isPressed.value) { if (!modifierPressed && isInputDOMNode(e)) { return } - modifierPressed = false - - pressedKeys.clear() - - isPressed.value = false + reset() } }, { eventName: 'keyup' }, @@ -129,4 +137,12 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter, onCha ) return isPressed + + function reset() { + modifierPressed = false + + pressedKeys.clear() + + isPressed.value = false + } }