diff --git a/app/src/main/java/top/yeij/cyrene/viewmodel/OverlayViewModel.kt b/app/src/main/java/top/yeij/cyrene/viewmodel/OverlayViewModel.kt index c17abfd..20c8382 100644 --- a/app/src/main/java/top/yeij/cyrene/viewmodel/OverlayViewModel.kt +++ b/app/src/main/java/top/yeij/cyrene/viewmodel/OverlayViewModel.kt @@ -80,19 +80,16 @@ class OverlayViewModel( chatRepository.observeMessages().collect { message -> _messages.update { list -> val updated = list.toMutableList() - val idx = updated.indexOfLast { it.id == message.id } - if (idx >= 0) { - updated[idx] = message + val existingIdx = updated.indexOfLast { it.id == message.id } + if (existingIdx >= 0) { + updated[existingIdx] = message } else { - val isDup = updated.any { - it.role == message.role && it.content == message.content && it.msgType == message.msgType - } - if (!isDup) { - updated.add(message) - val animIdx = _messageAnimIndex.value.toMutableMap() - animIdx[message.id] = animCounter++ - _messageAnimIndex.value = animIdx - } + // Insert at correct position for ascending timestamp (oldest first for top-down layout) + val insertAt = updated.indexOfFirst { it.timestamp >= message.timestamp } + if (insertAt >= 0) updated.add(insertAt, message) else updated.add(message) + val animIdx = _messageAnimIndex.value.toMutableMap() + animIdx[message.id] = animCounter++ + _messageAnimIndex.value = animIdx } updated.deduplicate() }