android: fix unread ack to use latest visible message
This commit is contained in:
@@ -700,3 +700,9 @@
|
|||||||
- unregister token on logout,
|
- unregister token on logout,
|
||||||
- handle foreground push payload via existing notification service worker.
|
- 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`.
|
- 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,
|
highlightedMessageId = highlighted,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
acknowledgeLatestIncoming(messages)
|
acknowledgeLatestMessages(messages)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -644,22 +644,20 @@ class ChatViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun acknowledgeLatestIncoming(messages: List<MessageItem>) {
|
private fun acknowledgeLatestMessages(messages: List<MessageItem>) {
|
||||||
val latestIncoming = messages
|
val latestVisible = messages.maxByOrNull { it.id } ?: return
|
||||||
.asReversed()
|
val latestIncoming = messages.asReversed().firstOrNull { !it.isOutgoing }
|
||||||
.firstOrNull { !it.isOutgoing }
|
|
||||||
?: return
|
|
||||||
|
|
||||||
if (lastDeliveredMessageId != latestIncoming.id) {
|
if (latestIncoming != null && lastDeliveredMessageId != latestIncoming.id) {
|
||||||
lastDeliveredMessageId = latestIncoming.id
|
lastDeliveredMessageId = latestIncoming.id
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
markMessageDeliveredUseCase(chatId = chatId, messageId = latestIncoming.id)
|
markMessageDeliveredUseCase(chatId = chatId, messageId = latestIncoming.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (lastReadMessageId != latestIncoming.id) {
|
if (lastReadMessageId != latestVisible.id) {
|
||||||
lastReadMessageId = latestIncoming.id
|
lastReadMessageId = latestVisible.id
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
markMessageReadUseCase(chatId = chatId, messageId = latestIncoming.id)
|
markMessageReadUseCase(chatId = chatId, messageId = latestVisible.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user