diff options
| author | Christian Cleberg <[email protected]> | 2026-04-13 19:44:44 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-13 19:44:44 -0500 |
| commit | fe1ccc69661603d419a642a450e4ac9e1258adb0 (patch) | |
| tree | 386455b6b5468abdd9dfa46dd4802b10da8b77a2 /HutchWidgetExtension | |
| parent | 6ec9754ce34f331641b000eddef3d44bca2631a5 (diff) | |
| download | hutch-3.1.3.tar.gz hutch-3.1.3.tar.bz2 hutch-3.1.3.zip | |
fix: centralize URLs, tighten models, and polish SwiftUI bindingsv3.1.3
- Add shared HutchDeepLinkURL constants for app, widgets, and tests.
- Bump marketing version to 3.1.2 and build to 70 (app + widget extension).
- Point Hutch stats default base URL at HutchStatsAPI; add SRHTWebURL status
incident feed and reuse it from SystemStatusService.
- Group Project into Metadata and Resources; split ContributionStatsResponse
into StatsWindow and StatsTotals with updated decoding and tests.
- Replace @Bindable usage with explicit Bindings in Profile, Projects list,
and repository ACL flows; simplify Home pinned-item helper; add no-op
bodies on cancel alert buttons where the compiler requires a statement.
- Move repository row build-status indicator next to the relative-updated
caption and reserve a fixed 8×8 slot so the row does not jump when status
loads.
- Use NSString.lastPathComponent for build artifact filenames; collapse
duplicate ACL error branches; minor HutchStats HTTP and XMLParserDelegate
cleanups.
- Point widgets at HutchDeepLinkURL helpers; align tests with the new
response and URL types.
Diffstat (limited to 'HutchWidgetExtension')
| -rw-r--r-- | HutchWidgetExtension/ContributionGraphWidget.swift | 4 | ||||
| -rw-r--r-- | HutchWidgetExtension/NeedsAttentionWidget.swift | 14 | ||||
| -rw-r--r-- | HutchWidgetExtension/SystemStatusWidget.swift | 7 |
3 files changed, 12 insertions, 13 deletions
diff --git a/HutchWidgetExtension/ContributionGraphWidget.swift b/HutchWidgetExtension/ContributionGraphWidget.swift index 4245230..2fc07f2 100644 --- a/HutchWidgetExtension/ContributionGraphWidget.swift +++ b/HutchWidgetExtension/ContributionGraphWidget.swift @@ -112,7 +112,7 @@ private struct ContributionGraphWidgetView: View { graphView } } - .widgetURL(URL(string: "hutch://home")) + .widgetURL(HutchDeepLinkURL.home) .containerBackground(for: .widget) { Color(.systemBackground) } @@ -235,7 +235,7 @@ private enum ContributionGraphSizing { } private struct ContributionGraphWidgetService { - private let baseURL = URL(string: "https://hutch-stats.zerolabs.sh")! + private let baseURL = HutchStatsAPI.defaultBaseURL func fetchCalendar(actor: String) async throws -> ContributionGraphResponse { guard var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false) else { diff --git a/HutchWidgetExtension/NeedsAttentionWidget.swift b/HutchWidgetExtension/NeedsAttentionWidget.swift index 574e9eb..016f1c9 100644 --- a/HutchWidgetExtension/NeedsAttentionWidget.swift +++ b/HutchWidgetExtension/NeedsAttentionWidget.swift @@ -71,7 +71,7 @@ private struct NeedsAttentionWidgetView: View { fallbackState } } - .widgetURL(family == .systemSmall ? URL(string: "hutch://home") : nil) + .widgetURL(family == .systemSmall ? HutchDeepLinkURL.home : nil) .containerBackground(for: .widget) { Color(.systemBackground) } @@ -101,7 +101,7 @@ private struct NeedsAttentionWidgetView: View { private func mediumView(snapshot: NeedsAttentionSnapshot) -> some View { VStack(alignment: .leading, spacing: 0) { HStack(alignment: .top, spacing: 12) { - Link(destination: URL(string: "hutch://home")!) { + Link(destination: HutchDeepLinkURL.home) { metricColumn( count: snapshot.unreadInboxThreads, label: "Unread", @@ -109,14 +109,14 @@ private struct NeedsAttentionWidgetView: View { tint: unreadTint(for: snapshot.unreadInboxThreads) ) } - Link(destination: URL(string: "hutch://trackers")!) { + Link(destination: HutchDeepLinkURL.trackers) { metricColumn( count: snapshot.assignedOpenTickets, label: "Assigned", systemImage: "ticket" ) } - Link(destination: URL(string: "hutch://builds")!) { + Link(destination: HutchDeepLinkURL.builds) { metricColumn( count: snapshot.failedBuilds, label: "Failed", @@ -134,7 +134,7 @@ private struct NeedsAttentionWidgetView: View { private func largeView(snapshot: NeedsAttentionSnapshot) -> some View { VStack(alignment: .leading, spacing: 18) { - Link(destination: URL(string: "hutch://home")!) { + Link(destination: HutchDeepLinkURL.home) { metricRow( count: snapshot.unreadInboxThreads, label: "Unread threads", @@ -142,14 +142,14 @@ private struct NeedsAttentionWidgetView: View { tint: unreadTint(for: snapshot.unreadInboxThreads) ) } - Link(destination: URL(string: "hutch://trackers")!) { + Link(destination: HutchDeepLinkURL.trackers) { metricRow( count: snapshot.assignedOpenTickets, label: "Assigned tickets", systemImage: "ticket" ) } - Link(destination: URL(string: "hutch://builds")!) { + Link(destination: HutchDeepLinkURL.builds) { metricRow( count: snapshot.failedBuilds, label: "Failed builds", diff --git a/HutchWidgetExtension/SystemStatusWidget.swift b/HutchWidgetExtension/SystemStatusWidget.swift index 4a3c1e5..a0908bb 100644 --- a/HutchWidgetExtension/SystemStatusWidget.swift +++ b/HutchWidgetExtension/SystemStatusWidget.swift @@ -63,17 +63,16 @@ private struct SystemStatusWidgetView: View { var body: some View { Group { if let snapshot = entry.snapshot, !snapshot.services.isEmpty { - switch family { - case .systemMedium: + if family == .systemMedium { mediumView(snapshot: snapshot) - default: + } else { smallView(snapshot: snapshot) } } else { fallbackView } } - .widgetURL(URL(string: "hutch://status")) + .widgetURL(HutchDeepLinkURL.status) .containerBackground(for: .widget) { Color(.systemBackground) } |
