fix(android): preload message reactions on chat open
This commit is contained in:
@@ -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 }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user