summaryrefslogtreecommitdiff
path: root/Shared/SystemStatusWidgetSnapshot.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Shared/SystemStatusWidgetSnapshot.swift')
-rw-r--r--Shared/SystemStatusWidgetSnapshot.swift67
1 files changed, 67 insertions, 0 deletions
diff --git a/Shared/SystemStatusWidgetSnapshot.swift b/Shared/SystemStatusWidgetSnapshot.swift
new file mode 100644
index 0000000..8489547
--- /dev/null
+++ b/Shared/SystemStatusWidgetSnapshot.swift
@@ -0,0 +1,67 @@
+import Foundation
+#if canImport(WidgetKit)
+import WidgetKit
+#endif
+
+enum SystemStatusWidgetConfiguration {
+ static let kind = "SystemStatusWidget"
+}
+
+struct SystemStatusWidgetSnapshot: Codable, Sendable {
+ let services: [ServiceEntry]
+ let hasDisruption: Bool
+ let overallStatusText: String
+ let bannerSummary: String
+ let updatedAt: Date
+
+ struct ServiceEntry: Codable, Sendable, Identifiable {
+ let id: String
+ let name: String
+ let status: String
+ let requiresAttention: Bool
+ }
+
+ static let unavailable = SystemStatusWidgetSnapshot(
+ services: [],
+ hasDisruption: false,
+ overallStatusText: "Unavailable",
+ bannerSummary: "",
+ updatedAt: .now
+ )
+}
+
+enum SystemStatusWidgetSnapshotStore {
+ private static let snapshotKey = "systemStatus.widgetSnapshot"
+
+ static func load(defaults: UserDefaults? = sharedDefaults()) -> SystemStatusWidgetSnapshot? {
+ guard let defaults,
+ let data = defaults.data(forKey: snapshotKey) else {
+ return nil
+ }
+ return try? JSONDecoder().decode(SystemStatusWidgetSnapshot.self, from: data)
+ }
+
+ static func save(_ snapshot: SystemStatusWidgetSnapshot, defaults: UserDefaults? = sharedDefaults()) {
+ guard let defaults,
+ let data = try? JSONEncoder().encode(snapshot) else {
+ return
+ }
+ defaults.set(data, forKey: snapshotKey)
+ reloadWidgetTimelines()
+ }
+
+ static func clear(defaults: UserDefaults? = sharedDefaults()) {
+ defaults?.removeObject(forKey: snapshotKey)
+ reloadWidgetTimelines()
+ }
+
+ private static func sharedDefaults() -> UserDefaults? {
+ UserDefaults(suiteName: HutchAppGroup.identifier)
+ }
+
+ private static func reloadWidgetTimelines() {
+ #if canImport(WidgetKit)
+ WidgetCenter.shared.reloadTimelines(ofKind: SystemStatusWidgetConfiguration.kind)
+ #endif
+ }
+}