From bedf15eadbda75927aac3ae7677c90740b85c661 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Thu, 2 May 2024 15:34:32 +0530 Subject: [PATCH] Revert "feat: remove timer" This reverts commit 285017647b6ceeff4cc4e8e12feb71b5fb10fc42. --- app/javascript/shared/helpers/keybindings.js | 29 ++++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/app/javascript/shared/helpers/keybindings.js b/app/javascript/shared/helpers/keybindings.js index a0cc34674..38e7520a3 100644 --- a/app/javascript/shared/helpers/keybindings.js +++ b/app/javascript/shared/helpers/keybindings.js @@ -55,6 +55,9 @@ export function createKeybindingsHandler(keyBindingMap) { return [parseKeybinding(key), keyBindingMap[key]]; }); + let possibleMatches = new Map(); + let timer = null; + return event => { if (!(event instanceof KeyboardEvent)) { return; @@ -63,12 +66,32 @@ export function createKeybindingsHandler(keyBindingMap) { // eslint-disable-next-line no-console console.log(event.key, event.code, event.getModifierState('Control')); - keyBindings.forEach(([key, callback]) => { - let expectedPress = parseKeybinding(key); + keyBindings.forEach(keyBinding => { + let sequence = keyBinding[0]; + let callback = keyBinding[1]; - if (match(event, expectedPress)) { + let prev = possibleMatches.get(sequence); + let remainingExpectedPresses = prev ?? sequence; + let currentExpectedPress = remainingExpectedPresses[0]; + + let matches = match(event, currentExpectedPress); + + if (!matches) { + if (!getModifierState(event, event.key)) { + possibleMatches.delete(sequence); + } + } else if (remainingExpectedPresses.length > 1) { + possibleMatches.set(sequence, remainingExpectedPresses.slice(1)); + } else { + possibleMatches.delete(sequence); callback(event); } }); + + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout(possibleMatches.clear.bind(possibleMatches), 1000); }; }