Fix read receipts being overwritten by delivery ACKs

- Added logic to prevent downgrading from 'read' status to 'delivered'
- When an ACK arrives after a read receipt, the read status is preserved
- This fixes the issue where blue checkmarks briefly appear then revert to green
- Applied fix to all message types (main, private, room)
This commit is contained in:
jack
2025-07-06 22:52:10 +02:00
parent 8b79721725
commit d892c790a7
+42 -16
View File
@@ -2187,23 +2187,46 @@ extension ChatViewModel: BitchatDelegate {
private func updateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) { private func updateMessageDeliveryStatus(_ messageID: String, status: DeliveryStatus) {
print("[Delivery] Updating message \(messageID) to status: \(status)") print("[Delivery] Updating message \(messageID) to status: \(status)")
// Helper function to check if we should skip this update
func shouldSkipUpdate(currentStatus: DeliveryStatus?, newStatus: DeliveryStatus) -> Bool {
guard let current = currentStatus else { return false }
// Don't downgrade from read to delivered
switch (current, newStatus) {
case (.read, .delivered):
print("[Delivery] Skipping update - message already marked as read")
return true
case (.read, .sent):
print("[Delivery] Skipping update - message already marked as read")
return true
default:
return false
}
}
// Update in main messages // Update in main messages
if let index = messages.firstIndex(where: { $0.id == messageID }) { if let index = messages.firstIndex(where: { $0.id == messageID }) {
var updatedMessage = messages[index] let currentStatus = messages[index].deliveryStatus
updatedMessage.deliveryStatus = status if !shouldSkipUpdate(currentStatus: currentStatus, newStatus: status) {
messages[index] = updatedMessage var updatedMessage = messages[index]
print("[Delivery] Updated message in main messages") updatedMessage.deliveryStatus = status
messages[index] = updatedMessage
print("[Delivery] Updated message in main messages")
}
} }
// Update in private chats // Update in private chats
var updatedPrivateChats = privateChats var updatedPrivateChats = privateChats
for (peerID, var chatMessages) in updatedPrivateChats { for (peerID, var chatMessages) in updatedPrivateChats {
if let index = chatMessages.firstIndex(where: { $0.id == messageID }) { if let index = chatMessages.firstIndex(where: { $0.id == messageID }) {
var updatedMessage = chatMessages[index] let currentStatus = chatMessages[index].deliveryStatus
updatedMessage.deliveryStatus = status if !shouldSkipUpdate(currentStatus: currentStatus, newStatus: status) {
chatMessages[index] = updatedMessage var updatedMessage = chatMessages[index]
updatedPrivateChats[peerID] = chatMessages updatedMessage.deliveryStatus = status
print("[Delivery] Updated message in private chat with \(peerID)") chatMessages[index] = updatedMessage
updatedPrivateChats[peerID] = chatMessages
print("[Delivery] Updated message in private chat with \(peerID)")
}
} }
} }
@@ -2217,14 +2240,17 @@ extension ChatViewModel: BitchatDelegate {
// Update in room messages // Update in room messages
for (room, var roomMsgs) in roomMessages { for (room, var roomMsgs) in roomMessages {
if let index = roomMsgs.firstIndex(where: { $0.id == messageID }) { if let index = roomMsgs.firstIndex(where: { $0.id == messageID }) {
var updatedMessage = roomMsgs[index] let currentStatus = roomMsgs[index].deliveryStatus
updatedMessage.deliveryStatus = status if !shouldSkipUpdate(currentStatus: currentStatus, newStatus: status) {
roomMsgs[index] = updatedMessage var updatedMessage = roomMsgs[index]
roomMessages[room] = roomMsgs updatedMessage.deliveryStatus = status
roomMsgs[index] = updatedMessage
roomMessages[room] = roomMsgs
// Force UI update // Force UI update
DispatchQueue.main.async { [weak self] in DispatchQueue.main.async { [weak self] in
self?.objectWillChange.send() self?.objectWillChange.send()
}
} }
} }
} }