fix: align OverlayViewModel message dedup with ChatViewModel

Removed the legacy isDup check (role+content+msgType) that could suppress
multi_message items already seen as review items. Now deduplicates by
message ID only and inserts at correct timestamp position, matching
the fixed ChatViewModel behavior.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 18:40:57 +08:00
parent 91231834dc
commit 86d196b857
@@ -80,19 +80,16 @@ class OverlayViewModel(
chatRepository.observeMessages().collect { message -> chatRepository.observeMessages().collect { message ->
_messages.update { list -> _messages.update { list ->
val updated = list.toMutableList() val updated = list.toMutableList()
val idx = updated.indexOfLast { it.id == message.id } val existingIdx = updated.indexOfLast { it.id == message.id }
if (idx >= 0) { if (existingIdx >= 0) {
updated[idx] = message updated[existingIdx] = message
} else { } else {
val isDup = updated.any { // Insert at correct position for ascending timestamp (oldest first for top-down layout)
it.role == message.role && it.content == message.content && it.msgType == message.msgType val insertAt = updated.indexOfFirst { it.timestamp >= message.timestamp }
} if (insertAt >= 0) updated.add(insertAt, message) else updated.add(message)
if (!isDup) { val animIdx = _messageAnimIndex.value.toMutableMap()
updated.add(message) animIdx[message.id] = animCounter++
val animIdx = _messageAnimIndex.value.toMutableMap() _messageAnimIndex.value = animIdx
animIdx[message.id] = animCounter++
_messageAnimIndex.value = animIdx
}
} }
updated.deduplicate() updated.deduplicate()
} }