// // SettingsNetworkView 2.swift // punchnet // // Created by 安礼成 on 2026/3/19. // import SwiftUI struct SettingsNetworkView: View { @Environment(UserContext.self) var userContext: UserContext @State private var selectedExitNode: UserContext.NetworkSession.ExitNode? var body: some View { ScrollView(.vertical, showsIndicators: false) { VStack(alignment: .leading, spacing: 24) { // MARK: - 网络连接配置 networkSectionHeader(title: "连接设置", icon: "wifi.router.fill") if let networkSession = userContext.networkSession { VStack(spacing: 0) { // // 默认网络项 // NetworkRow(title: "默认网络", value: state.selectedNetwork.name) { // Menu { // ForEach(state.networks, id: \.id) { network in // Button(network.name) { // self.state.selectedNetwork = network // } // } // } label: { // actionLabel(text: "切换") // } // .buttonStyle(.plain) // } // // Divider().padding(.leading, 16) // 出口节点项 NetworkRow(title: "出口节点", value: selectedExitNode?.nodeName ?? "") { Menu { ForEach(networkSession.exitNodes, id: \.uuid) { node in Button { self.selectedExitNode = node } label: { Text(node.nodeName) } } } label: { actionLabel(text: "更改") } .buttonStyle(.plain) } } .background(Color.primary.opacity(0.03)) .cornerRadius(12) .overlay(RoundedRectangle(cornerRadius: 12).stroke(Color.primary.opacity(0.05), lineWidth: 1)) } // MARK: - 授权与安全 networkSectionHeader(title: "授权状态", icon: "checkmark.shield.fill") VStack(spacing: 0) { StatusRow(title: "当前状态", value: "有效", valueColor: .green) Divider() .padding(.leading, 16) StatusRow(title: "有效期", value: "临时 (至断开连接)", valueColor: .secondary) } .background(Color.primary.opacity(0.03)) .cornerRadius(12) // MARK: - 外部操作 HStack(spacing: 16) { Button { } label: { Label("进入管理平台", systemImage: "arrow.up.right.app") .font(.subheadline.bold()) } .buttonStyle(.borderedProminent) .controlSize(.large) Button { } label: { Text("查看诊断详情") } .buttonStyle(.bordered) .controlSize(.large) } .padding(.top, 8) } .padding(32) .frame(maxWidth: 600, alignment: .leading) } } // MARK: - 辅助组件 private func networkSectionHeader(title: String, icon: String) -> some View { HStack { Image(systemName: icon) .foregroundColor(.blue) .font(.system(size: 14, weight: .semibold)) Text(title) .font(.system(size: 15, weight: .bold)) .foregroundColor(.secondary) } .padding(.leading, 4) } private func actionLabel(text: String) -> some View { Text(text) .font(.subheadline) .padding(.horizontal, 10) .padding(.vertical, 4) .background(Capsule().fill(Color.blue.opacity(0.1))) .foregroundColor(.blue) } } // MARK: - 通用行组件 struct NetworkRow: View { let title: String let value: String let action: () -> Content init(title: String, value: String, @ViewBuilder action: @escaping () -> Content) { self.title = title self.value = value self.action = action } var body: some View { HStack { VStack(alignment: .leading, spacing: 4) { Text(title).font(.caption).foregroundColor(.secondary) Text(value).font(.system(size: 15, weight: .medium)) } Spacer() action() } .padding(16) } } struct StatusRow: View { let title: String let value: String let valueColor: Color var body: some View { HStack { Text(title) .font(.system(size: 14)) .foregroundColor(.primary.opacity(0.8)) Spacer() Text(value) .font(.system(size: 14, weight: .medium)) .foregroundColor(valueColor) } .padding(16) } } // MARK: - 预览辅助 #Preview { SettingsNetworkView() .environment(UserContext()) // 确保环境中存在 UserContext }