diff options
Diffstat (limited to 'Shared/SystemStatusWidgetSnapshot.swift')
| -rw-r--r-- | Shared/SystemStatusWidgetSnapshot.swift | 67 |
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 + } +} |
