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) } } }