Files
sing-box-for-apple/ApplicationLibrary/Views/Dashboard/OverviewViewModel.swift
T
2025-11-26 22:25:48 +08:00

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)
}
}
}
}