Skip to content

Commit 4d928fb

Browse files
committed
fix: do not prevent hotkeys on hidden modal/dialog
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
1 parent 1b828cc commit 4d928fb

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

src/composables/useHotKey/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,11 @@ function shouldIgnoreEvent(event: KeyboardEvent): boolean {
5858
|| event.target.isContentEditable) {
5959
return true
6060
}
61-
/** Abort if any modal/dialog opened */
62-
return document.getElementsByClassName('modal-mask').length !== 0
61+
62+
/** Abort if any modal/dialog is opened AND visible */
63+
return Array.from(document.getElementsByClassName('modal-mask'))
64+
.filter((el) => el.checkVisibility())
65+
.length > 0
6366
}
6467

6568
type KeyboardEventHandler = (event: KeyboardEvent) => void

tests/unit/composables/useHotKey.spec.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@ describe('useHotKey', () => {
3939
expect(mockCallback).not.toHaveBeenCalled()
4040
})
4141

42+
it('should not invoke callback by default, when a modal is shown', () => {
43+
const modal = document.createElement('div')
44+
modal.className = 'modal-mask'
45+
document.body.appendChild(modal)
46+
modal.checkVisibility = () => true
47+
48+
const stop = useHotKey(true, mockCallback)
49+
triggerKeyDown({ key: 'a', code: 'KeyA' })
50+
stop()
51+
52+
expect(mockCallback).not.toHaveBeenCalled()
53+
})
54+
55+
it('should invoke callback by default, when a modal present but hidden', () => {
56+
const modal = document.createElement('div')
57+
modal.className = 'modal-mask'
58+
modal.style.display = 'none'
59+
document.body.appendChild(modal)
60+
modal.checkVisibility = () => false
61+
62+
const stop = useHotKey(true, mockCallback)
63+
triggerKeyDown({ key: 'a', code: 'KeyA' })
64+
stop()
65+
66+
expect(mockCallback).toHaveBeenCalled()
67+
})
68+
4269
describe('options', () => {
4370
it('should accept array of keys and invoke callback for all of them', () => {
4471
const stop = useHotKey(['a', 'b'], mockCallback)

0 commit comments

Comments
 (0)