Skip to content

Commit d7f284a

Browse files
fix(useMagicKeys): prevent incorrect clearing of other keys after releasing shift (#4916)
1 parent 3d5e511 commit d7f284a

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

packages/core/useMagicKeys/index.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,34 @@ describe('useMagicKeys', () => {
6363
}))
6464
expect(Ctrl_Shift_Period.value).toBe(true)
6565
})
66+
it('prevent incorrect clearing of other keys after releasing shift', async () => {
67+
const { v, u, e, shift } = useMagicKeys({ target })
68+
69+
target.dispatchEvent(new KeyboardEvent('keydown', {
70+
key: 'v',
71+
}))
72+
target.dispatchEvent(new KeyboardEvent('keydown', {
73+
key: 'u',
74+
}))
75+
target.dispatchEvent(new KeyboardEvent('keydown', {
76+
key: 'e',
77+
}))
78+
target.dispatchEvent(new KeyboardEvent('keydown', {
79+
key: 'shift',
80+
}))
81+
82+
expect(v.value).toBe(true)
83+
expect(u.value).toBe(true)
84+
expect(e.value).toBe(true)
85+
expect(shift.value).toBe(true)
86+
87+
target.dispatchEvent(new KeyboardEvent('keyup', {
88+
key: 'shift',
89+
}))
90+
91+
expect(v.value).toBe(true)
92+
expect(u.value).toBe(true)
93+
expect(e.value).toBe(true)
94+
expect(shift.value).toBe(false)
95+
})
6696
})

packages/core/useMagicKeys/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,13 @@ export function useMagicKeys(options: UseMagicKeysOptions<boolean> = {}): any {
121121
setRefs(key, value)
122122
}
123123
if (key === 'shift' && !value) {
124-
shiftDeps.forEach((key) => {
125-
current.delete(key)
126-
setRefs(key, false)
124+
const shiftDepsArray = Array.from(shiftDeps)
125+
const shiftIndex = shiftDepsArray.indexOf('shift')
126+
shiftDepsArray.forEach((key, index) => {
127+
if (index >= shiftIndex) {
128+
current.delete(key)
129+
setRefs(key, false)
130+
}
127131
})
128132
shiftDeps.clear()
129133
}

0 commit comments

Comments
 (0)