53 lines
1.7 KiB
Swift
53 lines
1.7 KiB
Swift
import Foundation
|
|
import Libbox
|
|
import Library
|
|
import SwiftUI
|
|
|
|
@MainActor
|
|
public final class OverviewViewModel: BaseViewModel {
|
|
@Published public var reasserting = false
|
|
|
|
public func switchProfile(_ profileID: Int64, profile: ExtensionProfile, environments: ExtensionEnvironments) async {
|
|
await SharedPreferences.selectedProfileID.set(profileID)
|
|
environments.selectedProfileUpdate.send()
|
|
|
|
if profile.status.isConnected {
|
|
do {
|
|
try await serviceReload()
|
|
} catch {
|
|
alert = AlertState(error: error)
|
|
}
|
|
}
|
|
reasserting = false
|
|
}
|
|
|
|
public nonisolated func serviceReload() async throws {
|
|
try LibboxNewStandaloneCommandClient()!.serviceReload()
|
|
}
|
|
|
|
public nonisolated func setSystemProxyEnabled(_ enabled: Bool, profile: ExtensionProfile) async {
|
|
do {
|
|
await SharedPreferences.systemProxyEnabled.set(enabled)
|
|
if enabled {
|
|
try LibboxNewStandaloneCommandClient()!.setSystemProxyEnabled(enabled)
|
|
} else {
|
|
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 = AlertState(error: error) }
|
|
}
|
|
}
|
|
}
|