2026-04-17 15:56:56 +08:00

105 lines
3.2 KiB
Swift

//
// 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<Bool> {
Binding(
get: { self.networkModel.errorMessage != nil },
set: { isPresented in
if !isPresented {
self.networkModel.clearError()
}
}
)
}
}