diff --git a/bitchat/ViewModels/ChatDeliveryCoordinator.swift b/bitchat/ViewModels/ChatDeliveryCoordinator.swift index fc9373bf..62492aa2 100644 --- a/bitchat/ViewModels/ChatDeliveryCoordinator.swift +++ b/bitchat/ViewModels/ChatDeliveryCoordinator.swift @@ -238,6 +238,15 @@ private extension ChatDeliveryCoordinator { } if context.messages.count > indexedPublicMessageCount { + // Growth is only a pure append if the previously indexed tail kept + // its position; a middle insertion (out-of-order timestamp arrival) + // shifts it and invalidates every indexed location after the + // insertion point. + if indexedPublicMessageCount > 0, + context.messages[indexedPublicMessageCount - 1].id != indexedPublicTailMessageID { + rebuildMessageLocationIndex() + return true + } for index in indexedPublicMessageCount.. indexedCount else { continue } + // Same append-only check as the public timeline above. + if indexedCount > 0, + messages[indexedCount - 1].id != indexedPrivateTailMessageIDs[peerID] { + rebuildMessageLocationIndex() + return true + } for index in indexedCount..