This commit is contained in:
anlicheng 2026-02-26 11:49:36 +08:00
parent 27d0d11508
commit 9b8d7c78f6
6 changed files with 112 additions and 106 deletions

View File

@ -7,15 +7,15 @@
import SwiftUI import SwiftUI
struct NetworkConnctedView: View { struct NetworkConnctedView: View {
@Bindable var state: NetworkState @Bindable var networkModel: NetworkModel
var body: some View { var body: some View {
Group { Group {
switch state.showModel { switch networkModel.showModel {
case .resource: case .resource:
NetworkResourceGroupView(state: self.state) NetworkResourceGroupView(networkModel: self.networkModel)
case .device: case .device:
NetworkDeviceGroupView(state: self.state) NetworkDeviceGroupView(networkModel: self.networkModel)
} }
} }
} }
@ -23,11 +23,11 @@ struct NetworkConnctedView: View {
// //
struct NetworkResourceGroupView: View { struct NetworkResourceGroupView: View {
@Bindable var state: NetworkState @Bindable var networkModel: NetworkModel
var body: some View { var body: some View {
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) {
ForEach(self.state.resources, id: \.id) { resource in ForEach(self.networkModel.resources, id: \.id) { resource in
NetworkResourceView(resource: resource) NetworkResourceView(resource: resource)
} }
} }
@ -35,7 +35,7 @@ struct NetworkResourceGroupView: View {
} }
struct NetworkResourceView: View { struct NetworkResourceView: View {
var resource: NetworkState.Resource var resource: NetworkModel.Resource
var body: some View { var body: some View {
VStack { VStack {
@ -56,32 +56,32 @@ struct NetworkResourceView: View {
// //
struct NetworkDeviceGroupView: View { struct NetworkDeviceGroupView: View {
@Bindable var state: NetworkState @Bindable var networkModel: NetworkModel
@State private var selectedId: Int? @State private var selectedId: Int?
var body: some View { var body: some View {
NavigationSplitView { NavigationSplitView {
List(self.state.devices, id: \.id, selection: $selectedId) { device in List(self.networkModel.devices, id: \.id, selection: $selectedId) { device in
NetworkDeviceHeadView(device: device) NetworkDeviceHeadView(device: device)
} }
.listStyle(.sidebar) .listStyle(.sidebar)
.onChange(of: selectedId) { .onChange(of: selectedId) {
self.state.changeSelectedDevice(deviceId: selectedId) self.networkModel.changeSelectedDevice(deviceId: selectedId)
} }
.onAppear { .onAppear {
if selectedId == nil { if selectedId == nil {
selectedId = self.state.devices.first?.id selectedId = self.networkModel.devices.first?.id
} }
} }
} detail: { } detail: {
NetworkDeviceDetailView(device: $state.selectedDevice) NetworkDeviceDetailView(device: $networkModel.selectedDevice)
} }
} }
} }
struct NetworkDeviceHeadView: View { struct NetworkDeviceHeadView: View {
var device: NetworkState.Device var device: NetworkModel.Device
var body: some View { var body: some View {
VStack { VStack {
@ -100,7 +100,7 @@ struct NetworkDeviceHeadView: View {
} }
struct NetworkDeviceDetailView: View { struct NetworkDeviceDetailView: View {
@Binding var device: NetworkState.Device? @Binding var device: NetworkModel.Device?
var body: some View { var body: some View {
Group { Group {

View File

@ -1,75 +0,0 @@
//
// NetworkDisconnctedView.swift
// punchnet
//
// Created by on 2026/1/16.
//
import SwiftUI
struct NetworkDisconnctedView: View {
@Bindable var state: NetworkState
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 {
// NetworkDisconnctedView()
//}

View File

@ -9,7 +9,7 @@ import Foundation
import Observation import Observation
@Observable @Observable
class NetworkState { class NetworkModel {
// //
enum ConnectState { enum ConnectState {
@ -24,6 +24,7 @@ class NetworkState {
case device case device
} }
//
struct Resource { struct Resource {
var id: Int var id: Int
var status: Int var status: Int
@ -31,6 +32,7 @@ class NetworkState {
var schema: String var schema: String
} }
//
struct Device { struct Device {
var id: Int var id: Int
var status: Int var status: Int
@ -50,15 +52,13 @@ class NetworkState {
} }
} }
struct NetworkModel {
var name: String
}
// //
var connectState: ConnectState = .disconnected var connectState: ConnectState = .disconnected
var model: NetworkModel = .init(name: "123@abc.com的网络")
var showModel: ShowMode = .device var showModel: ShowMode = .device
//
let networkSession: UserContext.NetworkSession
// //
var isOn: Bool = false { var isOn: Bool = false {
didSet { didSet {
@ -85,7 +85,9 @@ class NetworkState {
var devices: [Device] = [ var devices: [Device] = [
] ]
init() { init(networkSession: UserContext.NetworkSession) {
self.networkSession = networkSession
self.devices = [ self.devices = [
.init(id: 1, status: 1, name: "test1", ipv4: "192.168.1.1", ipv6: "fa9d.fa9d.fa9d.fa9d", system: "MacOS 12", resources: self.resources), .init(id: 1, status: 1, name: "test1", ipv4: "192.168.1.1", ipv6: "fa9d.fa9d.fa9d.fa9d", system: "MacOS 12", resources: self.resources),
.init(id: 2, status: 1, name: "test2", ipv4: "192.168.1.2", ipv6: "fa9d.fa9d.fa9d.fa9d", system: "MacOS 12", resources: self.resources), .init(id: 2, status: 1, name: "test2", ipv4: "192.168.1.2", ipv6: "fa9d.fa9d.fa9d.fa9d", system: "MacOS 12", resources: self.resources),
@ -108,4 +110,14 @@ class NetworkState {
} }
} }
// func connect() async throws {
// let params: [String: Any] = [
// "client_id": SystemConfig.getClientId(),
// "access_token": networkSession.accessToken
// ]
//
// try await SDLAPIClient.doPost(path: "/connect", params: params, as: <#T##Decodable.Type#>)
// }
} }

View File

@ -8,7 +8,12 @@
import SwiftUI import SwiftUI
struct NetworkView: View { struct NetworkView: View {
@State private var state = NetworkState() @Environment(UserContext.self) var userContext: UserContext
@State private var networkModel: NetworkModel
init() {
self.networkModel = NetworkModel(networkSession: self.userContext.networkSession!)
}
var body: some View { var body: some View {
VStack { VStack {
@ -16,13 +21,13 @@ struct NetworkView: View {
VStack { VStack {
HStack(alignment: .center) { HStack(alignment: .center) {
Text(state.model.name) Text(networkModel.networkSession.networkName)
Text(">") Text(">")
Spacer() Spacer()
} }
HStack { HStack {
Toggle("", isOn: $state.isOn) Toggle("", isOn: $networkModel.isOn)
.toggleStyle(SwitchToggleStyle(tint: .green)) .toggleStyle(SwitchToggleStyle(tint: .green))
Text("已连接") Text("已连接")
@ -35,13 +40,13 @@ struct NetworkView: View {
// //
HStack { HStack {
Button { Button {
self.state.showModel = .resource self.networkModel.showModel = .resource
} label: { } label: {
Text("资源") Text("资源")
} }
Button { Button {
self.state.showModel = .device self.networkModel.showModel = .device
} label: { } label: {
Text("设备") Text("设备")
} }
@ -50,13 +55,13 @@ struct NetworkView: View {
} }
Group { Group {
switch state.connectState { switch self.networkModel.connectState {
case .waitAuth: case .waitAuth:
NetworkWaitAuthView(state: self.state) NetworkWaitAuthView(networkModel: self.networkModel)
case .connected: case .connected:
NetworkConnctedView(state: self.state) NetworkConnctedView(networkModel: self.networkModel)
case .disconnected: case .disconnected:
NetworkDisconnctedView(state: self.state) NetworkDisconnctedView(networkModel: self.networkModel)
} }
} }
@ -76,6 +81,70 @@ struct NetworkView: View {
} }
} }
//
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 { #Preview {
NetworkView() NetworkView()

View File

@ -7,7 +7,7 @@
import SwiftUI import SwiftUI
struct NetworkWaitAuthView: View { struct NetworkWaitAuthView: View {
@Bindable var state: NetworkState @Bindable var networkModel: NetworkModel
var body: some View { var body: some View {
Color.clear Color.clear