mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 01:05:19 +00:00
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:
@@ -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
|
||||||
// Force UI update
|
roomMessages[room] = roomMsgs
|
||||||
DispatchQueue.main.async { [weak self] in
|
|
||||||
self?.objectWillChange.send()
|
// Force UI update
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
self?.objectWillChange.send()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user