diff options
Diffstat (limited to 'DomainDig/DomainViewModel+Widget.swift')
| -rw-r--r-- | DomainDig/DomainViewModel+Widget.swift | 60 |
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 + } + } +} |
