summaryrefslogtreecommitdiff
path: root/Hutch/Views/Builds/BuildDetailView.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-03-23 15:17:48 -0500
committerChristian Cleberg <[email protected]>2026-03-23 15:17:48 -0500
commitcf87c44f674e020c32fea70903f02c317b57da3b (patch)
tree88c09a27ef1ba30581a63c50f0f8d345477145c5 /Hutch/Views/Builds/BuildDetailView.swift
parentb81657586244299fc9fe78e4f27ca1c8bca07060 (diff)
downloadhutch-cf87c44f674e020c32fea70903f02c317b57da3b.tar.gz
hutch-cf87c44f674e020c32fea70903f02c317b57da3b.tar.bz2
hutch-cf87c44f674e020c32fea70903f02c317b57da3b.zip
Add scoped auto-refresh to build detail
Diffstat (limited to 'Hutch/Views/Builds/BuildDetailView.swift')
-rw-r--r--Hutch/Views/Builds/BuildDetailView.swift60
1 files changed, 46 insertions, 14 deletions
diff --git a/Hutch/Views/Builds/BuildDetailView.swift b/Hutch/Views/Builds/BuildDetailView.swift
index cd2a972..104b961 100644
--- a/Hutch/Views/Builds/BuildDetailView.swift
+++ b/Hutch/Views/Builds/BuildDetailView.swift
@@ -6,10 +6,14 @@ struct BuildDetailView: View {
@Environment(AppState.self) private var appState
@State private var viewModel: BuildDetailViewModel?
@State private var rebuiltJobId: Int?
- @State private var selectedTask: BuildTask?
+ @State private var selectedTaskName: String?
@State private var showEditResubmitSheet = false
@State private var showCancelConfirmation = false
+ private var isPresentingLogSheet: Bool {
+ selectedTaskName != nil
+ }
+
var body: some View {
Group {
if let viewModel {
@@ -42,18 +46,6 @@ struct BuildDetailView: View {
BuildDetailView(jobId: rebuiltJobId)
}
}
- .navigationDestination(isPresented: Binding(
- get: { selectedTask != nil },
- set: { isPresented in
- if !isPresented {
- selectedTask = nil
- }
- }
- )) {
- if let selectedTask, let viewModel {
- BuildTaskLogView(task: selectedTask, viewModel: viewModel)
- }
- }
.sheet(isPresented: $showEditResubmitSheet) {
if let viewModel, let job = viewModel.job {
EditResubmitBuildSheet(viewModel: viewModel, job: job) { jobId in
@@ -62,6 +54,38 @@ struct BuildDetailView: View {
}
}
}
+ .sheet(isPresented: Binding(
+ get: { selectedTaskName != nil },
+ set: { isPresented in
+ if !isPresented {
+ selectedTaskName = nil
+ }
+ }
+ )) {
+ if let selectedTaskName, let viewModel {
+ NavigationStack {
+ BuildTaskLogView(taskName: selectedTaskName, viewModel: viewModel)
+ .toolbar {
+ ToolbarItem(placement: .cancellationAction) {
+ Button("Done") {
+ self.selectedTaskName = nil
+ }
+ }
+ }
+ }
+ } else {
+ NavigationStack {
+ SRHTLoadingStateView(message: "Loading…")
+ .toolbar {
+ ToolbarItem(placement: .cancellationAction) {
+ Button("Done") {
+ self.selectedTaskName = nil
+ }
+ }
+ }
+ }
+ }
+ }
.alert("Cancel Build?", isPresented: $showCancelConfirmation) {
Button("Keep Running", role: .cancel) {}
Button("Cancel Build", role: .destructive) {
@@ -75,8 +99,16 @@ struct BuildDetailView: View {
let vm = BuildDetailViewModel(jobId: jobId, client: appState.client)
viewModel = vm
await vm.loadJob()
+ vm.startAutoRefresh()
}
}
+ .onAppear {
+ viewModel?.startAutoRefresh()
+ }
+ .onDisappear {
+ guard !isPresentingLogSheet else { return }
+ viewModel?.stopAutoRefresh()
+ }
}
@ViewBuilder
@@ -129,7 +161,7 @@ struct BuildDetailView: View {
ForEach(job.tasks) { task in
Section {
Button {
- selectedTask = task
+ selectedTaskName = task.name
} label: {
HStack {
Text(task.status.rawValue.capitalized)