summaryrefslogtreecommitdiff
path: root/DomainDig/DomainViewModel+Widget.swift
diff options
context:
space:
mode:
Diffstat (limited to 'DomainDig/DomainViewModel+Widget.swift')
-rw-r--r--DomainDig/DomainViewModel+Widget.swift60
1 files changed, 60 insertions, 0 deletions
diff --git a/DomainDig/DomainViewModel+Widget.swift b/DomainDig/DomainViewModel+Widget.swift
new file mode 100644
index 0000000..59b28e0
--- /dev/null
+++ b/DomainDig/DomainViewModel+Widget.swift
@@ -0,0 +1,60 @@
+import Foundation
+import WidgetKit
+
+extension DomainViewModel {
+ /// Publishes the current portfolio state to the App Group container so the
+ /// widget can render it, then asks WidgetKit to refresh its timelines.
+ func refreshWidgetData() {
+ let data = portfolioDashboardData
+ let snapshot = data.snapshot
+
+ let ordered = data.domainStates.sorted { lhs, rhs in
+ if lhs.trackedDomain.isPinned != rhs.trackedDomain.isPinned {
+ return lhs.trackedDomain.isPinned
+ }
+ return lhs.health.widgetSeverityRank > rhs.health.widgetSeverityRank
+ }
+
+ let domains = ordered.prefix(6).map { state in
+ DomainDigWidgetDomain(
+ domain: state.trackedDomain.domain,
+ isPinned: state.trackedDomain.isPinned,
+ status: state.health.widgetStatus,
+ certDaysRemaining: state.certificateDaysRemaining,
+ lastChange: state.lastChangeDate
+ )
+ }
+
+ DomainDigWidgetStore.write(
+ DomainDigWidgetData(
+ generatedAt: Date(),
+ totalDomains: snapshot.totalDomains,
+ healthyCount: snapshot.healthyCount,
+ warningCount: snapshot.warningCount,
+ criticalCount: snapshot.criticalCount,
+ expiringSoonCount: snapshot.expiringSoonCount,
+ unreachableCount: snapshot.unreachableCount,
+ domains: Array(domains)
+ )
+ )
+ WidgetCenter.shared.reloadAllTimelines()
+ }
+}
+
+private extension DomainHealth {
+ var widgetStatus: DomainDigWidgetStatus {
+ switch self {
+ case .healthy: return .healthy
+ case .warning: return .warning
+ case .critical: return .critical
+ }
+ }
+
+ var widgetSeverityRank: Int {
+ switch self {
+ case .healthy: return 0
+ case .warning: return 1
+ case .critical: return 2
+ }
+ }
+}