diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index b18e9295b9..159b19cc13 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -33,6 +33,7 @@ enum UserPickerSheet: Identifiable { class SaveableSettings: ObservableObject { @Published var servers: ServerSettings = ServerSettings(currUserServers: [], userServers: [], serverErrors: []) + @Published var advancedNetworkSettings: AdvancedNetworkSettingsConfig = AdvancedNetworkSettingsConfig.defaults } struct ServerSettings { @@ -41,6 +42,20 @@ struct ServerSettings { public var serverErrors: [UserServersError] } +struct AdvancedNetworkSettingsConfig { + public var currentNetCfg: NetCfg + public var netCfg: NetCfg + public var currentNetProxy: NetworkProxy + public var netProxy: NetworkProxy + + static let defaults = AdvancedNetworkSettingsConfig( + currentNetCfg: NetCfg.defaults, + netCfg: NetCfg.defaults, + currentNetProxy: networkProxyDefault.get(), + netProxy: networkProxyDefault.get() + ) +} + struct UserPickerSheetView: View { let sheet: UserPickerSheet @EnvironmentObject var chatModel: ChatModel @@ -89,21 +104,58 @@ struct UserPickerSheetView: View { ) } .onDisappear { + let advancedNetworkCanBeSaved = advancedNetworkSettingsCanBeSaved(ss.advancedNetworkSettings) + let advancedNetworkSaveText = NSLocalizedString("Save and reconnect", comment: "alert button") + if serversCanBeSaved( ss.servers.currUserServers, ss.servers.userServers, ss.servers.serverErrors ) { showAlert( - title: NSLocalizedString("Save servers?", comment: "alert title"), - buttonTitle: NSLocalizedString("Save", comment: "alert button"), - buttonAction: { saveServers($ss.servers.currUserServers, $ss.servers.userServers) }, + title: NSLocalizedString(advancedNetworkCanBeSaved ? "Save servers and network settings?" : "Save servers?", comment: "alert title"), + buttonTitle: advancedNetworkCanBeSaved ? NSLocalizedString("Save", comment: "alert button"): advancedNetworkSaveText, + buttonAction: { + saveServers($ss.servers.currUserServers, $ss.servers.userServers) + if advancedNetworkCanBeSaved { + _ = saveNetCfg() + } + }, + cancelButton: true + ) + } else if (advancedNetworkCanBeSaved) { + showAlert( + title: NSLocalizedString("Update network settings?", comment: "alert title"), + buttonTitle: advancedNetworkSaveText, + buttonAction: { _ = saveNetCfg() }, cancelButton: true ) } } .environmentObject(ss) } + + private func saveNetCfg() -> Bool { + do { + let netCfg = ss.advancedNetworkSettings.netCfg + let netProxy = ss.advancedNetworkSettings.netProxy + try setNetworkConfig(netCfg) + ss.advancedNetworkSettings.currentNetCfg = netCfg + setNetCfg(netCfg, networkProxy: netCfg.socksProxy != nil ? netProxy : nil) + ss.advancedNetworkSettings.currentNetProxy = netProxy + networkProxyDefault.set(netProxy) + return true + } catch let error { + let err = responseError(error) + showAlert( + NSLocalizedString("Error updating settings", comment: "alert title"), + message: responseError(error) + ) + + logger.error("\(err)") + return false + } + } } struct ChatListView: View { diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift index 754ca3cf6b..58cf392f8f 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/AdvancedNetworkSettings.swift @@ -28,19 +28,19 @@ struct AdvancedNetworkSettings: View { @EnvironmentObject var theme: AppTheme @AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false @AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false - @State private var netCfg = NetCfg.defaults - @State private var currentNetCfg = NetCfg.defaults @State private var cfgLoaded = false @State private var enableKeepAlive = true @State private var keepAliveOpts = KeepAliveOpts.defaults @State private var showSettingsAlert: NetworkSettingsAlert? @State private var onionHosts: OnionHosts = .no @State private var showSaveDialog = false - @State private var netProxy = networkProxyDefault.get() - @State private var currentNetProxy = networkProxyDefault.get() @State private var useNetProxy = false @State private var netProxyAuth = false - + @Binding public var currentNetCfg: NetCfg + @Binding public var netCfg: NetCfg + @Binding public var currentNetProxy: NetworkProxy + @Binding public var netProxy: NetworkProxy + var body: some View { VStack { List { @@ -386,6 +386,12 @@ struct AdvancedNetworkSettings: View { struct AdvancedNetworkSettings_Previews: PreviewProvider { static var previews: some View { - AdvancedNetworkSettings() + let defaultSettings = AdvancedNetworkSettingsConfig.defaults + AdvancedNetworkSettings( + currentNetCfg: Binding.constant(defaultSettings.currentNetCfg), + netCfg: Binding.constant(defaultSettings.netCfg), + currentNetProxy: Binding.constant(defaultSettings.currentNetProxy), + netProxy: Binding.constant(defaultSettings.netProxy) + ) } } diff --git a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift index 16aa98bc5f..4523075433 100644 --- a/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift +++ b/apps/ios/Shared/Views/UserSettings/NetworkAndServers/NetworkAndServers.swift @@ -94,9 +94,14 @@ struct NetworkAndServers: View { } NavigationLink { - AdvancedNetworkSettings() - .navigationTitle("Advanced settings") - .modifier(ThemedBackground(grouped: true)) + AdvancedNetworkSettings( + currentNetCfg: $ss.advancedNetworkSettings.currentNetCfg, + netCfg: $ss.advancedNetworkSettings.netCfg, + currentNetProxy: $ss.advancedNetworkSettings.currentNetProxy, + netProxy: $ss.advancedNetworkSettings.netProxy + ) + .navigationTitle("Advanced settings") + .modifier(ThemedBackground(grouped: true)) } label: { Text("Advanced network settings") } @@ -336,6 +341,13 @@ func serversCanBeSaved( return userServers != currUserServers && serverErrors.isEmpty } +func advancedNetworkSettingsCanBeSaved( + _ config: AdvancedNetworkSettingsConfig +) -> Bool { + let useNetProxy = config.netCfg.socksProxy != nil + return (config.currentNetCfg != config.netCfg || config.currentNetProxy != config.netProxy) && (useNetProxy ? config.netProxy.valid : true) +} + struct ServersErrorView: View { @EnvironmentObject var theme: AppTheme var errStr: String