From 172b06721b752d3a8eed68de1ffcb8f404366abb Mon Sep 17 00:00:00 2001 From: jack Date: Fri, 1 Aug 2025 20:26:28 +0200 Subject: [PATCH] Revert "Fix compilation errors in ChatViewModel" This reverts commit e2d50e36842450f5162fadfd4133fc7deb917245. --- bitchat/ViewModels/ChatViewModel.swift | 103 +++++++++++-------------- 1 file changed, 46 insertions(+), 57 deletions(-) diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 959655c3..4aafcf43 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -194,66 +194,55 @@ class ChatViewModel: ObservableObject, BitchatDelegate { MessageRetryService.shared.meshService = meshService // Initialize Nostr services - Task { [weak self] in - await MainActor.run { - self?.nostrRelayManager = NostrRelayManager.shared - self?.nostrRelayManager?.connect() - - if let meshService = self?.meshService, - let nostrRelayManager = self?.nostrRelayManager { - self?.messageRouter = MessageRouter( - meshService: meshService, - nostrRelay: nostrRelayManager - ) - } - - // Initialize peer manager - if let meshService = self?.meshService { - self?.peerManager = PeerManager(meshService: meshService) - self?.peerManager?.updatePeers() + Task { @MainActor in + nostrRelayManager = NostrRelayManager.shared + nostrRelayManager?.connect() + + messageRouter = MessageRouter( + meshService: meshService, + nostrRelay: nostrRelayManager! + ) + + // Initialize peer manager + peerManager = PeerManager(meshService: meshService) + peerManager?.updatePeers() + + // Bind peer manager's peer list to our published property + peerManager?.$peers + .receive(on: DispatchQueue.main) + .sink { [weak self] peers in + SecureLogger.log("📱 UI: Received \(peers.count) peers from PeerManager", + category: SecureLogger.session, level: .info) + for peer in peers { + SecureLogger.log(" - \(peer.displayName): connected=\(peer.isConnected), state=\(peer.connectionState)", + category: SecureLogger.session, level: .debug) + } + // Update peers directly + self?.allPeers = peers + // Update peer index for O(1) lookups + // Deduplicate peers by ID to prevent crash from duplicate keys + var uniquePeers: [String: PeerData] = [:] + for peer in peers { + // Keep the first occurrence of each peer ID + if uniquePeers[peer.id] == nil { + uniquePeers[peer.id] = peer + } else { + SecureLogger.log("⚠️ Duplicate peer ID detected: \(peer.id) (\(peer.displayName))", + category: SecureLogger.session, level: .warning) + } + } + self?.peerIndex = uniquePeers + // Schedule UI update if peers changed + if peers.count > 0 || self?.allPeers.count ?? 0 > 0 { + // UI will update automatically + } - // Bind peer manager's peer list to our published property - if let peerManager = self?.peerManager, - var cancellables = self?.cancellables { - peerManager.$peers - .receive(on: DispatchQueue.main) - .sink { [weak self] peers in - SecureLogger.log("📱 UI: Received \(peers.count) peers from PeerManager", - category: SecureLogger.session, level: .info) - for peer in peers { - SecureLogger.log(" - \(peer.displayName): connected=\(peer.isConnected), state=\(peer.connectionState)", - category: SecureLogger.session, level: .debug) - } - // Update peers directly - self?.allPeers = peers - // Update peer index for O(1) lookups - // Deduplicate peers by ID to prevent crash from duplicate keys - var uniquePeers: [String: BitchatPeer] = [:] - for peer in peers { - // Keep the first occurrence of each peer ID - if uniquePeers[peer.id] == nil { - uniquePeers[peer.id] = peer - } else { - SecureLogger.log("⚠️ Duplicate peer ID detected: \(peer.id) (\(peer.displayName))", - category: SecureLogger.session, level: .warning) - } - } - self?.peerIndex = uniquePeers - // Schedule UI update if peers changed - if peers.count > 0 || self?.allPeers.count ?? 0 > 0 { - // UI will update automatically - } - - // Update private chat peer ID if needed when peers change - if self?.selectedPrivateChatFingerprint != nil { - self?.updatePrivateChatPeerIfNeeded() - } - } - .store(in: &cancellables) - self?.cancellables = cancellables + // Update private chat peer ID if needed when peers change + if self?.selectedPrivateChatFingerprint != nil { + self?.updatePrivateChatPeerIfNeeded() } } - } + .store(in: &cancellables) } // Set up Noise encryption callbacks