This commit is contained in:
Diogo 2025-06-28 00:31:05 +00:00 committed by GitHub
commit 79e37ff5db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 85 additions and 28 deletions

View file

@ -62,6 +62,29 @@ enum ActiveFilter: Identifiable, Equatable {
class SaveableSettings: ObservableObject {
@Published var servers: ServerSettings = ServerSettings(currUserServers: [], userServers: [], serverErrors: [])
@Published var networkSettings: NetworkSettings = NetworkSettings.defaults
public func saveNetCfg() -> Bool {
do {
let netCfg = networkSettings.netCfg
let netProxy = networkSettings.netProxy
try setNetworkConfig(netCfg)
networkSettings.currentNetCfg = netCfg
setNetCfg(netCfg, networkProxy: netCfg.socksProxy != nil ? netProxy : nil)
networkSettings.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 ServerSettings {
@ -70,6 +93,20 @@ struct ServerSettings {
public var serverErrors: [UserServersError]
}
struct NetworkSettings {
public var currentNetCfg: NetCfg
public var netCfg: NetCfg
public var currentNetProxy: NetworkProxy
public var netProxy: NetworkProxy
static let defaults = NetworkSettings(
currentNetCfg: NetCfg.defaults,
netCfg: NetCfg.defaults,
currentNetProxy: networkProxyDefault.get(),
netProxy: networkProxyDefault.get()
)
}
struct UserPickerSheetView: View {
let sheet: UserPickerSheet
@EnvironmentObject var chatModel: ChatModel
@ -118,15 +155,30 @@ struct UserPickerSheetView: View {
)
}
.onDisappear {
let advancedNetworkCanBeSaved = advancedNetworkSettingsCanBeSaved(ss.networkSettings)
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 {
_ = ss.saveNetCfg()
}
},
cancelButton: true
)
} else if (advancedNetworkCanBeSaved) {
showAlert(
title: NSLocalizedString("Update network settings?", comment: "alert title"),
buttonTitle: advancedNetworkSaveText,
buttonAction: { _ = ss.saveNetCfg() },
cancelButton: true
)
}

View file

@ -28,19 +28,20 @@ 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
let saveNetCfg: () -> Bool
var body: some View {
VStack {
List {
@ -325,22 +326,6 @@ struct AdvancedNetworkSettings: View {
}
}
private func saveNetCfg() -> Bool {
do {
try setNetworkConfig(netCfg)
currentNetCfg = netCfg
setNetCfg(netCfg, networkProxy: useNetProxy ? netProxy : nil)
currentNetProxy = netProxy
networkProxyDefault.set(netProxy)
return true
} catch let error {
let err = responseError(error)
showSettingsAlert = .error(err: err)
logger.error("\(err)")
return false
}
}
private func intSettingPicker(_ title: LocalizedStringKey, selection: Binding<Int>, values: [Int], label: String) -> some View {
Picker(title, selection: selection) {
ForEach(values, id: \.self) { value in
@ -399,6 +384,13 @@ struct AdvancedNetworkSettings: View {
struct AdvancedNetworkSettings_Previews: PreviewProvider {
static var previews: some View {
AdvancedNetworkSettings()
let defaultSettings = NetworkSettings.defaults
AdvancedNetworkSettings(
currentNetCfg: Binding.constant(defaultSettings.currentNetCfg),
netCfg: Binding.constant(defaultSettings.netCfg),
currentNetProxy: Binding.constant(defaultSettings.currentNetProxy),
netProxy: Binding.constant(defaultSettings.netProxy),
saveNetCfg: { true }
)
}
}

View file

@ -94,9 +94,15 @@ struct NetworkAndServers: View {
}
NavigationLink {
AdvancedNetworkSettings()
.navigationTitle("Advanced settings")
.modifier(ThemedBackground(grouped: true))
AdvancedNetworkSettings(
currentNetCfg: $ss.networkSettings.currentNetCfg,
netCfg: $ss.networkSettings.netCfg,
currentNetProxy: $ss.networkSettings.currentNetProxy,
netProxy: $ss.networkSettings.netProxy,
saveNetCfg: ss.saveNetCfg
)
.navigationTitle("Advanced settings")
.modifier(ThemedBackground(grouped: true))
} label: {
Text("Advanced network settings")
}
@ -381,6 +387,13 @@ func serversCanBeSaved(
return userServers != currUserServers && serverErrors.isEmpty
}
func advancedNetworkSettingsCanBeSaved(
_ config: NetworkSettings
) -> 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