Files
sing-box-for-apple/ApplicationLibrary/Views/Dashboard/Overview/OverviewViewModel.swift
T
2025-12-01 18:22:06 +08:00

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