punchnet-macos/punchnet/Views/Network/NetworkView.swift
2026-02-26 11:49:36 +08:00

152 lines
4.6 KiB
Swift

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