punchnet-macos/punchnet/Views/Network/NetworkView.swift
2026-01-16 16:43:33 +08:00

255 lines
6.7 KiB
Swift

//
// NetworkView.swift
// punchnet
//
// Created by on 2026/1/16.
//
import SwiftUI
struct NetworkView: View {
@State private var state = NetworkState()
var body: some View {
VStack {
HStack(alignment: .center) {
Text(state.model.name)
Text(">")
Spacer()
Image("logo")
.resizable()
.frame(width: 25, height: 25)
}
Group {
switch state.connectState {
case .waitAuth:
NetworkWaitAuthView(state: self.state)
case .connected:
NetworkConnctedView(state: self.state)
case .disconnected:
NetworkDisconnctedView(state: self.state)
}
}
Spacer()
}
.frame(width: 400, height: 400)
.padding(.top, 10)
.padding(.leading, 10)
}
}
struct NetworkWaitAuthView: View {
@Bindable var state: NetworkState
var body: some View {
Color.clear
.overlay {
Text("等待确认中")
}
}
}
struct NetworkDisconnctedView: View {
@Bindable var state: NetworkState
@State var isOn: Bool = false
var body: some View {
VStack {
HStack {
Toggle("", isOn: $isOn)
.toggleStyle(SwitchToggleStyle(tint: .green))
Text("未连接")
Spacer()
}
ZStack {
Color.clear
Button {
print("call me here")
} 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)
}
}
}
}
struct NetworkConnctedView: View {
@Bindable var state: NetworkState
@State var isOn: Bool = true
var body: some View {
VStack {
HStack {
Toggle("", isOn: $isOn)
.toggleStyle(SwitchToggleStyle(tint: .green))
Text("已连接")
Spacer()
}
Group {
switch state.showModel {
case .resource:
NetworkResourceGroupView(state: self.state)
case .device:
NetworkDeviceGroupView(state: self.state)
}
}
}
}
}
//
struct NetworkResourceGroupView: View {
@Bindable var state: NetworkState
var body: some View {
LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) {
ForEach(self.state.resources, id: \.id) { resource in
NetworkResourceView(resource: resource)
}
}
}
}
struct NetworkResourceView: View {
var resource: NetworkState.Resource
var body: some View {
VStack {
HStack {
Text(resource.status == 1 ? "yes" : "no")
Text(resource.name)
.font(.system(size: 14, weight: .regular))
}
Text(resource.schema)
.font(.system(size: 14, weight: .regular))
.padding(.leading, 30)
}
}
}
//
struct NetworkDeviceGroupView: View {
@Bindable var state: NetworkState
@State private var selectedId: Int?
var body: some View {
NavigationSplitView {
List(self.state.devices, id: \.id, selection: $selectedId) { device in
NetworkDeviceHeadView(device: device)
}
.listStyle(.sidebar)
.onChange(of: selectedId) {
self.state.changeSelectedDevice(deviceId: selectedId)
}
.onAppear {
if selectedId == nil {
selectedId = self.state.devices.first?.id
}
}
} detail: {
NetworkDeviceDetailView(device: $state.selectedDevice)
}
}
}
struct NetworkDeviceHeadView: View {
var device: NetworkState.Device
var body: some View {
VStack {
HStack {
Text(device.status == 1 ? "yes" : "no")
Text(device.name)
.font(.system(size: 14, weight: .regular))
}
Text(device.ipv4)
.font(.system(size: 14, weight: .regular))
.padding(.leading, 30)
}
}
}
struct NetworkDeviceDetailView: View {
@Binding var device: NetworkState.Device?
var body: some View {
Group {
if let device {
List {
Section {
HStack {
Text("连接状态")
Text("\(device.status)")
Spacer()
}
HStack {
Text("虚拟IPv4")
Text("\(device.ipv4)")
Spacer()
}
HStack {
Text("虚拟IPv6")
Text("\(device.ipv6)")
Spacer()
}
HStack {
Text("操作系统")
Text("\(device.system)")
Spacer()
}
}
Section("服务列表") {
ForEach(device.resources, id: \.id) { resource in
HStack {
Text("\(resource.name)")
Text("\(resource.schema)")
}
}
}
}
} else {
EmptyView()
}
}
}
}
#Preview {
NetworkView()
}