From af5304801332cb2977cb922df299cba7d8f46d46 Mon Sep 17 00:00:00 2001 From: benya Date: Sun, 5 Apr 2026 14:57:02 +0300 Subject: [PATCH] fix: improve realtime read receipt reconciliation fix: apply read state up to server last_read_message_id --- .../messenger/data/message/local/dao/MessageDao.kt | 12 ++++++++++++ .../realtime/usecase/HandleRealtimeEventsUseCase.kt | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/ru/daemonlord/messenger/data/message/local/dao/MessageDao.kt b/android/app/src/main/java/ru/daemonlord/messenger/data/message/local/dao/MessageDao.kt index 9dc6c77..93fd05c 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/data/message/local/dao/MessageDao.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/data/message/local/dao/MessageDao.kt @@ -89,6 +89,18 @@ interface MessageDao { ) suspend fun updateMessageStatus(messageId: Long, status: String?) + @Query( + """ + UPDATE messages + SET status = :status + WHERE chat_id = :chatId + AND id > 0 + AND id <= :messageId + AND status IS NOT NULL + """ + ) + suspend fun updateMessageStatusesUpTo(chatId: Long, messageId: Long, status: String) + @Transaction suspend fun clearAndReplaceMessages( chatId: Long, diff --git a/android/app/src/main/java/ru/daemonlord/messenger/domain/realtime/usecase/HandleRealtimeEventsUseCase.kt b/android/app/src/main/java/ru/daemonlord/messenger/domain/realtime/usecase/HandleRealtimeEventsUseCase.kt index 03eab5a..b85c07b 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/domain/realtime/usecase/HandleRealtimeEventsUseCase.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/domain/realtime/usecase/HandleRealtimeEventsUseCase.kt @@ -200,8 +200,14 @@ class HandleRealtimeEventsUseCase @Inject constructor( } is RealtimeEvent.MessageRead -> { + val resolvedReadMessageId = event.lastReadMessageId ?: event.messageId + messageDao.updateMessageStatusesUpTo( + chatId = event.chatId, + messageId = resolvedReadMessageId, + status = "read", + ) messageDao.updateMessageStatus( - messageId = event.messageId, + messageId = resolvedReadMessageId, status = "read", ) if (activeChatTracker.activeChatId.value == event.chatId) {