summaryrefslogtreecommitdiff
path: root/Hutch/Views/Builds
diff options
context:
space:
mode:
Diffstat (limited to 'Hutch/Views/Builds')
-rw-r--r--Hutch/Views/Builds/BuildListView.swift1
-rw-r--r--Hutch/Views/Builds/BuildListViewModel.swift37
2 files changed, 38 insertions, 0 deletions
diff --git a/Hutch/Views/Builds/BuildListView.swift b/Hutch/Views/Builds/BuildListView.swift
index e248ca8..6bfbd6b 100644
--- a/Hutch/Views/Builds/BuildListView.swift
+++ b/Hutch/Views/Builds/BuildListView.swift
@@ -1,6 +1,7 @@
import SwiftUI
struct BuildListView: View {
+ @AppStorage(AppStorageKeys.swipeActionsEnabled) private var swipeActionsEnabled = true
@Environment(AppState.self) private var appState
@State private var viewModel: BuildListViewModel?
@State private var showSubmitSheet = false
diff --git a/Hutch/Views/Builds/BuildListViewModel.swift b/Hutch/Views/Builds/BuildListViewModel.swift
index 7b0b0b9..0757ad8 100644
--- a/Hutch/Views/Builds/BuildListViewModel.swift
+++ b/Hutch/Views/Builds/BuildListViewModel.swift
@@ -194,6 +194,35 @@ final class BuildListViewModel {
}
}
+ func cancelJob(_ job: JobSummary) async {
+ guard job.status.isCancellable else { return }
+
+ do {
+ _ = try await client.execute(
+ service: .builds,
+ query: Self.cancelMutation,
+ variables: ["id": job.id],
+ responseType: CancelResponse.self
+ )
+ if let index = jobs.firstIndex(where: { $0.id == job.id }) {
+ let updated = JobSummary(
+ id: job.id,
+ created: job.created,
+ updated: job.updated,
+ status: .cancelled,
+ note: job.note,
+ tags: job.tags,
+ visibility: job.visibility,
+ image: job.image,
+ tasks: job.tasks
+ )
+ jobs[index] = updated
+ }
+ } catch {
+ self.error = error.userFacingMessage
+ }
+ }
+
// MARK: - Private
private func fetchPage(cursor: String?, useCache: Bool) async throws -> JobsPage {
@@ -235,4 +264,12 @@ final class BuildListViewModel {
hasMore = page.cursor != nil
}
}
+
+ private struct CancelResponse: Decodable, Sendable {
+ struct CancelResult: Decodable, Sendable {
+ let id: Int
+ }
+
+ let cancel: CancelResult
+ }
}