(event: KeyboardEvent)
| 20 | }) |
| 21 | |
| 22 | function keyDownHandler(event: KeyboardEvent) { |
| 23 | if (event.defaultPrevented) return |
| 24 | if (!(event.target instanceof Node)) return |
| 25 | if (isFormField(event.target)) { |
| 26 | const target = event.target as HTMLElement |
| 27 | if (!target.id) return |
| 28 | if (!target.ownerDocument.querySelector(`[data-hotkey-scope="${target.id}"]`)) return |
| 29 | } |
| 30 | |
| 31 | // If the user presses a hotkey that doesn't exist in the Trie, |
| 32 | // they've pressed a wrong key-combo and we should reset the flow |
| 33 | const newTriePosition = (currentTriePosition as RadixTrie<HTMLElement>).get(eventToHotkeyString(event)) |
| 34 | if (!newTriePosition) { |
| 35 | sequenceTracker.reset() |
| 36 | return |
| 37 | } |
| 38 | sequenceTracker.registerKeypress(event) |
| 39 | |
| 40 | currentTriePosition = newTriePosition |
| 41 | if (newTriePosition instanceof Leaf) { |
| 42 | const target = event.target as HTMLElement |
| 43 | let shouldFire = false |
| 44 | let elementToFire |
| 45 | const formField = isFormField(target) |
| 46 | |
| 47 | for (let i = newTriePosition.children.length - 1; i >= 0; i -= 1) { |
| 48 | elementToFire = newTriePosition.children[i] |
| 49 | const scope = elementToFire.getAttribute('data-hotkey-scope') |
| 50 | if ((!formField && !scope) || (formField && target.id === scope)) { |
| 51 | shouldFire = true |
| 52 | break |
| 53 | } |
| 54 | } |
| 55 | |
| 56 | if (elementToFire && shouldFire) { |
| 57 | fireDeterminedAction(elementToFire, sequenceTracker.path) |
| 58 | event.preventDefault() |
| 59 | } |
| 60 | |
| 61 | sequenceTracker.reset() |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | export function install(element: HTMLElement, hotkey?: string): void { |
| 66 | // Install the keydown handler if this is the first install |
nothing calls this directly
no test coverage detected