This commit is contained in:
Professional 2025-05-24 02:39:39 +07:00
parent 49eaf17c34
commit 6138825262

View File

@ -397,6 +397,21 @@ const sendMessage = () => {
conversationId: conversationId.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); console.log('[ChatView] Отправка сообщения через сокет:', messageData);
sendingMessage.value = true; sendingMessage.value = true;
socket.emit('sendMessage', messageData); socket.emit('sendMessage', messageData);
@ -407,14 +422,29 @@ const sendMessage = () => {
const handleNewMessage = (message) => { const handleNewMessage = (message) => {
console.log('[ChatView] Получено новое сообщение:', message); console.log('[ChatView] Получено новое сообщение:', message);
if (message.conversationId === conversationId.value) { if (message.conversationId === conversationId.value) {
// Проверяем, является ли это сообщение подтверждением отправки ранее добавленного временного сообщения
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); messages.value.push(message);
scrollToBottom(); scrollToBottom();
// Если сообщение от другого пользователя и окно активно - помечаем как прочитанное
if (message.sender?._id !== currentUser.value?._id && document.hasFocus()) { if (message.sender?._id !== currentUser.value?._id && document.hasFocus()) {
markMessagesAsReadOnServer(); markMessagesAsReadOnServer();
} }
} }
sendingMessage.value = false; sendingMessage.value = false;
}; };
@ -1192,6 +1222,28 @@ const handleClickOutsideContextMenu = (event) => {
color: #dc3545; 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) { @media (max-width: 576px) {
.message-wrapper { .message-wrapper {