diff --git a/bitchat/Services/MessageRouter.swift b/bitchat/Services/MessageRouter.swift index 5937bdec..729e8452 100644 --- a/bitchat/Services/MessageRouter.swift +++ b/bitchat/Services/MessageRouter.swift @@ -4,13 +4,12 @@ import Foundation @MainActor final class MessageRouter { private let mesh: Transport - private let nostr: NostrTransport + private let nostr: NostrOutboxService private var outbox: [String: [(content: String, nickname: String, messageID: String)]] = [:] // peerID -> queued messages - init(mesh: Transport, nostr: NostrTransport) { + init(mesh: Transport, nostr: NostrOutboxService) { self.mesh = mesh self.nostr = nostr - self.nostr.senderPeerID = mesh.myPeerID // Observe favorites changes to learn Nostr mapping and flush queued messages NotificationCenter.default.addObserver( @@ -46,7 +45,7 @@ final class MessageRouter { } else if canSendViaNostr(peerID: peerID) { SecureLogger.log("Routing PM via Nostr to \(peerID.prefix(8))… id=\(messageID.prefix(8))…", category: SecureLogger.session, level: .debug) - nostr.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID) + nostr.sendPrivate(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID) } else { // Queue for later (when mesh connects or Nostr mapping appears) if outbox[peerID] == nil { outbox[peerID] = [] } diff --git a/bitchat/Services/NostrOutboxService.swift b/bitchat/Services/NostrOutboxService.swift index 151b1298..fa5d77e2 100644 --- a/bitchat/Services/NostrOutboxService.swift +++ b/bitchat/Services/NostrOutboxService.swift @@ -30,5 +30,21 @@ final class NostrOutboxService { func sendGeohashReadAck(messageID: String, toRecipientHex recipientHex: String, from identity: NostrIdentity) { transport.sendReadReceiptGeohash(messageID, toRecipientHex: recipientHex, from: identity) } -} + // MARK: - Generic outbox via favorites mapping + func sendPrivate(_ content: String, to peerID: String, recipientNickname: String, messageID: String) { + transport.sendPrivateMessage(content, to: peerID, recipientNickname: recipientNickname, messageID: messageID) + } + + func sendReadReceipt(_ receipt: ReadReceipt, to peerID: String) { + transport.sendReadReceipt(receipt, to: peerID) + } + + func sendDeliveryAck(for messageID: String, to peerID: String) { + transport.sendDeliveryAck(for: messageID, to: peerID) + } + + func sendFavoriteNotification(to peerID: String, isFavorite: Bool) { + transport.sendFavoriteNotification(to: peerID, isFavorite: isFavorite) + } +} diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 6b934365..5538558d 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -462,10 +462,9 @@ class ChatViewModel: ObservableObject, BitchatDelegate { self.commandProcessor = CommandProcessor() self.privateChatManager = PrivateChatManager(meshService: meshService, readReceiptTracker: readReceiptTracker) self.unifiedPeerService = UnifiedPeerService(meshService: meshService) - let nostrTransport = NostrTransport() - self.messageRouter = MessageRouter(mesh: meshService, nostr: nostrTransport) self.nostrInbox = NostrInboxService() self.nostrOutbox = NostrOutboxService(meshService: meshService) + self.messageRouter = MessageRouter(mesh: meshService, nostr: self.nostrOutbox) // Route receipts from PrivateChatManager through MessageRouter self.privateChatManager.messageRouter = self.messageRouter self.autocompleteService = AutocompleteService()