ios: ask for confirmation of save on advanced settings dismiss

This commit is contained in:
Diogo
2024-12-06 18:11:55 +00:00
parent df1a471c56
commit 2209a467bb
3 changed files with 82 additions and 12 deletions
@@ -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 {
@@ -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)
)
}
}
@@ -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