refactor(ui): 订阅与诊断分区自持错误弹窗,塌缩两个 destination 包装壳

SubscriptionsView/DiagnosticsView 改为自持 ErrorAlertPresenter 并经
presentingErrors 挂载(与 ServersView 同法),只为转发 presenter 而存在的
WorkspaceSubscriptionsView/WorkspaceDiagnosticsView 整体删除,窗口壳
destinationView 直挂分区视图;WorkspaceHomeView 因承载旧版导入主动弹窗
保留。穿透链 13 个类型减至 11 个,presenter owner 减至 3 个。
This commit is contained in:
Qiu Yuzhou
2026-10-03 13:29:15 +08:00
parent 64ff12dc4c
commit aaabb4f7ea
4 changed files with 11 additions and 37 deletions
+3 -1
View File
@@ -8,7 +8,8 @@ import SwiftUI
/// 的唯一 UI-facing seam);本视图只负责生命周期触发、呈现与复制动作。
struct DiagnosticsView: View {
@ObservedObject var diagnostics: DiagnosticsWorkflow
let errors: ErrorAlertPresenter
/// 共享错误弹窗呈现(UI 持有;typed error → 本地化文案的呈现边缘)。
@StateObject private var errors = ErrorAlertPresenter()
let clipboard: any TextClipboard
enum LogSource: String, CaseIterable, Identifiable {
@@ -49,6 +50,7 @@ struct DiagnosticsView: View {
.padding(.bottom, 36)
}
.task { await diagnostics.readWhileActive() }
.presentingErrors(errors)
}
// MARK: - 状态摘要
+2 -2
View File
@@ -211,7 +211,7 @@ struct MainWindowView: View {
clipboard: clipboard,
configurationGroupFileExporter: configurationGroupFileExporter)
case .subscriptions:
WorkspaceSubscriptionsView(
SubscriptionsView(
workflow: workflow,
onNodesRemoved: clearSelectionIfInvalidated)
case .rules:
@@ -225,7 +225,7 @@ struct MainWindowView: View {
)
.frame(maxWidth: .infinity, maxHeight: .infinity)
case .diagnostics:
WorkspaceDiagnosticsView(
DiagnosticsView(
diagnostics: diagnostics,
clipboard: clipboard)
}
+3 -1
View File
@@ -7,7 +7,8 @@ import SwiftUI
/// (非敏感);结构化刷新状态在呈现层本地化(story 42)。
struct SubscriptionsView: View {
@ObservedObject var workflow: CatalogWorkflow
let errors: ErrorAlertPresenter
/// 共享错误弹窗呈现(UI 持有;typed error → 本地化文案的呈现边缘)。
@StateObject private var errors = ErrorAlertPresenter()
/// 删除完成后回调(被删身份集合;主窗口据此清除失效选择)。
let onNodesRemoved: (Set<NodeID>) -> Void
@@ -60,6 +61,7 @@ struct SubscriptionsView: View {
"将移除订阅源、固定分组与全部远端成员;若代理正走此订阅,代理会停止。此操作不可撤销。"
)
}
.presentingErrors(errors)
}
private func commitDelete() {
@@ -1,7 +1,8 @@
import SwiftUI
/// 主窗口各 destination 的包装视图(票 #53/#54):负责每个分区的共享
/// alert/sheet 生命周期,行为委托给既有分区视图。
/// 首页 destination 的包装视图:承载旧版导入主动弹窗与共享错误弹窗挂载
/// (票 #53/#54),行为委托给 HomeView。订阅/诊断分区自持错误弹窗(与
/// ServersView 同法),不再需要包装。
struct WorkspaceHomeView: View {
@ObservedObject var workflow: CatalogWorkflow
@@ -34,34 +35,3 @@ struct WorkspaceHomeView: View {
.presentingErrors(errors)
}
}
struct WorkspaceSubscriptionsView: View {
@ObservedObject var workflow: CatalogWorkflow
let onNodesRemoved: (Set<NodeID>) -> Void
@StateObject private var errors = ErrorAlertPresenter()
var body: some View {
SubscriptionsView(
workflow: workflow,
errors: errors,
onNodesRemoved: onNodesRemoved
)
.presentingErrors(errors)
}
}
struct WorkspaceDiagnosticsView: View {
@ObservedObject var diagnostics: DiagnosticsWorkflow
let clipboard: any TextClipboard
@StateObject private var errors = ErrorAlertPresenter()
var body: some View {
// 导出诊断动作在窗口工具栏(票 #58);本包装只承载复制错误呈现。
DiagnosticsView(
diagnostics: diagnostics,
errors: errors,
clipboard: clipboard
)
.presentingErrors(errors)
}
}