From 6138825262f1d25ae853bcada04580af73519661 Mon Sep 17 00:00:00 2001 From: Professional Date: Sat, 24 May 2025 02:39:39 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/ChatView.vue | 56 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/views/ChatView.vue b/src/views/ChatView.vue index 069269e..5a83797 100644 --- a/src/views/ChatView.vue +++ b/src/views/ChatView.vue @@ -396,6 +396,21 @@ const sendMessage = () => { text: newMessageText.value, conversationId: conversationId.value, }; + + // Создаем временное сообщение с локальным ID и статусом "отправляется" + const tempMessage = { + _id: `temp-${Date.now()}`, + tempId: `temp-${Date.now()}`, // используем tempId для идентификации временного сообщения + conversationId: conversationId.value, + sender: currentUser.value, // Используем полный объект текущего пользователя + text: newMessageText.value, + createdAt: new Date(), + status: 'sending' // Устанавливаем начальный статус "отправляется" + }; + + // Добавляем временное сообщение в массив + messages.value.push(tempMessage); + scrollToBottom(); console.log('[ChatView] Отправка сообщения через сокет:', messageData); sendingMessage.value = true; @@ -407,15 +422,30 @@ const sendMessage = () => { const handleNewMessage = (message) => { console.log('[ChatView] Получено новое сообщение:', message); + if (message.conversationId === conversationId.value) { - messages.value.push(message); + // Проверяем, является ли это сообщение подтверждением отправки ранее добавленного временного сообщения + if (message.sender?._id === currentUser.value?._id) { + // Находим и удаляем все временные сообщения (они могут накапливаться при быстрой отправке) + messages.value = messages.value.filter(msg => !msg.tempId); + } + + // Проверяем, есть ли поле status в сообщении, если нет - добавляем + if (!message.status) { + message.status = 'delivered'; + } + + // Добавляем полученное сообщение + messages.value.push(message); scrollToBottom(); + // Если сообщение от другого пользователя и окно активно - помечаем как прочитанное if (message.sender?._id !== currentUser.value?._id && document.hasFocus()) { markMessagesAsReadOnServer(); } } - sendingMessage.value = false; + + sendingMessage.value = false; }; const handleMessageDeletedBySocket = (data) => { @@ -1192,6 +1222,28 @@ const handleClickOutsideContextMenu = (event) => { color: #dc3545; } +/* Индикаторы статуса сообщений */ +.message-status { + font-size: 0.8rem; + display: flex; + align-items: center; + opacity: 0.9; + color: inherit; +} + +.message-status i { + font-size: 12px; /* Уменьшаем размер иконок статуса */ +} + +/* Стили для разных статусов */ +.bi-clock { + opacity: 0.8; +} + +.bi-check2-all { + color: #4dabf7; /* Синий цвет для прочитанных сообщений */ +} + /* Адаптивные стили */ @media (max-width: 576px) { .message-wrapper {