From 189fb28bf94a88fb207b6ba749a34c6de69d4bcd Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 6 Mar 2026 08:33:10 -0800 Subject: [PATCH] fix(app): ignore Enter key while IME composition is active --- .../src/pages/layout/inline-editor.test.ts | 56 +++++++++++++++++++ .../app/src/pages/layout/inline-editor.tsx | 4 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 packages/app/src/pages/layout/inline-editor.test.ts diff --git a/packages/app/src/pages/layout/inline-editor.test.ts b/packages/app/src/pages/layout/inline-editor.test.ts new file mode 100644 index 000000000000..ad57a10c123f --- /dev/null +++ b/packages/app/src/pages/layout/inline-editor.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, test } from "bun:test" +import { createInlineEditorController } from "./inline-editor" + +describe("createInlineEditorController editorKeyDown", () => { + test("does not submit when Enter confirms IME composition", () => { + const controller = createInlineEditorController() + controller.openEditor("line-1", "こんにちは") + + let saved: string | undefined + let prevented = false + + controller.editorKeyDown( + { + key: "Enter", + isComposing: true, + keyCode: 229, + preventDefault: () => { + prevented = true + }, + } as unknown as KeyboardEvent, + (next) => { + saved = next + }, + ) + + expect(prevented).toBe(false) + expect(saved).toBeUndefined() + expect(controller.editorOpen("line-1")).toBe(true) + }) + + test("submits on Enter when not composing", () => { + const controller = createInlineEditorController() + controller.openEditor("line-1", " value ") + + let saved: string | undefined + let prevented = false + + controller.editorKeyDown( + { + key: "Enter", + isComposing: false, + keyCode: 13, + preventDefault: () => { + prevented = true + }, + } as unknown as KeyboardEvent, + (next) => { + saved = next + }, + ) + + expect(prevented).toBe(true) + expect(saved).toBe("value") + expect(controller.editorOpen("line-1")).toBe(false) + }) +}) diff --git a/packages/app/src/pages/layout/inline-editor.tsx b/packages/app/src/pages/layout/inline-editor.tsx index 4189e4a72a08..4cae1c202fe6 100644 --- a/packages/app/src/pages/layout/inline-editor.tsx +++ b/packages/app/src/pages/layout/inline-editor.tsx @@ -28,7 +28,9 @@ export function createInlineEditorController() { } const editorKeyDown = (event: KeyboardEvent, callback: (next: string) => void) => { - if (event.key === "Enter") { + const isImeConfirm = event.isComposing || event.keyCode === 229 + + if (event.key === "Enter" && !isImeConfirm) { event.preventDefault() saveEditor(callback) return