MimeTypeImage,
MimeTypeText
} from '$lib/enums/files';
+ import { isIMEComposing } from '$lib/utils/is-ime-composing';
interface Props {
class?: string;
}
async function handleKeydown(event: KeyboardEvent) {
- if (event.key === 'Enter' && !event.shiftKey) {
+ if (event.key === 'Enter' && !event.shiftKey && !isIMEComposing(event)) {
event.preventDefault();
if ((!message.trim() && uploadedFiles.length === 0) || disabled || isLoading) return;
<script lang="ts">
import { getDeletionInfo } from '$lib/stores/chat.svelte';
import { copyToClipboard } from '$lib/utils/copy';
+ import { isIMEComposing } from '$lib/utils/is-ime-composing';
import ChatMessageAssistant from './ChatMessageAssistant.svelte';
import ChatMessageUser from './ChatMessageUser.svelte';
}
function handleEditKeydown(event: KeyboardEvent) {
- if (event.key === 'Enter' && !event.shiftKey) {
+ // Check for IME composition using isComposing property and keyCode 229 (specifically for IME composition on Safari)
+ // This prevents saving edit when confirming IME word selection (e.g., Japanese/Chinese input)
+ if (event.key === 'Enter' && !event.shiftKey && !isIMEComposing(event)) {
event.preventDefault();
handleSaveEdit();
} else if (event.key === 'Escape') {
--- /dev/null
+export function isIMEComposing(event: KeyboardEvent) {
+ // Check for IME composition using isComposing property and keyCode 229 (specifically for IME composition on Safari, which is notorious for not supporting KeyboardEvent.isComposing)
+ // This prevents form submission when confirming IME word selection (e.g., Japanese/Chinese input)
+ return event.isComposing || event.keyCode === 229;
+}