61 lines
2.0 KiB
Swift
61 lines
2.0 KiB
Swift
import Foundation
|
|
import Libbox
|
|
import Library
|
|
import SwiftUI
|
|
|
|
@MainActor
|
|
public final class OverviewViewModel: ObservableObject {
|
|
@Published var alert: Alert?
|
|
@Published var reasserting = false
|
|
|
|
public init() {}
|
|
|
|
func switchProfile(_ newProfileID: Int64, profile: ExtensionProfile, environments: ExtensionEnvironments) async {
|
|
await SharedPreferences.selectedProfileID.set(newProfileID)
|
|
environments.selectedProfileUpdate.send()
|
|
if profile.status.isConnected {
|
|
do {
|
|
try await serviceReload()
|
|
} catch {
|
|
alert = Alert(error)
|
|
}
|
|
}
|
|
reasserting = false
|
|
}
|
|
|
|
nonisolated func serviceReload() async throws {
|
|
try LibboxNewStandaloneCommandClient()!.serviceReload()
|
|
}
|
|
|
|
nonisolated func setSystemProxyEnabled(_ isEnabled: Bool, profile: ExtensionProfile) async {
|
|
do {
|
|
await SharedPreferences.systemProxyEnabled.set(isEnabled)
|
|
if isEnabled {
|
|
try LibboxNewStandaloneCommandClient()!.setSystemProxyEnabled(isEnabled)
|
|
} else {
|
|
// Apple BUG: HTTP Proxy cannot be disabled via setTunnelNetworkSettings, so we can only restart the Network Extension
|
|
await MainActor.run {
|
|
reasserting = true
|
|
}
|
|
try await profile.stop()
|
|
var waitSeconds = 0
|
|
while await profile.status != .disconnected {
|
|
try await Task.sleep(nanoseconds: NSEC_PER_SEC)
|
|
waitSeconds += 1
|
|
if waitSeconds >= 5 {
|
|
throw NSError(domain: "Restart service timeout", code: 0)
|
|
}
|
|
}
|
|
try await profile.start()
|
|
await MainActor.run {
|
|
reasserting = false
|
|
}
|
|
}
|
|
} catch {
|
|
await MainActor.run {
|
|
alert = Alert(error)
|
|
}
|
|
}
|
|
}
|
|
}
|