diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 76194afc..b49cc2cc 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 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 */; }; 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 */; }; @@ -226,6 +227,7 @@ /* Begin PBXFileReference section */ 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 = ""; }; 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 = ""; }; @@ -479,6 +481,7 @@ isa = PBXGroup; children = ( 251926842C3BA97800249DF5 /* FavoriteNodeButton.swift */, + 251926892C3BB1B200249DF5 /* ExchangePositionsButton.swift */, 251926862C3BAE2200249DF5 /* NodeAlertsButton.swift */, ); path = Actions; @@ -1232,6 +1235,7 @@ DDB6ABE428B13FFF00384BA1 /* DisplayEnums.swift in Sources */, DD4975A52B147BA90026544E /* AmbientLightingConfig.swift in Sources */, D93068D92B81509C0066FBC8 /* TapbackResponses.swift in Sources */, + 2519268A2C3BB1B200249DF5 /* ExchangePositionsButton.swift in Sources */, DD86D40A287F04F100BAEB7A /* InvalidVersion.swift in Sources */, DDD94A502845C8F5004A87A0 /* DateTimeText.swift in Sources */, DDB6ABE228B13FB500384BA1 /* PositionConfigEnums.swift in Sources */, diff --git a/Meshtastic/Views/Nodes/Helpers/Actions/ExchangePositionsButton.swift b/Meshtastic/Views/Nodes/Helpers/Actions/ExchangePositionsButton.swift new file mode 100644 index 00000000..ed5fce47 --- /dev/null +++ b/Meshtastic/Views/Nodes/Helpers/Actions/ExchangePositionsButton.swift @@ -0,0 +1,35 @@ +import CoreData +import SwiftUI + +struct ExchangePositionsButton: View { + var bleManager: BLEManager + + var node: NodeInfoEntity + + @State + private var isPresentingPositionSentAlert: Bool = false + + var body: some View { + Button { + isPresentingPositionSentAlert = bleManager.sendPosition( + channel: node.channel, + destNum: node.num, + wantResponse: true + ) + } label: { + Label { + Text("Exchange Positions") + } icon: { + Image(systemName: "arrow.triangle.2.circlepath") + .symbolRenderingMode(.hierarchical) + } + }.alert( + "Position Sent", + isPresented: $isPresentingPositionSentAlert + ) { + Button("OK") { }.keyboardShortcut(.defaultAction) + } message: { + Text("Your position has been sent with a request for a response with their position.") + } + } +} diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index ea427587..d3b8f921 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -230,6 +230,14 @@ struct NodeDetail: View { user: user ) } + + if let connectedPeripheral = bleManager.connectedPeripheral, + node.num != connectedPeripheral.num { + ExchangePositionsButton( + bleManager: bleManager, + node: node + ) + } } if let metadata = node.metadata, diff --git a/Meshtastic/Views/Nodes/NodeList.swift b/Meshtastic/Views/Nodes/NodeList.swift index 91fee07f..ff5adcbb 100644 --- a/Meshtastic/Views/Nodes/NodeList.swift +++ b/Meshtastic/Views/Nodes/NodeList.swift @@ -16,7 +16,6 @@ struct NodeList: View { @State private var isPresentingTraceRouteSentAlert = false @State private var isPresentingClientHistorySentAlert = false @State private var isPresentingDeleteNodeAlert = false - @State private var isPresentingPositionSentAlert = false @State private var deleteNodeId: Int64 = 0 @State private var searchText = "" @State private var viaLora = true @@ -76,24 +75,14 @@ struct NodeList: View { user: user ) - if bleManager.connectedPeripheral != nil && node.num != connectedNodeNum { - Button { - let positionSent = bleManager.sendPosition( - channel: node.channel, - destNum: node.num, - wantResponse: true - ) - if positionSent { - isPresentingPositionSentAlert = true - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { - isPresentingPositionSentAlert = false - } - } - } label: { - Label("Exchange Positions", systemImage: "arrow.triangle.2.circlepath") - } - } - if bleManager.connectedPeripheral != nil && connectedNodeNum != node.num { + 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 { @@ -131,14 +120,6 @@ struct NodeList: View { } } } - .alert( - "Position Sent", - isPresented: $isPresentingPositionSentAlert - ) { - Button("OK") { }.keyboardShortcut(.defaultAction) - } message: { - Text("Your position has been sent with a request for a response with their position.") - } .alert( "Trace Route Sent", isPresented: $isPresentingTraceRouteSentAlert