105 lines
3.2 KiB
Swift
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()
|
|
}
|
|
}
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
|