From c9a594d0b5d7d8ab509f7a3ed6ec8935e4968557 Mon Sep 17 00:00:00 2001 From: jack Date: Sun, 6 Jul 2025 22:22:13 +0200 Subject: [PATCH] Fix UI not updating for delivery status changes - Use message ID instead of index for ForEach to trigger proper updates - Add explicit objectWillChange.send() when updating delivery status - Fix scroll-to-bottom logic to use message IDs - This should make blue checkmarks appear when read receipts are received --- bitchat/ViewModels/ChatViewModel.swift | 10 ++++++++++ bitchat/Views/ContentView.swift | 10 +++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 5cd476c8..17a1b9f2 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -2142,6 +2142,11 @@ extension ChatViewModel: BitchatDelegate { chatMessages[index] = updatedMessage privateChats[peerID] = chatMessages print("[Delivery] Updated message in private chat with \(peerID)") + + // Force UI update by triggering objectWillChange + DispatchQueue.main.async { [weak self] in + self?.objectWillChange.send() + } } } @@ -2152,6 +2157,11 @@ extension ChatViewModel: BitchatDelegate { updatedMessage.deliveryStatus = status roomMsgs[index] = updatedMessage roomMessages[room] = roomMsgs + + // Force UI update + DispatchQueue.main.async { [weak self] in + self?.objectWillChange.send() + } } } } diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index 3129dde3..6faaa3d8 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -439,7 +439,7 @@ struct ContentView: View { } }() - ForEach(Array(messages.enumerated()), id: \.offset) { index, message in + ForEach(messages, id: \.id) { message in VStack(alignment: .leading, spacing: 4) { // Check if current user is mentioned let isMentioned = message.mentions?.contains(viewModel.nickname) ?? false @@ -505,16 +505,16 @@ struct ContentView: View { } .padding(.horizontal, 12) .padding(.vertical, 2) - .id(index) + .id(message.id) } } .padding(.vertical, 8) } .background(backgroundColor) .onChange(of: viewModel.messages.count) { _ in - if viewModel.selectedPrivateChatPeer == nil { + if viewModel.selectedPrivateChatPeer == nil && !viewModel.messages.isEmpty { withAnimation { - proxy.scrollTo(viewModel.messages.count - 1, anchor: .bottom) + proxy.scrollTo(viewModel.messages.last?.id, anchor: .bottom) } } } @@ -523,7 +523,7 @@ struct ContentView: View { let messages = viewModel.privateChats[peerID], !messages.isEmpty { withAnimation { - proxy.scrollTo(messages.count - 1, anchor: .bottom) + proxy.scrollTo(messages.last?.id, anchor: .bottom) } } }