From fe1ccc69661603d419a642a450e4ac9e1258adb0 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 13 Apr 2026 19:44:44 -0500 Subject: fix: centralize URLs, tighten models, and polish SwiftUI bindings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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. --- Hutch/Models/Project.swift | 54 +++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 24 deletions(-) (limited to 'Hutch/Models/Project.swift') diff --git a/Hutch/Models/Project.swift b/Hutch/Models/Project.swift index 678d52e..bbca7d6 100644 --- a/Hutch/Models/Project.swift +++ b/Hutch/Models/Project.swift @@ -71,30 +71,36 @@ struct Project: Identifiable, Hashable, Sendable { let trackers: [Tracker] let isFullyLoaded: Bool - init( - id: String, - name: String, - description: String?, - website: String?, - visibility: Visibility, - tags: [String], - updated: Date, - mailingLists: [MailingList], - sources: [SourceRepo], - trackers: [Tracker], - isFullyLoaded: Bool = true - ) { - self.id = id - self.name = name - self.description = description - self.website = website - self.visibility = visibility - self.tags = tags - self.updated = updated - self.mailingLists = mailingLists - self.sources = sources - self.trackers = trackers - self.isFullyLoaded = isFullyLoaded + /// Identity and display fields for a project. + struct Metadata: Sendable, Hashable { + let id: String + let name: String + let description: String? + let website: String? + let visibility: Visibility + let tags: [String] + let updated: Date + } + + struct Resources: Sendable, Hashable { + let mailingLists: [MailingList] + let sources: [SourceRepo] + let trackers: [Tracker] + let isFullyLoaded: Bool + } + + init(metadata: Metadata, resources: Resources) { + id = metadata.id + name = metadata.name + description = metadata.description + website = metadata.website + visibility = metadata.visibility + tags = metadata.tags + updated = metadata.updated + mailingLists = resources.mailingLists + sources = resources.sources + trackers = resources.trackers + isFullyLoaded = resources.isFullyLoaded } var resourceSummary: String? { -- cgit v1.2.3