MCPcopy
hub / github.com/github/hotkey / keyDownHandler

Function keyDownHandler

src/index.ts:22–63  ·  view source on GitHub ↗
(event: KeyboardEvent)

Source from the content-addressed store, hash-verified

20})
21
22function 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
65export function install(element: HTMLElement, hotkey?: string): void {
66 // Install the keydown handler if this is the first install

Callers

nothing calls this directly

Calls 6

isFormFieldFunction · 0.85
eventToHotkeyStringFunction · 0.85
fireDeterminedActionFunction · 0.85
getMethod · 0.80
resetMethod · 0.80
registerKeypressMethod · 0.80

Tested by

no test coverage detected