Исправление работы доставки, прочтения сообщений

This commit is contained in:
Халимов Рустам
2026-04-20 22:17:29 +03:00
parent fc1cf1fd6e
commit 962323814c
13 changed files with 99 additions and 24 deletions
@@ -350,10 +350,19 @@ class ChatDetailViewModel @Inject constructor(
_state.update { it.copy(isTyping = false) }
}
is ChatEvent.MessagesRead -> {
val currentUserId = getCurrentUserId()
_state.update { currentState ->
val updatedMessages = currentState.messages.map { msg ->
if (msg.sequenceId <= event.lastReadSequenceId) {
msg.copy(isRead = true)
// Обновляем isRead на основе readBy
val isRead = if (msg.senderId == currentUserId) {
// Своё сообщение: прочитано, если кто-то кроме отправителя в readBy
event.userId != currentUserId
} else {
// Чужое сообщение: прочитано, если текущий пользователь в readBy
event.userId == currentUserId
}
msg.copy(isRead = isRead)
} else msg
}
currentState.copy(messages = updatedMessages)
@@ -391,8 +400,9 @@ class ChatDetailViewModel @Inject constructor(
val messages = _state.value.messages
if (messages.isEmpty()) return
// В нашем reverseLayout (newest first) первое сообщение - самое новое от собеседника
val currentUserId = getCurrentUserId()
// Находим последнее сообщение от собеседника
val lastMessageFromOther = messages.firstOrNull { it.senderId != currentUserId } ?: return
viewModelScope.launch {
@@ -400,16 +410,21 @@ class ChatDetailViewModel @Inject constructor(
// Мгновенно обновляем в памяти для "галочек"
_state.update { currentState ->
val updatedMessages = currentState.messages.map { msg ->
// Для чужих сообщений помечаем как прочитанные, если sequenceId <= последнего сообщения от собеседника
if (msg.senderId != currentUserId && msg.sequenceId <= lastMessageFromOther.sequenceId) {
msg.copy(isRead = true)
} else msg
}
currentState.copy(messages = updatedMessages)
}
// Отправляем на сервер
repository.markMessagesAsRead(chatId, lastMessageFromOther.id, lastMessageFromOther.sequenceId)
// Обновляем через SignalR observer для получения актуальных данных
signalrNotificationObserver.refresh()
} catch (e: Exception) {
// Ignore
android.util.Log.e("ChatDetailVM", "markAsRead failed", e)
}
}
}