From 9050405b4f33b2b9b70458fcf3e43b80c940eef7 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Sun, 12 Apr 2026 00:55:42 -0500 Subject: add shortcuts widgets and power-user workflows --- Shared/SystemStatusWidgetSnapshot.swift | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Shared/SystemStatusWidgetSnapshot.swift (limited to 'Shared/SystemStatusWidgetSnapshot.swift') 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 + } +} -- cgit v1.2.3