krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v2.13.0: Hutch/Views/SystemStatus/SystemStatusViewModel.swift · raw

 1import Foundation
 2
 3@Observable
 4@MainActor
 5final class SystemStatusViewModel {
 6    private let repository: SystemStatusRepository
 7
 8    private(set) var snapshot: SystemStatusSnapshot?
 9    private(set) var recentIncidents: [StatusIncident] = []
10    private(set) var isLoading = false
11    var errorMessage: String?
12
13    init(repository: SystemStatusRepository) {
14        self.repository = repository
15    }
16
17    var hasContent: Bool {
18        snapshot != nil || !recentIncidents.isEmpty
19    }
20
21    func load(forceRefresh: Bool = false) async {
22        if !hasContent {
23            isLoading = true
24        }
25        defer { isLoading = false }
26
27        errorMessage = nil
28
29        async let snapshotTask = repository.snapshot(forceRefresh: forceRefresh)
30        async let incidentsTask = repository.recentIncidents(forceRefresh: forceRefresh)
31
32        do {
33            snapshot = try await snapshotTask
34        } catch {
35            if snapshot == nil {
36                errorMessage = error.userFacingMessage
37            }
38        }
39
40        do {
41            recentIncidents = try await incidentsTask
42        } catch {
43            if errorMessage == nil && recentIncidents.isEmpty {
44                errorMessage = error.userFacingMessage
45            }
46        }
47    }
48}