krz/hutch

an ios client for sourcehut

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

v3.2.0: Hutch/Views/More/MoreViewModel.swift · raw

 1import Foundation
 2
 3@Observable
 4@MainActor
 5final class MoreViewModel {
 6    private let repository: SystemStatusRepository
 7
 8    private(set) var systemStatusSnapshot: SystemStatusSnapshot?
 9    private(set) var isLoadingSystemStatus = false
10    private(set) var isShowingStaleSystemStatus = false
11    private(set) var systemStatusErrorMessage: String?
12
13    init(repository: SystemStatusRepository) {
14        self.repository = repository
15    }
16
17    func loadIfNeeded() async {
18        guard systemStatusSnapshot == nil, !isLoadingSystemStatus else { return }
19        await loadSystemStatus()
20    }
21
22    func loadSystemStatus(forceRefresh: Bool = false) async {
23        isLoadingSystemStatus = true
24        defer { isLoadingSystemStatus = false }
25        isShowingStaleSystemStatus = false
26        systemStatusErrorMessage = nil
27
28        do {
29            let result = try await repository.snapshotResult(forceRefresh: forceRefresh)
30            systemStatusSnapshot = result.value
31            isShowingStaleSystemStatus = result.isStale
32            systemStatusErrorMessage = result.isStale ? result.refreshErrorMessage : nil
33        } catch {
34            if systemStatusSnapshot == nil {
35                systemStatusErrorMessage = error.userFacingMessage
36            }
37        }
38    }
39}