Merge pull request #44 from PubliusPseudis/fix/update-peerlist-on-main-thread

Fix: Ensure peer list updates on main thread
This commit is contained in:
jack
2025-07-08 18:18:03 +02:00
committed by GitHub
+19 -18
View File
@@ -2932,28 +2932,29 @@ extension ChatViewModel: BitchatDelegate {
func didUpdatePeerList(_ peers: [String]) { func didUpdatePeerList(_ peers: [String]) {
// print("[DEBUG] Updating peer list: \(peers.count) peers: \(peers)") // print("[DEBUG] Updating peer list: \(peers.count) peers: \(peers)")
connectedPeers = peers // UI updates must run on the main thread.
isConnected = !peers.isEmpty // The delegate callback is not guaranteed to be on the main thread.
DispatchQueue.main.async {
self.connectedPeers = peers
self.isConnected = !peers.isEmpty
// Clean up channel members who disconnected // Clean up channel members who disconnected
for (channel, memberIDs) in channelMembers { for (channel, memberIDs) in self.channelMembers {
// Remove disconnected peers from channel members let activeMembers = memberIDs.filter { memberID in
let activeMembers = memberIDs.filter { memberID in memberID == self.meshService.myPeerID || peers.contains(memberID)
memberID == meshService.myPeerID || peers.contains(memberID) }
if activeMembers != memberIDs {
self.channelMembers[channel] = activeMembers
}
} }
if activeMembers != memberIDs { // Explicitly notify SwiftUI that the object has changed.
channelMembers[channel] = activeMembers self.objectWillChange.send()
if let currentChatPeer = self.selectedPrivateChatPeer,
!peers.contains(currentChatPeer) {
self.endPrivateChat()
} }
} }
// Force UI update
objectWillChange.send()
// If we're in a private chat with someone who disconnected, exit the chat
if let currentChatPeer = selectedPrivateChatPeer,
!peers.contains(currentChatPeer) {
endPrivateChat()
}
} }
private func parseMentions(from content: String) -> [String] { private func parseMentions(from content: String) -> [String] {