From fbe779e6849de26ef9e76d96ddc26f04502aca85 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 6 Jul 2025 22:37:59 +0200 Subject: [PATCH] Fix read receipts and improve UI - Changed back to bold blue double checkmarks for read status - Send read receipts for both 'sent' and 'delivered' status messages - Added onChange handler to send read receipts whenever switching to a private chat - Made markPrivateMessagesAsRead public so it can be called from views - This ensures read receipts are sent when opening a chat from notifications or any other way --- bitchat/ViewModels/ChatViewModel.swift | 6 +++--- bitchat/Views/ContentView.swift | 14 +++++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 0f53456a..972ec362 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -895,7 +895,7 @@ class ChatViewModel: ObservableObject { selectedPrivateChatPeer = nil } - private func markPrivateMessagesAsRead(from peerID: String) { + func markPrivateMessagesAsRead(from peerID: String) { guard let messages = privateChats[peerID] else { print("[Delivery] No messages found for peer \(peerID)") return @@ -912,8 +912,8 @@ class ChatViewModel: ObservableObject { if message.senderPeerID == peerID { if let status = message.deliveryStatus { switch status { - case .delivered: - // Create and send read receipt + case .sent, .delivered: + // Create and send read receipt for sent or delivered messages // Use the senderPeerID from the message to ensure it goes to the right peer if let messageSenderID = message.senderPeerID { let receipt = ReadReceipt( diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 4af2b7fe..21746cf1 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -528,6 +528,12 @@ struct ContentView: View { } } } + .onChange(of: viewModel.selectedPrivateChatPeer) { newPeerID in + // When switching to a private chat, send read receipts + if let peerID = newPeerID { + viewModel.markPrivateMessagesAsRead(from: peerID) + } + } } } @@ -1111,10 +1117,12 @@ struct DeliveryStatusView: View { case .read(let nickname, _): HStack(spacing: -2) { - Image(systemName: "checkmark.circle.fill") - .font(.system(size: 12, weight: .bold)) - .foregroundColor(Color(red: 0.0, green: 0.478, blue: 1.0)) // Bright blue + Image(systemName: "checkmark") + .font(.system(size: 10, weight: .bold)) + Image(systemName: "checkmark") + .font(.system(size: 10, weight: .bold)) } + .foregroundColor(Color(red: 0.0, green: 0.478, blue: 1.0)) // Bright blue .help("Read by \(nickname)") .onAppear { print("[UI] Showing BLUE checkmarks for read status by \(nickname)")