// // NetworkView.swift // punchnet // // Created by 安礼成 on 2026/1/16. // import SwiftUI struct NetworkView: View { @Environment(UserContext.self) var userContext: UserContext @State private var networkModel: NetworkModel init() { self.networkModel = NetworkModel(networkSession: self.userContext.networkSession!) } var body: some View { VStack { HStack { VStack { HStack(alignment: .center) { Text(networkModel.networkSession.networkName) Text(">") Spacer() } HStack { Toggle("", isOn: $networkModel.isOn) .toggleStyle(SwitchToggleStyle(tint: .green)) Text("已连接") Spacer() } } .frame(width: 320) // 显示设备和资源选项 HStack { Button { self.networkModel.showModel = .resource } label: { Text("资源") } Button { self.networkModel.showModel = .device } label: { Text("设备") } } Spacer() } Group { switch self.networkModel.connectState { case .waitAuth: NetworkWaitAuthView(networkModel: self.networkModel) case .connected: NetworkConnctedView(networkModel: self.networkModel) case .disconnected: NetworkDisconnctedView(networkModel: self.networkModel) } } Spacer() } .padding(.top, 10) .padding(.leading, 10) .toolbar { ToolbarItem(placement: .primaryAction) { Button { print("clicked") } label: { Image(systemName: "gearshape") } } } } } // 网络处于未连接状态 struct NetworkDisconnctedView: View { @Bindable var networkModel: NetworkModel var body: some View { ZStack { Color.clear VStack { Button { Task { try await startVpn() } } label: { Text("连接") .font(.system(size: 14, weight: .regular)) .padding([.top, .bottom], 8) .padding([.leading, .trailing], 30) .foregroundColor(.white) } .background(Color(red: 74/255, green: 207/255, blue: 154/255)) .cornerRadius(5) .frame(width: 120, height: 35) Button { Task { try await VPNManager.shared.disableVpn() } } label: { Text("关闭") .font(.system(size: 14, weight: .regular)) .padding([.top, .bottom], 8) .padding([.leading, .trailing], 30) .foregroundColor(.white) } .background(Color(red: 74/255, green: 207/255, blue: 154/255)) .cornerRadius(5) .frame(width: 120, height: 35) } } } // 执行登陆操作 private func startVpn() async throws { let clientId = SystemConfig.getClientId() let options = SystemConfig.getOptions(networkId: 8, networkDomain: "punchnet.com", ip: "10.211.179.1", maskLen: 24, accessToken: "accessToken1234", identityId: 1234, hostname: "mysql", noticePort: 1234) // token存在则优先使用token try await VPNManager.shared.enableVpn(options: options!) } } #Preview { NetworkView() }