diff --git a/bitchat/Services/CommandProcessor.swift b/bitchat/Services/CommandProcessor.swift index 40a3c3dc..9857e674 100644 --- a/bitchat/Services/CommandProcessor.swift +++ b/bitchat/Services/CommandProcessor.swift @@ -136,8 +136,8 @@ class CommandProcessor { chatViewModel?.addLocalPrivateSystemMessage(localText, to: targetPeerID) } } else { - // In public chat: send to mesh and also add a local system echo so sender sees it immediately - meshService?.sendMessage(emoteContent, mentions: []) + // In public chat: send to active public channel (mesh or geohash) + chatViewModel?.sendPublicRaw(emoteContent) let publicEcho = "\(emoji) \(myNickname) \(action) \(nickname)\(suffix)" chatViewModel?.addPublicSystemMessage(publicEcho) } diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 76f69051..39dd44cc 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -2147,9 +2147,34 @@ class ChatViewModel: ObservableObject, BitchatDelegate { trimPrivateChatMessagesIfNeeded(for: peerID) } else { - // In public chat - send to everyone + // In public chat - send to active public channel + #if os(iOS) + switch activeChannel { + case .mesh: + meshService.sendMessage(screenshotMessage, mentions: []) + case .location(let ch): + Task { @MainActor in + do { + let identity = try NostrIdentityBridge.deriveIdentity(forGeohash: ch.geohash) + let event = try NostrProtocol.createEphemeralGeohashEvent( + content: screenshotMessage, + geohash: ch.geohash, + senderIdentity: identity, + nickname: self.nickname + ) + NostrRelayManager.shared.sendEvent(event) + // Track ourselves as active participant + self.recordGeoParticipant(pubkeyHex: identity.publicKeyHex) + } catch { + SecureLogger.log("❌ Failed to send geohash screenshot message: \(error)", category: SecureLogger.session, level: .error) + self.addSystemMessage("failed to send to location channel") + } + } + } + #else meshService.sendMessage(screenshotMessage, mentions: []) - + #endif + // Show local notification immediately as system message let localNotification = BitchatMessage( sender: "system", diff --git a/bitchat/Views/LocationChannelsSheet.swift b/bitchat/Views/LocationChannelsSheet.swift index 8977654b..f129ba0e 100644 --- a/bitchat/Views/LocationChannelsSheet.swift +++ b/bitchat/Views/LocationChannelsSheet.swift @@ -106,7 +106,7 @@ struct LocationChannelsSheet: View { let namePart = nameBase.map { formattedNamePrefix(for: channel.level) + $0 } let subtitlePrefix = "#\(channel.geohash) • \(coverage)" let highlight = viewModel.geohashParticipantCount(for: channel.geohash) > 0 - channelRow(title: geohashTitleWithCount(for: channel), subtitlePrefix: subtitlePrefix, subtitleName: namePart, subtitleNameBold: highlight, isSelected: isSelected(channel), titleBold: highlight) { + channelRow(title: geohashTitleWithCount(for: channel), subtitlePrefix: subtitlePrefix, subtitleName: namePart, isSelected: isSelected(channel), titleBold: highlight) { manager.select(ChannelID.location(channel)) isPresented = false }