From 00cc231e9b419d27b412036d93457c2cbabe0b16 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Sat, 11 Apr 2026 23:36:35 -0500 Subject: Add SourceHut system status screen and home disruption banner --- Hutch/Models/SystemStatusModels.swift | 84 +++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Hutch/Models/SystemStatusModels.swift (limited to 'Hutch/Models/SystemStatusModels.swift') diff --git a/Hutch/Models/SystemStatusModels.swift b/Hutch/Models/SystemStatusModels.swift new file mode 100644 index 0000000..9a664b0 --- /dev/null +++ b/Hutch/Models/SystemStatusModels.swift @@ -0,0 +1,84 @@ +import Foundation + +enum StatusLevel: String, Codable, Sendable { + case operational + case degraded + case majorOutage + case maintenance + case unknown + + var displayName: String { + switch self { + case .operational: + "Operational" + case .degraded: + "Degraded" + case .majorOutage: + "Major outage" + case .maintenance: + "Maintenance" + case .unknown: + "Unknown" + } + } + + var requiresAttention: Bool { + switch self { + case .degraded, .majorOutage, .maintenance: + true + case .operational, .unknown: + false + } + } +} + +struct StatusServiceState: Identifiable, Hashable, Codable, Sendable { + let id: String + let name: String + let slug: String? + let status: StatusLevel + let description: String? +} + +struct StatusIncident: Identifiable, Hashable, Codable, Sendable { + let id: String + let title: String + let summary: String? + let url: URL? + let publishedAt: Date + let updatedAt: Date? + let isActive: Bool? +} + +struct SystemStatusSnapshot: Hashable, Codable, Sendable { + let services: [StatusServiceState] + let activeIncidents: [StatusIncident] + let lastUpdated: Date + + var disruptedServices: [StatusServiceState] { + services.filter { $0.status.requiresAttention } + } + + var hasDisruption: Bool { + !disruptedServices.isEmpty + } + + var overallStatusText: String { + hasDisruption ? "Experiencing disruptions" : "All monitored services operational" + } + + var bannerSummary: String { + if disruptedServices.count == 1, let service = disruptedServices.first { + return "\(service.name) disrupted" + } + if disruptedServices.count > 1 { + return "\(disruptedServices.count) services disrupted" + } + return "SourceHut service disruption" + } +} + +struct SystemStatusPageData: Sendable { + let snapshot: SystemStatusSnapshot + let recentIncidents: [StatusIncident] +} -- cgit v1.2.3