mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-05-25 16:24:27 +00:00
ios: ask for confirmation of save on advanced settings dismiss
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user