// // 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(resources: self.state.resources) case .device: NetworkDeviceGroupView(devices: self.state.devices, selection: self.state.devices[0]) } } } } } // 显示资源信息 struct NetworkResourceGroupView: View { var resources: [NetworkState.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) } } } var body: some View { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: 3), spacing: 8) { ForEach(resources, id: \.id) { resource in NetworkResourceView(resource: resource) } } } } // 显示设备信息 struct NetworkDeviceGroupView: View { var devices: [NetworkState.Device] @State private var selection: NetworkState.Device init(devices: [NetworkState.Device], selection: NetworkState.Device) { self.devices = devices self.selection = selection } var body: some View { NavigationSplitView { List(devices, id: \.id, selection: $selection) { device in NetworkDeviceHeadView(device: device) } } detail: { NetworkDeviceDetailView(device: $selection) } } } 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 { VStack { HStack { Text("连接状态") Text("\(device.status)") } HStack { Text("虚拟IPv4") Text("\(device.ipv4)") } HStack { Text("虚拟IPv6") Text("\(device.ipv6)") } HStack { Text("操作系统") Text("\(device.system)") } VStack { Text("服务列表") List(device.resources, id: \.id) { resource in HStack { Text("\(resource.name)") Text("\(resource.schema)") } } } } } } #Preview { NetworkView() }