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}