Fix compilation errors in ChatViewModel

- Fixed PeerData type reference (should be BitchatPeer)
- Fixed Task initialization in init() method with proper async/await syntax
- Fixed cancellables binding issue with proper unwrapping
- Maintained duplicate peer ID protection in peerIndex dictionary
This commit is contained in:
jack
2025-08-01 20:24:09 +02:00
parent d605a0b6db
commit e2d50e3684
+54 -43
View File
@@ -194,55 +194,66 @@ class ChatViewModel: ObservableObject, BitchatDelegate {
MessageRetryService.shared.meshService = meshService MessageRetryService.shared.meshService = meshService
// Initialize Nostr services // Initialize Nostr services
Task { @MainActor in Task { [weak self] in
nostrRelayManager = NostrRelayManager.shared await MainActor.run {
nostrRelayManager?.connect() self?.nostrRelayManager = NostrRelayManager.shared
self?.nostrRelayManager?.connect()
messageRouter = MessageRouter( if let meshService = self?.meshService,
meshService: meshService, let nostrRelayManager = self?.nostrRelayManager {
nostrRelay: nostrRelayManager! self?.messageRouter = MessageRouter(
) meshService: meshService,
nostrRelay: nostrRelayManager
)
}
// Initialize peer manager // Initialize peer manager
peerManager = PeerManager(meshService: meshService) if let meshService = self?.meshService {
peerManager?.updatePeers() self?.peerManager = PeerManager(meshService: meshService)
self?.peerManager?.updatePeers()
// Bind peer manager's peer list to our published property // Bind peer manager's peer list to our published property
peerManager?.$peers if let peerManager = self?.peerManager,
.receive(on: DispatchQueue.main) var cancellables = self?.cancellables {
.sink { [weak self] peers in peerManager.$peers
SecureLogger.log("📱 UI: Received \(peers.count) peers from PeerManager", .receive(on: DispatchQueue.main)
category: SecureLogger.session, level: .info) .sink { [weak self] peers in
for peer in peers { SecureLogger.log("📱 UI: Received \(peers.count) peers from PeerManager",
SecureLogger.log(" - \(peer.displayName): connected=\(peer.isConnected), state=\(peer.connectionState)", category: SecureLogger.session, level: .info)
category: SecureLogger.session, level: .debug) for peer in peers {
} SecureLogger.log(" - \(peer.displayName): connected=\(peer.isConnected), state=\(peer.connectionState)",
// Update peers directly category: SecureLogger.session, level: .debug)
self?.allPeers = peers }
// Update peer index for O(1) lookups // Update peers directly
// Deduplicate peers by ID to prevent crash from duplicate keys self?.allPeers = peers
var uniquePeers: [String: PeerData] = [:] // Update peer index for O(1) lookups
for peer in peers { // Deduplicate peers by ID to prevent crash from duplicate keys
// Keep the first occurrence of each peer ID var uniquePeers: [String: BitchatPeer] = [:]
if uniquePeers[peer.id] == nil { for peer in peers {
uniquePeers[peer.id] = peer // Keep the first occurrence of each peer ID
} else { if uniquePeers[peer.id] == nil {
SecureLogger.log("⚠️ Duplicate peer ID detected: \(peer.id) (\(peer.displayName))", uniquePeers[peer.id] = peer
category: SecureLogger.session, level: .warning) } 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 { self?.peerIndex = uniquePeers
// UI will update automatically // 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 // Update private chat peer ID if needed when peers change
if self?.selectedPrivateChatFingerprint != nil { if self?.selectedPrivateChatFingerprint != nil {
self?.updatePrivateChatPeerIfNeeded() self?.updatePrivateChatPeerIfNeeded()
}
}
.store(in: &cancellables)
self?.cancellables = cancellables
} }
} }
.store(in: &cancellables) }
} }
// Set up Noise encryption callbacks // Set up Noise encryption callbacks