summaryrefslogtreecommitdiff
path: root/Hutch/Views/SystemStatus/SystemStatusViewModel.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-11 23:36:35 -0500
committerChristian Cleberg <[email protected]>2026-04-11 23:36:35 -0500
commit00cc231e9b419d27b412036d93457c2cbabe0b16 (patch)
tree6b042b802fcddcd1e03f1ae0f666965620225485 /Hutch/Views/SystemStatus/SystemStatusViewModel.swift
parent0fde7529ceaebf1cd9baa01826d95d587023d001 (diff)
downloadhutch-00cc231e9b419d27b412036d93457c2cbabe0b16.tar.gz
hutch-00cc231e9b419d27b412036d93457c2cbabe0b16.tar.bz2
hutch-00cc231e9b419d27b412036d93457c2cbabe0b16.zip
Add SourceHut system status screen and home disruption banner
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
+ }
+ }
+ }
+}