From 900ff57a155bf65b1d6e5f19e7863b4fa28fa6a3 Mon Sep 17 00:00:00 2001 From: tony140407 Date: Tue, 14 Apr 2026 16:28:00 +0800 Subject: [PATCH] fix: prevent IME composition Enter from triggering submit actions CJK input methods (Chinese Zhuyin, Japanese IME, Korean) use Enter to confirm character selection during composition. This conflicts with Enter-to-submit handlers across the app, causing premature submissions. Add isComposing + keyCode 229 checks to 5 locations: - Comment create and edit forms - GPT assistant prompt input - Link edit view and link selector in editor Addresses: #5485, #7022 Related: #7084, #8425 Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/web/core/components/comments/card/edit-form.tsx | 2 ++ apps/web/core/components/comments/comment-create.tsx | 2 ++ apps/web/core/components/core/modals/gpt-assistant-popover.tsx | 2 ++ packages/editor/src/core/components/links/link-edit-view.tsx | 2 ++ .../src/core/components/menus/bubble-menu/link-selector.tsx | 2 ++ 5 files changed, 10 insertions(+) diff --git a/apps/web/core/components/comments/card/edit-form.tsx b/apps/web/core/components/comments/card/edit-form.tsx index 9be8b135521..654538223a4 100644 --- a/apps/web/core/components/comments/card/edit-form.tsx +++ b/apps/web/core/components/comments/card/edit-form.tsx @@ -77,6 +77,8 @@ export const CommentCardEditForm = observer(function CommentCardEditForm(props:
{ + // Prevent IME composition Enter from triggering submit + if (e.nativeEvent.isComposing || e.keyCode === 229) return; if (e.key === "Enter" && !e.shiftKey && !e.ctrlKey && !e.metaKey && !isEmpty) handleSubmit(onEnter)(e); }} > diff --git a/apps/web/core/components/comments/comment-create.tsx b/apps/web/core/components/comments/comment-create.tsx index d230a5be93e..057cd44d0d2 100644 --- a/apps/web/core/components/comments/comment-create.tsx +++ b/apps/web/core/components/comments/comment-create.tsx @@ -94,6 +94,8 @@ export const CommentCreate = observer(function CommentCreate(props: TCommentCrea
{ + // Prevent IME composition Enter from triggering submit + if (e.nativeEvent.isComposing || e.keyCode === 229) return; if ( e.key === "Enter" && !e.shiftKey && diff --git a/apps/web/core/components/core/modals/gpt-assistant-popover.tsx b/apps/web/core/components/core/modals/gpt-assistant-popover.tsx index 8b932742c4e..a15fed15543 100644 --- a/apps/web/core/components/core/modals/gpt-assistant-popover.tsx +++ b/apps/web/core/components/core/modals/gpt-assistant-popover.tsx @@ -153,6 +153,8 @@ export function GptAssistantPopover(props: Props) { useEffect(() => { const handleEnterKeyPress = (event: KeyboardEvent) => { + // Prevent IME composition Enter from triggering submit + if (event.isComposing || event.keyCode === 229) return; if (event.key === "Enter" && !event.shiftKey) { event.preventDefault(); handleSubmit(handleAIResponse)(); diff --git a/packages/editor/src/core/components/links/link-edit-view.tsx b/packages/editor/src/core/components/links/link-edit-view.tsx index 3adbefa27cd..54cb9b8ea4f 100644 --- a/packages/editor/src/core/components/links/link-edit-view.tsx +++ b/packages/editor/src/core/components/links/link-edit-view.tsx @@ -123,6 +123,8 @@ export function LinkEditView({ viewProps }: LinkEditViewProps) { const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { + // Prevent IME composition Enter from triggering submit + if (e.nativeEvent.isComposing || e.keyCode === 229) return; if (e.key === "Enter") { e.stopPropagation(); if (applyChanges()) { diff --git a/packages/editor/src/core/components/menus/bubble-menu/link-selector.tsx b/packages/editor/src/core/components/menus/bubble-menu/link-selector.tsx index 0745059389d..64a2579bcca 100644 --- a/packages/editor/src/core/components/menus/bubble-menu/link-selector.tsx +++ b/packages/editor/src/core/components/menus/bubble-menu/link-selector.tsx @@ -84,6 +84,8 @@ export function BubbleMenuLinkSelector(props: Props) { defaultValue={editor.getAttributes("link").href || ""} onKeyDown={(e) => { setError(false); + // Prevent IME composition Enter from triggering submit + if (e.nativeEvent.isComposing || e.keyCode === 229) return; if (e.key === "Enter") { e.preventDefault(); handleLinkSubmit();