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
This commit is contained in:
jack
2025-07-06 22:22:13 +02:00
parent d162a89ac2
commit c9a594d0b5
2 changed files with 15 additions and 5 deletions
+10
View File
@@ -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()
}
}
}
}
+5 -5
View File
@@ -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)
}
}
}