krz/hutch

an ios client for sourcehut

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

v2.16.0: Shared/SystemStatusWidgetSnapshot.swift · raw

 1import Foundation
 2#if canImport(WidgetKit)
 3import WidgetKit
 4#endif
 5
 6enum SystemStatusWidgetConfiguration {
 7    static let kind = "SystemStatusWidget"
 8}
 9
10struct SystemStatusWidgetSnapshot: Codable, Sendable {
11    let services: [ServiceEntry]
12    let hasDisruption: Bool
13    let overallStatusText: String
14    let bannerSummary: String
15    let updatedAt: Date
16
17    struct ServiceEntry: Codable, Sendable, Identifiable {
18        let id: String
19        let name: String
20        let status: String
21        let requiresAttention: Bool
22    }
23
24    static let unavailable = SystemStatusWidgetSnapshot(
25        services: [],
26        hasDisruption: false,
27        overallStatusText: "Unavailable",
28        bannerSummary: "",
29        updatedAt: .now
30    )
31}
32
33enum SystemStatusWidgetSnapshotStore {
34    private static let snapshotKey = "systemStatus.widgetSnapshot"
35
36    static func load(defaults: UserDefaults? = sharedDefaults()) -> SystemStatusWidgetSnapshot? {
37        guard let defaults,
38              let data = defaults.data(forKey: snapshotKey) else {
39            return nil
40        }
41        return try? JSONDecoder().decode(SystemStatusWidgetSnapshot.self, from: data)
42    }
43
44    static func save(_ snapshot: SystemStatusWidgetSnapshot, defaults: UserDefaults? = sharedDefaults()) {
45        guard let defaults,
46              let data = try? JSONEncoder().encode(snapshot) else {
47            return
48        }
49        defaults.set(data, forKey: snapshotKey)
50        reloadWidgetTimelines()
51    }
52
53    static func clear(defaults: UserDefaults? = sharedDefaults()) {
54        defaults?.removeObject(forKey: snapshotKey)
55        reloadWidgetTimelines()
56    }
57
58    private static func sharedDefaults() -> UserDefaults? {
59        UserDefaults(suiteName: HutchAppGroup.identifier)
60    }
61
62    private static func reloadWidgetTimelines() {
63        #if canImport(WidgetKit)
64        WidgetCenter.shared.reloadTimelines(ofKind: SystemStatusWidgetConfiguration.kind)
65        #endif
66    }
67}