From 5372b2594023952cff34aa62253ed4efef15b5dd Mon Sep 17 00:00:00 2001 From: kakkokari-gtyih <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:21:08 +0900 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20=E7=9B=B4=E5=89=8D=E3=81=AE?= =?UTF-8?q?=E3=83=91=E3=82=BF=E3=83=BC=E3=83=B3=E3=82=92=E8=A8=98=E9=8C=B2?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/frontend/src/scripts/hotkey.ts | 34 ++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/frontend/src/scripts/hotkey.ts b/packages/frontend/src/scripts/hotkey.ts index fd79baa604..499e8418b2 100644 --- a/packages/frontend/src/scripts/hotkey.ts +++ b/packages/frontend/src/scripts/hotkey.ts @@ -44,6 +44,10 @@ const MODIFIER_KEYS = ['ctrl', 'alt', 'shift']; const IGNORE_ELEMENTS = ['input', 'textarea']; //#endregion +//#region store +let latestHotkey: Pattern & { callback: CallbackFunction } | null = null; +//#endregion + //#region impl export const makeHotkey = (keymap: Keymap) => { const actions = parseKeymap(keymap); @@ -53,11 +57,12 @@ export const makeHotkey = (keymap: Keymap) => { if (IGNORE_ELEMENTS.includes(document.activeElement.tagName.toLowerCase())) return; if ((document.activeElement as HTMLElement).isContentEditable) return; } - for (const { patterns, callback, options } of actions) { - if (matchPatterns(ev, patterns, options)) { + for (const action of actions) { + if (matchPatterns(ev, action)) { ev.preventDefault(); ev.stopPropagation(); - callback(ev); + action.callback(ev); + storePattern(ev, action.callback); } } }; @@ -102,10 +107,21 @@ const parseOptions = (rawCallback: Keymap[keyof Keymap]) => { return { ...defaultOptions } as const satisfies Action['options']; }; -const matchPatterns = (ev: KeyboardEvent, patterns: Action['patterns'], options: Action['options']) => { +const matchPatterns = (ev: KeyboardEvent, action: Action) => { + const { patterns, options, callback } = action; if (ev.repeat && !options.allowRepeat) return false; const key = ev.key.toLowerCase(); return patterns.some(({ which, ctrl, shift, alt }) => { + if ( + latestHotkey != null && + latestHotkey.which.includes(key) && + latestHotkey.ctrl === ctrl && + latestHotkey.alt === alt && + latestHotkey.shift === shift && + latestHotkey.callback === callback + ) { + return false; + } if (!which.includes(key)) return false; if (ctrl !== (ev.ctrlKey || ev.metaKey)) return false; if (alt !== ev.altKey) return false; @@ -114,6 +130,16 @@ const matchPatterns = (ev: KeyboardEvent, patterns: Action['patterns'], options: }); }; +const storePattern = (ev: KeyboardEvent, callback: CallbackFunction) => { + latestHotkey = { + which: [ev.key.toLowerCase()], + ctrl: ev.ctrlKey || ev.metaKey, + alt: ev.altKey, + shift: ev.shiftKey, + callback, + }; +}; + const parseKeyCode = (input?: string | null) => { if (input == null) return []; const raw = getValueByKey(KEY_ALIASES, input);