fix binding
This commit is contained in:
parent
2c440a32c7
commit
dee3e26c33
@ -18,8 +18,8 @@ class VPNManager {
|
|||||||
private var manager: NETunnelProviderManager?
|
private var manager: NETunnelProviderManager?
|
||||||
private var statusObserver: NSObjectProtocol?
|
private var statusObserver: NSObjectProtocol?
|
||||||
|
|
||||||
var isConnected: Bool = false
|
|
||||||
var vpnStatus: VPNStatus = .disconnected
|
var vpnStatus: VPNStatus = .disconnected
|
||||||
|
var isConnected: Bool = false
|
||||||
|
|
||||||
var vpnStatusStream: AsyncStream<VPNStatus>
|
var vpnStatusStream: AsyncStream<VPNStatus>
|
||||||
private var vpnStatusCont: AsyncStream<VPNStatus>.Continuation
|
private var vpnStatusCont: AsyncStream<VPNStatus>.Continuation
|
||||||
|
|||||||
@ -90,6 +90,11 @@ class AppContext {
|
|||||||
throw AppContextError.nullNetworkSession
|
throw AppContextError.nullNetworkSession
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 避免重复连接
|
||||||
|
guard !vpnManager.isConnected else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
let context = try await SDLAPIClient.connectNetwork(accesToken: session.accessToken)
|
let context = try await SDLAPIClient.connectNetwork(accesToken: session.accessToken)
|
||||||
if let options = SystemConfig.getOptions(
|
if let options = SystemConfig.getOptions(
|
||||||
networkId: UInt32(session.networkId),
|
networkId: UInt32(session.networkId),
|
||||||
|
|||||||
@ -105,6 +105,21 @@ struct NetworkStatusBar: View {
|
|||||||
@State private var vpnManger = VPNManager.shared
|
@State private var vpnManger = VPNManager.shared
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
let isOnBinding = Binding(
|
||||||
|
get: { vpnManger.isConnected },
|
||||||
|
set: { newValue in
|
||||||
|
if newValue {
|
||||||
|
Task {
|
||||||
|
try? await self.appContext.connectNetwork()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Task {
|
||||||
|
try? await self.appContext.disconnectNetwork()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
HStack(spacing: 12) {
|
HStack(spacing: 12) {
|
||||||
// 左侧:状态指示器与文字
|
// 左侧:状态指示器与文字
|
||||||
HStack(spacing: 20) {
|
HStack(spacing: 20) {
|
||||||
@ -133,12 +148,13 @@ struct NetworkStatusBar: View {
|
|||||||
|
|
||||||
// 右侧:Switch 开关
|
// 右侧:Switch 开关
|
||||||
// 注意:这里使用 Binding 手动接管连接/断开逻辑
|
// 注意:这里使用 Binding 手动接管连接/断开逻辑
|
||||||
Toggle("", isOn: $vpnManger.isConnected)
|
Toggle("", isOn: isOnBinding)
|
||||||
.toggleStyle(.switch)
|
.toggleStyle(.switch)
|
||||||
.controlSize(.small) // macOS 顶部栏或面板推荐使用 small 尺寸
|
.controlSize(.small) // macOS 顶部栏或面板推荐使用 small 尺寸
|
||||||
}
|
}
|
||||||
.padding(.vertical, 5)
|
.padding(.vertical, 5)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NetworkConnectedView: View {
|
struct NetworkConnectedView: View {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user