From 5789f89a3f6bed8a9f40447a73e75b81b277b1c8 Mon Sep 17 00:00:00 2001 From: greymoth Date: Mon, 6 Jul 2026 00:37:52 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=8F=20fix:=20guard=20IME=20composition?= =?UTF-8?q?=20on=20Enter=20in=20prompt=20name/labels=20and=20dynamic=20tag?= =?UTF-8?q?=20inputs=20(#13996)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🌏 fix: guard IME composition on Enter in prompt name/labels and dynamic tag inputs * style: sort imports in DynamicTags per repo import-order convention --------- Co-authored-by: greymoth <246701683+greymoth-jp@users.noreply.github.com> --- client/src/components/Prompts/fields/PromptName.tsx | 3 ++- client/src/components/Prompts/forms/PromptLabelsForm.tsx | 7 ++++++- client/src/components/SidePanel/Parameters/DynamicTags.tsx | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/client/src/components/Prompts/fields/PromptName.tsx b/client/src/components/Prompts/fields/PromptName.tsx index 57b37d4a5e..240249d5a1 100644 --- a/client/src/components/Prompts/fields/PromptName.tsx +++ b/client/src/components/Prompts/fields/PromptName.tsx @@ -53,7 +53,8 @@ const PromptName: React.FC = ({ name, isLoading = false, isError = false, setNewName(name); setIsEditing(false); } - if (e.key === 'Enter') { + // Ignore the Enter that commits an IME composition (see useTextarea.ts). + if (e.key === 'Enter' && !(e.nativeEvent.isComposing || e.keyCode === 229)) { e.preventDefault(); skipBlurRef.current = true; commitName(); diff --git a/client/src/components/Prompts/forms/PromptLabelsForm.tsx b/client/src/components/Prompts/forms/PromptLabelsForm.tsx index 1aa47c5eea..6c8088a212 100644 --- a/client/src/components/Prompts/forms/PromptLabelsForm.tsx +++ b/client/src/components/Prompts/forms/PromptLabelsForm.tsx @@ -16,7 +16,12 @@ const PromptLabelsForm = ({ selectedPrompt }: { selectedPrompt?: TPrompt }) => { }; const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' && labelInput.trim()) { + // Ignore the Enter that commits an IME composition (see useTextarea.ts). + if ( + e.key === 'Enter' && + !(e.nativeEvent.isComposing || e.keyCode === 229) && + labelInput.trim() + ) { const newLabels = [...labels, labelInput.trim()]; setLabels(newLabels); setLabelInput(''); diff --git a/client/src/components/SidePanel/Parameters/DynamicTags.tsx b/client/src/components/SidePanel/Parameters/DynamicTags.tsx index bda6176414..6b8300e5d0 100644 --- a/client/src/components/SidePanel/Parameters/DynamicTags.tsx +++ b/client/src/components/SidePanel/Parameters/DynamicTags.tsx @@ -1,6 +1,6 @@ import { useState, useMemo, useCallback, useRef } from 'react'; -import type { DynamicSettingProps } from 'librechat-data-provider'; import { Label, Input, HoverCard, HoverCardTrigger, Tag, useToastContext } from '@librechat/client'; +import type { DynamicSettingProps } from 'librechat-data-provider'; import { TranslationKeys, useLocalize, useParameterEffects } from '~/hooks'; import { useChatContext } from '~/Providers'; import OptionHover from './OptionHover'; @@ -155,7 +155,8 @@ function DynamicTags({ if (e.key === 'Backspace' && !tagText) { onTagRemove(currentTags.length - 1); } - if (e.key === 'Enter') { + // Ignore the Enter that commits an IME composition (see useTextarea.ts). + if (e.key === 'Enter' && !(e.nativeEvent.isComposing || e.keyCode === 229)) { onTagAdd(); } }}