2022-08-01 21:57:03 -07:00
//
2023-03-30 11:23:19 -07:00
// N e t w o r k C o n f i g . s w i f t
2022-08-01 21:57:03 -07:00
// M e s h t a s t i c
//
// C o p y r i g h t ( c ) G a r t h V a n d e r H o u w e n 8 / 1 / 2 0 2 2
//
import SwiftUI
2022-09-10 17:14:03 -07:00
struct NetworkConfig : View {
2023-03-06 10:33:18 -08:00
2022-08-01 21:57:03 -07:00
@ Environment ( \ . managedObjectContext ) var context
@ EnvironmentObject var bleManager : BLEManager
2022-12-09 18:19:00 -08:00
@ Environment ( \ . dismiss ) private var goBack
2023-03-06 10:33:18 -08:00
2022-08-01 21:57:03 -07:00
var node : NodeInfoEntity ?
2023-03-06 10:33:18 -08:00
2022-08-01 21:57:03 -07:00
@ State private var isPresentingSaveConfirm : Bool = false
@ State var hasChanges : Bool = false
2022-09-10 17:14:03 -07:00
@ State var wifiEnabled = false
@ State var wifiSsid = " "
@ State var wifiPsk = " "
@ State var wifiMode = 0
2022-09-27 22:18:50 -07:00
@ State var ntpServer = " "
2022-11-26 10:13:46 -08:00
@ State var ethEnabled = false
@ State var ethMode = 0
2023-03-06 10:33:18 -08:00
2022-08-01 21:57:03 -07:00
var body : some View {
2023-03-06 10:33:18 -08:00
2022-08-01 21:57:03 -07:00
VStack {
Form {
2023-03-13 19:17:43 -07:00
if node != nil && node ? . metadata = = nil && node ? . num ? ? 0 != bleManager . connectedPeripheral ? . num ? ? 0 {
Text ( " There has been no response to a request for device metadata over the admin channel for this node. " )
. font ( . callout )
. foregroundColor ( . orange )
2023-03-14 12:44:10 -07:00
2023-03-13 19:17:43 -07:00
} else if node != nil && node ? . num ? ? 0 != bleManager . connectedPeripheral ? . num ? ? 0 {
// L e t u s e r s k n o w w h a t i s g o i n g o n i f t h e y a r e u s i n g r e m o t e a d m i n a n d d o n ' t h a v e t h e c o n f i g y e t
2023-03-14 12:44:10 -07:00
if node ? . networkConfig = = nil {
2023-03-13 19:17:43 -07:00
Text ( " Network config data was requested over the admin channel but no response has been returned from the remote node. You can check the status of admin message requests in the admin message log. " )
. font ( . callout )
. foregroundColor ( . orange )
} else {
Text ( " Remote administration for: \( node ? . user ? . longName ? ? " Unknown " ) " )
. font ( . title3 )
2023-03-19 18:37:23 -07:00
. onAppear {
setNetworkValues ( )
}
2023-03-13 19:17:43 -07:00
}
2023-03-14 12:44:10 -07:00
} else if node != nil && node ? . num ? ? 0 = = bleManager . connectedPeripheral ? . num ? ? 0 {
2023-03-13 19:17:43 -07:00
Text ( " Configuration for: \( node ? . user ? . longName ? ? " Unknown " ) " )
. font ( . title3 )
} else {
Text ( " Please connect to a radio to configure settings. " )
. font ( . callout )
. foregroundColor ( . orange )
}
2023-03-30 11:23:19 -07:00
if ( node != nil && node ? . metadata ? . hasWifi ? ? false ) {
Section ( header : Text ( " WiFi Options " ) ) {
Toggle ( isOn : $ wifiEnabled ) {
Label ( " enabled " , systemImage : " wifi " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
HStack {
Label ( " ssid " , systemImage : " network " )
TextField ( " ssid " , text : $ wifiSsid )
. foregroundColor ( . gray )
. autocapitalization ( . none )
. disableAutocorrection ( true )
. onChange ( of : wifiSsid , perform : { _ in
let totalBytes = wifiSsid . utf8 . count
// O n l y m e s s w i t h t h e v a l u e i f i t i s t o o b i g
if totalBytes > 32 {
let firstNBytes = Data ( wifiSsid . utf8 . prefix ( 32 ) )
if let maxBytesString = String ( data : firstNBytes , encoding : String . Encoding . utf8 ) {
// S e t t h e s h o r t N a m e b a c k t o t h e l a s t p l a c e w h e r e i t w a s t h e r i g h t s i z e
wifiSsid = maxBytesString
}
2022-08-02 09:44:59 -07:00
}
2023-03-30 11:23:19 -07:00
hasChanges = true
} )
. foregroundColor ( . gray )
}
. keyboardType ( . default )
HStack {
Label ( " password " , systemImage : " wallet.pass " )
TextField ( " password " , text : $ wifiPsk )
. foregroundColor ( . gray )
. autocapitalization ( . none )
. disableAutocorrection ( true )
. onChange ( of : wifiPsk , perform : { _ in
let totalBytes = wifiPsk . utf8 . count
// O n l y m e s s w i t h t h e v a l u e i f i t i s t o o b i g
if totalBytes > 63 {
let firstNBytes = Data ( wifiPsk . utf8 . prefix ( 63 ) )
if let maxBytesString = String ( data : firstNBytes , encoding : String . Encoding . utf8 ) {
// S e t t h e s h o r t N a m e b a c k t o t h e l a s t p l a c e w h e r e i t w a s t h e r i g h t s i z e
wifiPsk = maxBytesString
}
2022-08-02 09:44:59 -07:00
}
2023-03-30 11:23:19 -07:00
hasChanges = true
} )
. foregroundColor ( . gray )
}
. keyboardType ( . default )
Text ( " Enabling WiFi will disable the bluetooth connection to the app. " )
. font ( . callout )
2022-08-02 09:44:59 -07:00
}
2023-03-30 11:23:19 -07:00
2022-11-26 10:13:46 -08:00
}
2023-03-30 11:23:19 -07:00
if ( node != nil && node ? . metadata ? . hasEthernet ? ? false ) {
Section ( header : Text ( " Ethernet Options " ) ) {
Toggle ( isOn : $ ethEnabled ) {
Label ( " enabled " , systemImage : " network " )
}
. toggleStyle ( SwitchToggleStyle ( tint : . accentColor ) )
Text ( " Enabling Ethernet will disable the bluetooth connection to the app. " )
. font ( . callout )
2022-11-26 10:13:46 -08:00
}
2022-08-01 21:57:03 -07:00
}
}
2022-09-15 12:34:10 -07:00
. scrollDismissesKeyboard ( . interactively )
2023-01-31 22:59:43 -08:00
. disabled ( self . bleManager . connectedPeripheral = = nil || node ? . networkConfig = = nil )
2022-08-01 21:57:03 -07:00
Button {
isPresentingSaveConfirm = true
} label : {
2022-12-12 20:35:38 -08:00
Label ( " save " , systemImage : " square.and.arrow.down " )
2022-08-01 21:57:03 -07:00
}
. disabled ( bleManager . connectedPeripheral = = nil || ! hasChanges )
. buttonStyle ( . bordered )
. buttonBorderShape ( . capsule )
. controlSize ( . large )
. padding ( )
. confirmationDialog (
2022-12-30 11:08:59 -08:00
" are.you.sure " ,
2022-09-23 21:41:07 -07:00
isPresented : $ isPresentingSaveConfirm ,
titleVisibility : . visible
2022-08-01 21:57:03 -07:00
) {
2023-05-05 09:27:24 -07:00
let nodeName = node ? . user ? . longName ? ? " unknown " . localized
let buttonText = String . localizedStringWithFormat ( " save.config %@ " . localized , nodeName )
2023-01-09 18:34:43 -08:00
Button ( buttonText ) {
2023-01-31 22:08:03 -08:00
let connectedNode = getNodeInfo ( id : bleManager . connectedPeripheral . num , context : context )
2023-02-06 18:45:03 -08:00
if connectedNode != nil {
var network = Config . NetworkConfig ( )
network . wifiEnabled = self . wifiEnabled
network . wifiSsid = self . wifiSsid
network . wifiPsk = self . wifiPsk
network . ethEnabled = self . ethEnabled
2023-03-06 10:33:18 -08:00
// n e t w o r k . a d d r e s s M o d e = C o n f i g . N e t w o r k C o n f i g . A d d r e s s M o d e . d h c p
2023-03-15 09:27:33 -07:00
let adminMessageId = bleManager . saveNetworkConfig ( config : network , fromUser : connectedNode ! . user ! , toUser : node ! . user ! , adminIndex : connectedNode ? . myInfo ? . adminIndex ? ? 0 )
2023-02-06 18:45:03 -08:00
if adminMessageId > 0 {
// S h o u l d s h o w a s a v e d s u c c e s s f u l l y a l e r t o n c e I k n o w t h a t t o b e t r u e
// f o r n o w j u s t d i s a b l e t h e b u t t o n a f t e r a s u c c e s s f u l s a v e
hasChanges = false
goBack ( )
}
2022-08-01 21:57:03 -07:00
}
}
2022-09-23 21:41:07 -07:00
} message : {
2022-12-30 11:08:59 -08:00
Text ( " config.save.confirm " )
2022-08-01 21:57:03 -07:00
}
}
2022-12-13 07:49:46 -08:00
. navigationTitle ( " network.config " )
2022-08-01 21:57:03 -07:00
. navigationBarItems ( trailing :
ZStack {
2022-11-12 08:48:01 -08:00
ConnectedDevice ( bluetoothOn : bleManager . isSwitchedOn , deviceConnected : bleManager . connectedPeripheral != nil , name : ( bleManager . connectedPeripheral != nil ) ? bleManager . connectedPeripheral . shortName : " ???? " )
2022-08-01 21:57:03 -07:00
} )
. onAppear {
2022-11-12 08:48:01 -08:00
self . bleManager . context = context
2023-03-19 18:37:23 -07:00
setNetworkValues ( )
2023-03-06 10:33:18 -08:00
2023-01-31 22:08:03 -08:00
// N e e d t o r e q u e s t a N e t w o r k C o n f i g f r o m t h e r e m o t e n o d e b e f o r e a l l o w i n g c h a n g e s
2023-03-19 08:31:16 -07:00
if bleManager . connectedPeripheral != nil && node ? . networkConfig = = nil {
2023-01-31 22:08:03 -08:00
print ( " empty network config " )
let connectedNode = getNodeInfo ( id : bleManager . connectedPeripheral . num , context : context )
2023-03-05 14:40:07 -08:00
if node != nil && connectedNode != nil {
2023-02-06 18:45:03 -08:00
_ = bleManager . requestNetworkConfig ( fromUser : connectedNode ! . user ! , toUser : node ! . user ! , adminIndex : connectedNode ? . myInfo ? . adminIndex ? ? 0 )
2023-01-31 22:08:03 -08:00
}
}
2022-08-01 21:57:03 -07:00
}
2022-09-10 17:14:03 -07:00
. onChange ( of : wifiEnabled ) { newEnabled in
if node != nil && node ! . networkConfig != nil {
if newEnabled != node ! . networkConfig ! . wifiEnabled { hasChanges = true }
}
}
. onChange ( of : wifiSsid ) { newSSID in
if node != nil && node ! . networkConfig != nil {
if newSSID != node ! . networkConfig ! . wifiSsid { hasChanges = true }
}
}
. onChange ( of : wifiPsk ) { newPsk in
if node != nil && node ! . networkConfig != nil {
if newPsk != node ! . networkConfig ! . wifiPsk { hasChanges = true }
2022-08-04 19:43:03 -07:00
}
}
2022-09-10 17:14:03 -07:00
. onChange ( of : wifiMode ) { newMode in
if node != nil && node ! . networkConfig != nil {
if newMode != node ! . networkConfig ! . wifiMode { hasChanges = true }
2022-08-02 09:44:59 -07:00
}
2022-08-01 21:57:03 -07:00
}
2022-11-26 10:13:46 -08:00
. onChange ( of : ethEnabled ) { newEthEnabled in
if node != nil && node ! . networkConfig != nil {
if newEthEnabled != node ! . networkConfig ! . ethEnabled { hasChanges = true }
}
}
2022-08-01 21:57:03 -07:00
}
2023-03-19 18:37:23 -07:00
func setNetworkValues ( ) {
self . wifiEnabled = node ? . networkConfig ? . wifiEnabled ? ? false
self . wifiSsid = node ? . networkConfig ? . wifiSsid ? ? " "
self . wifiPsk = node ? . networkConfig ? . wifiPsk ? ? " "
self . wifiMode = Int ( node ? . networkConfig ? . wifiMode ? ? 0 )
self . ethEnabled = node ? . networkConfig ? . ethEnabled ? ? false
self . hasChanges = false
}
2022-08-01 21:57:03 -07:00
}