// // NetworkView.swift // punchnet import SwiftUI import Observation // 资源展示模式 enum NetworkShowMode: String, CaseIterable { case resource = "访问资源" case device = "成员设备" } // MARK: - 网络连接状态 enum NetworkConnectionPhase { case disconnected case connecting case connected case disconnecting } // MARK: - 主网络视图 struct NetworkView: View { @Environment(AppContext.self) var appContext: AppContext @Environment(\.openWindow) var openWindow @State private var networkModel = NetworkModel() var body: some View { @Bindable var networkModel = self.networkModel VStack(spacing: 0) { // 1. 头部区域 (Header) HStack(spacing: 16) { NetworkStatusBar(model: self.networkModel) Spacer() if self.networkModel.shouldShowModePicker { Picker("", selection: $networkModel.showMode) { ForEach(NetworkShowMode.allCases, id: \.self) { Text($0.rawValue).tag($0) } } .pickerStyle(.segmented) .frame(width: 160) } Button { openWindow(id: "settings") } label: { Image(systemName: "slider.horizontal.3") .font(.system(size: 14)) .foregroundColor(.secondary) } .buttonStyle(.plain) .help("配置中心") } .padding(.horizontal, 20) .padding(.vertical, 14) .background(VisualEffectView(material: .headerView, blendingMode: .withinWindow)) Divider() // 2. 内容区域 (Content) Group { switch self.networkModel.phase { case .connecting, .disconnecting: NetworkWaitAuthView(phase: self.networkModel.phase) case .connected: NetworkConnectedView(model: self.networkModel) case .disconnected: NetworkDisconnectedView(model: self.networkModel) } } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(VisualEffectView(material: .windowBackground, blendingMode: .behindWindow)) } .frame(minWidth: 700, minHeight: 500) // 适当调大宽度以适应 SplitView .task { await self.networkModel.activate(appContext: self.appContext) } .alert("提示", isPresented: self.errorPresented) { Button("确定", role: .cancel) { self.networkModel.clearError() } } message: { Text(self.networkModel.errorMessage ?? "") } } private var errorPresented: Binding { Binding( get: { self.networkModel.errorMessage != nil }, set: { isPresented in if !isPresented { self.networkModel.clearError() } } ) } }