diff --git a/apps/web/src/views/ConversationsView.vue b/apps/web/src/views/ConversationsView.vue index 94a9364..7dbcd9c 100644 --- a/apps/web/src/views/ConversationsView.vue +++ b/apps/web/src/views/ConversationsView.vue @@ -329,25 +329,33 @@ async function confirmDeleteMessage(msg: ChatMessage) { } } +function isMobileComposer() { + return typeof window !== 'undefined' && window.matchMedia('(max-width: 900px)').matches; +} + +function insertComposerNewline() { + const el = draftInputEl.value; + if (!el) { + draft.value += '\n'; + return; + } + const start = el.selectionStart ?? draft.value.length; + const end = el.selectionEnd ?? start; + draft.value = draft.value.slice(0, start) + '\n' + draft.value.slice(end); + nextTick(() => { + const pos = start + 1; + el.focus(); + el.setSelectionRange(pos, pos); + }); +} + function onComposerKeydown(event: KeyboardEvent) { if (event.key !== 'Enter') return; + // موبایل: Enter = خط بعد؛ ارسال فقط با دکمه ارسال + if (isMobileComposer()) return; if (event.ctrlKey || event.metaKey) { - // Ctrl/Cmd+Enter → newline event.preventDefault(); - const el = draftInputEl.value; - if (!el) { - draft.value += '\n'; - return; - } - const start = el.selectionStart ?? draft.value.length; - const end = el.selectionEnd ?? start; - const next = draft.value.slice(0, start) + '\n' + draft.value.slice(end); - draft.value = next; - nextTick(() => { - const pos = start + 1; - el.focus(); - el.setSelectionRange(pos, pos); - }); + insertComposerNewline(); return; } if (event.shiftKey) return; @@ -1107,7 +1115,7 @@ onUnmounted(() => { rows="1" :placeholder="editingMessageId ? 'ویرایش پیام…' : 'پیام بنویسید…'" autocomplete="off" - enterkeyhint="send" + enterkeyhint="enter" :disabled="sending || recording" @focus="emojiOpen = false" @keydown="onComposerKeydown"