fix view
This commit is contained in:
parent
27d0d11508
commit
9b8d7c78f6
@ -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 {
|
||||||
|
|||||||
@ -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()
|
|
||||||
//}
|
|
||||||
@ -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#>)
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user