fix(android): preload message reactions on chat open
Some checks failed
Android CI / android (push) Failing after 5m51s
Android Release / release (push) Has started running
CI / test (push) Has been cancelled

This commit is contained in:
Codex
2026-03-10 20:33:50 +03:00
parent 842a9d2093
commit 23d636be7e

View File

@@ -68,6 +68,7 @@ class ChatViewModel @Inject constructor(
private val visibleMessagesLimit = MutableStateFlow(MESSAGES_PAGE_SIZE)
private var lastDeliveredMessageId: Long? = null
private var lastReadMessageId: Long? = null
private val reactionsRequestedMessageIds = mutableSetOf<Long>()
init {
activeChatTracker.setActiveChat(chatId)
@@ -562,13 +563,14 @@ class ChatViewModel @Inject constructor(
visibleMessagesLimit
.flatMapLatest { limit -> observeMessagesUseCase(chatId = chatId, limit = limit) }
.collectLatest { messages ->
val sortedMessages = messages.sortedBy { msg -> msg.id }
_uiState.update {
val pinnedId = it.pinnedMessageId
val normalized = it.inlineSearchQuery.trim().lowercase()
val inlineMatches = if (normalized.isBlank()) {
emptyList()
} else {
messages
sortedMessages
.filter { msg -> (msg.text ?: "").lowercase().contains(normalized) }
.map { msg -> msg.id }
}
@@ -579,13 +581,14 @@ class ChatViewModel @Inject constructor(
}
it.copy(
isLoading = false,
messages = messages.sortedBy { msg -> msg.id },
pinnedMessage = pinnedId?.let { id -> messages.firstOrNull { msg -> msg.id == id } },
messages = sortedMessages,
pinnedMessage = pinnedId?.let { id -> sortedMessages.firstOrNull { msg -> msg.id == id } },
inlineSearchMatches = inlineMatches,
highlightedMessageId = highlighted,
)
}
acknowledgeLatestMessages(messages)
preloadReactions(sortedMessages)
acknowledgeLatestMessages(sortedMessages)
}
}
}
@@ -659,6 +662,28 @@ class ChatViewModel @Inject constructor(
}
}
private fun preloadReactions(messages: List<MessageItem>) {
val toRequest = messages
.asReversed()
.map { it.id }
.filter { reactionsRequestedMessageIds.add(it) }
if (toRequest.isEmpty()) return
toRequest.forEach { messageId ->
viewModelScope.launch {
when (val result = listMessageReactionsUseCase(messageId = messageId)) {
is AppResult.Success -> {
_uiState.update {
it.copy(reactionByMessageId = it.reactionByMessageId + (messageId to result.data))
}
}
is AppResult.Error -> Unit
}
}
}
}
private fun acknowledgeLatestMessages(messages: List<MessageItem>) {
val latestIncoming = messages.asReversed().firstOrNull { !it.isOutgoing }