summaryrefslogtreecommitdiff
path: root/Hutch/Views/More/MoreViewModel.swift
blob: 8f23975c7771f594431368aea62440aa00c1cc41 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import Foundation

@Observable
@MainActor
final class MoreViewModel {
    private let repository: SystemStatusRepository

    private(set) var systemStatusSnapshot: SystemStatusSnapshot?
    private(set) var isLoadingSystemStatus = false
    private(set) var isShowingStaleSystemStatus = false
    private(set) var systemStatusErrorMessage: String?

    init(repository: SystemStatusRepository) {
        self.repository = repository
    }

    func loadIfNeeded() async {
        guard systemStatusSnapshot == nil, !isLoadingSystemStatus else { return }
        await loadSystemStatus()
    }

    func loadSystemStatus(forceRefresh: Bool = false) async {
        isLoadingSystemStatus = true
        defer { isLoadingSystemStatus = false }
        isShowingStaleSystemStatus = false
        systemStatusErrorMessage = nil

        do {
            let result = try await repository.snapshotResult(forceRefresh: forceRefresh)
            systemStatusSnapshot = result.value
            isShowingStaleSystemStatus = result.isStale
            systemStatusErrorMessage = result.isStale ? result.refreshErrorMessage : nil
        } catch {
            if systemStatusSnapshot == nil {
                systemStatusErrorMessage = error.userFacingMessage
            }
        }
    }
}