summaryrefslogtreecommitdiff
path: root/Hutch/Views/SystemStatus/SystemStatusViewModel.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Hutch/Views/SystemStatus/SystemStatusViewModel.swift')
-rw-r--r--Hutch/Views/SystemStatus/SystemStatusViewModel.swift48
1 files changed, 48 insertions, 0 deletions
diff --git a/Hutch/Views/SystemStatus/SystemStatusViewModel.swift b/Hutch/Views/SystemStatus/SystemStatusViewModel.swift
new file mode 100644
index 0000000..646d7ca
--- /dev/null
+++ b/Hutch/Views/SystemStatus/SystemStatusViewModel.swift
@@ -0,0 +1,48 @@
+import Foundation
+
+@Observable
+@MainActor
+final class SystemStatusViewModel {
+ private let repository: SystemStatusRepository
+
+ private(set) var snapshot: SystemStatusSnapshot?
+ private(set) var recentIncidents: [StatusIncident] = []
+ private(set) var isLoading = false
+ var errorMessage: String?
+
+ init(repository: SystemStatusRepository) {
+ self.repository = repository
+ }
+
+ var hasContent: Bool {
+ snapshot != nil || !recentIncidents.isEmpty
+ }
+
+ func load(forceRefresh: Bool = false) async {
+ if !hasContent {
+ isLoading = true
+ }
+ defer { isLoading = false }
+
+ errorMessage = nil
+
+ async let snapshotTask = repository.snapshot(forceRefresh: forceRefresh)
+ async let incidentsTask = repository.recentIncidents(forceRefresh: forceRefresh)
+
+ do {
+ snapshot = try await snapshotTask
+ } catch {
+ if snapshot == nil {
+ errorMessage = error.userFacingMessage
+ }
+ }
+
+ do {
+ recentIncidents = try await incidentsTask
+ } catch {
+ if errorMessage == nil && recentIncidents.isEmpty {
+ errorMessage = error.userFacingMessage
+ }
+ }
+ }
+}