android: fix unread ack to use latest visible message
This commit is contained in:
@@ -700,3 +700,9 @@
|
||||
- unregister token on logout,
|
||||
- handle foreground push payload via existing notification service worker.
|
||||
- Added required env keys to `web/.env.example` and backend Firebase env keys to root `.env.example`.
|
||||
|
||||
### Step 106 - Unread counter stabilization in Chat screen
|
||||
- Fixed read acknowledgement strategy in `ChatViewModel`:
|
||||
- read status is now acknowledged by the latest visible message id in chat (not only latest incoming),
|
||||
- delivery status still uses latest incoming message.
|
||||
- This removes cases where unread badge reappears after chat list refresh because the previous read ack used an outdated incoming id.
|
||||
|
||||
@@ -571,7 +571,7 @@ class ChatViewModel @Inject constructor(
|
||||
highlightedMessageId = highlighted,
|
||||
)
|
||||
}
|
||||
acknowledgeLatestIncoming(messages)
|
||||
acknowledgeLatestMessages(messages)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -644,22 +644,20 @@ class ChatViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun acknowledgeLatestIncoming(messages: List<MessageItem>) {
|
||||
val latestIncoming = messages
|
||||
.asReversed()
|
||||
.firstOrNull { !it.isOutgoing }
|
||||
?: return
|
||||
private fun acknowledgeLatestMessages(messages: List<MessageItem>) {
|
||||
val latestVisible = messages.maxByOrNull { it.id } ?: return
|
||||
val latestIncoming = messages.asReversed().firstOrNull { !it.isOutgoing }
|
||||
|
||||
if (lastDeliveredMessageId != latestIncoming.id) {
|
||||
if (latestIncoming != null && lastDeliveredMessageId != latestIncoming.id) {
|
||||
lastDeliveredMessageId = latestIncoming.id
|
||||
viewModelScope.launch {
|
||||
markMessageDeliveredUseCase(chatId = chatId, messageId = latestIncoming.id)
|
||||
}
|
||||
}
|
||||
if (lastReadMessageId != latestIncoming.id) {
|
||||
lastReadMessageId = latestIncoming.id
|
||||
if (lastReadMessageId != latestVisible.id) {
|
||||
lastReadMessageId = latestVisible.id
|
||||
viewModelScope.launch {
|
||||
markMessageReadUseCase(chatId = chatId, messageId = latestIncoming.id)
|
||||
markMessageReadUseCase(chatId = chatId, messageId = latestVisible.id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user