From 7e84655186dfd7259e676408b04b6d7bd59c1bde Mon Sep 17 00:00:00 2001 From: JaeSeoKim Date: Mon, 27 Jan 2025 14:03:21 +0900 Subject: [PATCH 1/2] Fix unintended double triggering of key bindings during IME composition --- cmdk/src/index.tsx | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cmdk/src/index.tsx b/cmdk/src/index.tsx index 86a55a2..12d17ea 100644 --- a/cmdk/src/index.tsx +++ b/cmdk/src/index.tsx @@ -576,7 +576,13 @@ const Command = React.forwardRef((props, forwarded onKeyDown={(e) => { etc.onKeyDown?.(e) - if (!e.defaultPrevented) { + // Check if IME composition is finished before triggering key binds + // This prevents unwanted triggering while user is still inputting text with IME + // e.keyCode === 229 is for the CJK IME with Legacy Browser [https://w3c.github.io/uievents/#determine-keydown-keyup-keyCode] + // isComposing is for the CJK IME with Modern Browser [https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent/isComposing] + const isComposing = e.nativeEvent.isComposing || e.keyCode === 229 + + if (!e.defaultPrevented || !isComposing) { switch (e.key) { case 'n': case 'j': { @@ -615,18 +621,12 @@ const Command = React.forwardRef((props, forwarded break } case 'Enter': { - // Check if IME composition is finished before triggering onSelect - // This prevents unwanted triggering while user is still inputting text with IME - // e.keyCode === 229 is for the Japanese IME and Safari. - // isComposing does not work with Japanese IME and Safari combination. - if (!e.nativeEvent.isComposing && e.keyCode !== 229) { - // Trigger item onSelect - e.preventDefault() - const item = getSelectedItem() - if (item) { - const event = new Event(SELECT_EVENT) - item.dispatchEvent(event) - } + // Trigger item onSelect + e.preventDefault() + const item = getSelectedItem() + if (item) { + const event = new Event(SELECT_EVENT) + item.dispatchEvent(event) } } } From e245360a14c4b027251233692a916097f0e6bf5b Mon Sep 17 00:00:00 2001 From: Paco <34928425+pacocoursey@users.noreply.github.com> Date: Fri, 14 Mar 2025 12:06:58 -0700 Subject: [PATCH 2/2] fix conditional --- cmdk/src/index.tsx | 86 ++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/cmdk/src/index.tsx b/cmdk/src/index.tsx index a0dcc5c..3131c7b 100644 --- a/cmdk/src/index.tsx +++ b/cmdk/src/index.tsx @@ -585,52 +585,54 @@ const Command = React.forwardRef((props, forwarded // isComposing is for the CJK IME with Modern Browser [https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent/isComposing] const isComposing = e.nativeEvent.isComposing || e.keyCode === 229 - if (!e.defaultPrevented || !isComposing) { - switch (e.key) { - case 'n': - case 'j': { - // vim keybind down - if (vimBindings && e.ctrlKey) { - next(e) - } - break - } - case 'ArrowDown': { + if (e.defaultPrevented || isComposing) { + return + } + + switch (e.key) { + case 'n': + case 'j': { + // vim keybind down + if (vimBindings && e.ctrlKey) { next(e) - break } - case 'p': - case 'k': { - // vim keybind up - if (vimBindings && e.ctrlKey) { - prev(e) - } - break - } - case 'ArrowUp': { + break + } + case 'ArrowDown': { + next(e) + break + } + case 'p': + case 'k': { + // vim keybind up + if (vimBindings && e.ctrlKey) { prev(e) - break } - case 'Home': { - // First item - e.preventDefault() - updateSelectedToIndex(0) - break - } - case 'End': { - // Last item - e.preventDefault() - last() - break - } - case 'Enter': { - // Trigger item onSelect - e.preventDefault() - const item = getSelectedItem() - if (item) { - const event = new Event(SELECT_EVENT) - item.dispatchEvent(event) - } + break + } + case 'ArrowUp': { + prev(e) + break + } + case 'Home': { + // First item + e.preventDefault() + updateSelectedToIndex(0) + break + } + case 'End': { + // Last item + e.preventDefault() + last() + break + } + case 'Enter': { + // Trigger item onSelect + e.preventDefault() + const item = getSelectedItem() + if (item) { + const event = new Event(SELECT_EVENT) + item.dispatchEvent(event) } } }