diff --git a/Localizable.xcstrings b/Localizable.xcstrings index a74c28a8..66efac74 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -20875,7 +20875,7 @@ "This conversation will be deleted." : { }, - "This could take a while, response will appear in the trace route log for the node it was sent to." : { + "This could take a while. The response will appear in the trace route log for the node it was sent to." : { }, "This determines the actual frequency you are transmitting on in the band. If set to 0 this value will be calculated automatically based on the primary channel name." : { diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index b49cc2cc..aa1d3c85 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 251926852C3BA97800249DF5 /* FavoriteNodeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 251926842C3BA97800249DF5 /* FavoriteNodeButton.swift */; }; 251926872C3BAE2200249DF5 /* NodeAlertsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 251926862C3BAE2200249DF5 /* NodeAlertsButton.swift */; }; 2519268A2C3BB1B200249DF5 /* ExchangePositionsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 251926892C3BB1B200249DF5 /* ExchangePositionsButton.swift */; }; + 2519268C2C3BB52000249DF5 /* TraceRouteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2519268B2C3BB52000249DF5 /* TraceRouteButton.swift */; }; 259792252C2F114500AD1659 /* ChannelEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD58C5F12919AD3C00D5BEFB /* ChannelEntityExtension.swift */; }; 259792262C2F114500AD1659 /* PositionEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD5394FD276BA0EF00AD86B1 /* PositionEntityExtension.swift */; }; 259792272C2F114500AD1659 /* TraceRouteEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE5B4052B227E3200FCDD05 /* TraceRouteEntityExtension.swift */; }; @@ -228,6 +229,7 @@ 251926842C3BA97800249DF5 /* FavoriteNodeButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteNodeButton.swift; sourceTree = ""; }; 251926862C3BAE2200249DF5 /* NodeAlertsButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeAlertsButton.swift; sourceTree = ""; }; 251926892C3BB1B200249DF5 /* ExchangePositionsButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExchangePositionsButton.swift; sourceTree = ""; }; + 2519268B2C3BB52000249DF5 /* TraceRouteButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TraceRouteButton.swift; sourceTree = ""; }; 25AECD4E2C2F723200862C8E /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 6D825E612C34786C008DBEE4 /* CommonRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonRegex.swift; sourceTree = ""; }; 6DA39D8D2A92DC52007E311C /* MeshtasticAppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticAppDelegate.swift; sourceTree = ""; }; @@ -483,6 +485,7 @@ 251926842C3BA97800249DF5 /* FavoriteNodeButton.swift */, 251926892C3BB1B200249DF5 /* ExchangePositionsButton.swift */, 251926862C3BAE2200249DF5 /* NodeAlertsButton.swift */, + 2519268B2C3BB52000249DF5 /* TraceRouteButton.swift */, ); path = Actions; sourceTree = ""; @@ -1185,6 +1188,7 @@ DD007BB02AA5981000F5FA12 /* NodeInfoEntityExtension.swift in Sources */, DDDB26422AABF655003AFCB7 /* NodeListItem.swift in Sources */, DDDB444629F8A96500EE2349 /* Character.swift in Sources */, + 2519268C2C3BB52000249DF5 /* TraceRouteButton.swift in Sources */, DD23A50F26FD1B4400D9B90C /* PeripheralModel.swift in Sources */, DDB6ABDB28B0AC6000384BA1 /* DistanceText.swift in Sources */, DD94B7402ACCE3BE00DCD1D1 /* MapSettingsForm.swift in Sources */, diff --git a/Meshtastic/Views/Nodes/Helpers/Actions/TraceRouteButton.swift b/Meshtastic/Views/Nodes/Helpers/Actions/TraceRouteButton.swift new file mode 100644 index 00000000..64e2563a --- /dev/null +++ b/Meshtastic/Views/Nodes/Helpers/Actions/TraceRouteButton.swift @@ -0,0 +1,33 @@ +import SwiftUI + +struct TraceRouteButton: View { + var bleManager: BLEManager + + var node: NodeInfoEntity + + @State + private var isPresentingTraceRouteSentAlert: Bool = false + + var body: some View { + Button { + isPresentingTraceRouteSentAlert = bleManager.sendTraceRouteRequest( + destNum: node.user?.num ?? 0, + wantResponse: true + ) + } label: { + Label { + Text("Trace Route") + } icon: { + Image(systemName: "signpost.right.and.left") + .symbolRenderingMode(.hierarchical) + } + }.alert( + "Trace Route Sent", + isPresented: $isPresentingTraceRouteSentAlert + ) { + Button("OK") { }.keyboardShortcut(.defaultAction) + } message: { + Text("This could take a while. The response will appear in the trace route log for the node it was sent to.") + } + } +} diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index d3b8f921..c18a1165 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -237,6 +237,11 @@ struct NodeDetail: View { bleManager: bleManager, node: node ) + + TraceRouteButton( + bleManager: bleManager, + node: node + ) } } diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index ff5adcbb..ab69e998 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -13,7 +13,6 @@ struct NodeList: View { @StateObject var appState = AppState.shared @State private var columnVisibility = NavigationSplitViewVisibility.all @State private var selectedNode: NodeInfoEntity? - @State private var isPresentingTraceRouteSentAlert = false @State private var isPresentingClientHistorySentAlert = false @State private var isPresentingDeleteNodeAlert = false @State private var deleteNodeId: Int64 = 0 @@ -58,9 +57,11 @@ struct NodeList: View { let connectedNode = nodes.first(where: { $0.num == connectedNodeNum }) List(nodes, id: \.self, selection: $selectedNode) { node in - NodeListItem(node: node, - connected: bleManager.connectedPeripheral != nil && bleManager.connectedPeripheral?.num ?? -1 == node.num, - connectedNode: (bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral?.num ?? -1 : -1)) + NodeListItem( + node: node, + connected: bleManager.connectedPeripheral != nil && bleManager.connectedPeripheral?.num ?? -1 == node.num, + connectedNode: (bleManager.connectedPeripheral != nil ? bleManager.connectedPeripheral?.num ?? -1 : -1) + ) .contextMenu { FavoriteNodeButton( bleManager: bleManager, @@ -77,33 +78,22 @@ struct NodeList: View { if let connectedPeripheral = bleManager.connectedPeripheral, node.num != connectedPeripheral.num { - + ExchangePositionsButton( bleManager: bleManager, node: node ) - - Button { - let success = bleManager.sendTraceRouteRequest(destNum: node.user?.num ?? 0, wantResponse: true) - if success { - isPresentingTraceRouteSentAlert = true - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { - isPresentingTraceRouteSentAlert = false - } - } - } label: { - Label("Trace Route", systemImage: "signpost.right.and.left") - } + TraceRouteButton( + bleManager: bleManager, + node: node + ) + if node.isStoreForwardRouter { - Button { let success = bleManager.requestStoreAndForwardClientHistory(fromUser: connectedNode!.user!, toUser: node.user!) if success { isPresentingClientHistorySentAlert = true - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { - isPresentingClientHistorySentAlert = false - } } } label: { Label("Client History", systemImage: "envelope.arrow.triangle.branch") @@ -120,19 +110,11 @@ struct NodeList: View { } } } - .alert( - "Trace Route Sent", - isPresented: $isPresentingTraceRouteSentAlert - ) { - Button("OK") { }.keyboardShortcut(.defaultAction) - } message: { - Text("This could take a while, response will appear in the trace route log for the node it was sent to.") - } .alert( "Client History Request Sent", isPresented: $isPresentingClientHistorySentAlert ) { - Button("OK") { }.keyboardShortcut(.defaultAction) + Button("OK") { }.keyboardShortcut(.defaultAction) } message: { Text("Any missed messages will be delivered again.") }