Исправление работы доставки, прочтения сообщений
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user