From 654a54ac46f5bd2b4e027e6b07888661ad63804e Mon Sep 17 00:00:00 2001 From: Tony Li Date: Thu, 20 Aug 2026 19:07:43 +1200 Subject: [PATCH 1/2] Apply swift-format to stats detail screens Formatting-only pass produced by the repository's swift-format hook on ReferrerStatsView, ExternalLinkStatsView, and ArchiveStatsView, committed separately to keep the subsequent change reviewable. --- .../JetpackStats/Screens/ArchiveStatsView.swift | 2 +- .../JetpackStats/Screens/ExternalLinkStatsView.swift | 7 ++++--- .../JetpackStats/Screens/ReferrerStatsView.swift | 10 ++++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift b/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift index ed348a5c6a34..a46f641e8d5a 100644 --- a/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift +++ b/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift @@ -75,7 +75,7 @@ struct ArchiveStatsView: View { } private var itemsChartData: TopListData { - return TopListData( + TopListData( item: .archive, metric: .views, items: archiveSection.items diff --git a/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift b/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift index 0c7b8051d41a..d2e568f50337 100644 --- a/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift +++ b/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift @@ -66,8 +66,9 @@ struct ExternalLinkStatsView: View { @ViewBuilder var linkIcon: some View { if let url = URL(string: externalLink.url), - let host = url.host, - let iconURL = URL(string: "https://www.google.com/s2/favicons?domain=\(host)&sz=128") { + let host = url.host, + let iconURL = URL(string: "https://www.google.com/s2/favicons?domain=\(host)&sz=128") + { CachedAsyncImage(url: iconURL) { image in image .resizable() @@ -131,7 +132,7 @@ struct ExternalLinkStatsView: View { } private var childrenChartData: TopListData { - return TopListData( + TopListData( item: .externalLinks, metric: .views, items: externalLink.children diff --git a/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift b/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift index cc56a9d60e30..e1105e3ede97 100644 --- a/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift +++ b/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift @@ -39,7 +39,7 @@ struct ReferrerStatsView: View { .navigationTitle(Strings.ReferrerDetails.title) .navigationBarTitleDisplayMode(.inline) .alert(Strings.ReferrerDetails.errorAlertTitle, isPresented: $showErrorAlert) { - Button(Strings.Buttons.ok, role: .cancel) { } + Button(Strings.Buttons.ok, role: .cancel) {} } message: { Text(errorMessage) } @@ -66,7 +66,7 @@ struct ReferrerStatsView: View { await markAsSpam() } } - Button(Strings.Buttons.cancel, role: .cancel) { } + Button(Strings.Buttons.cancel, role: .cancel) {} } message: { Text(Strings.ReferrerDetails.confirmAsSpamMessage(domain: referrer.domain ?? "")) } @@ -170,7 +170,7 @@ struct ReferrerStatsView: View { } private var childrenChartData: TopListData { - return TopListData( + TopListData( item: .referrers, metric: .views, items: referrer.children @@ -187,7 +187,9 @@ struct ReferrerStatsView: View { // Update local state to reflect the change isMarkedAsSpam = true } catch { - errorMessage = error.localizedDescription.isEmpty ? Strings.ReferrerDetails.markAsSpamError : error.localizedDescription + errorMessage = + error.localizedDescription.isEmpty + ? Strings.ReferrerDetails.markAsSpamError : error.localizedDescription showErrorAlert = true } From a0c8e181877357559f46e35ba6682213ef71c3ec Mon Sep 17 00:00:00 2001 From: Tony Li Date: Thu, 20 Aug 2026 19:08:04 +1200 Subject: [PATCH 2/2] Show the selected period on snapshot stats detail screens The Referrer, External Link, and Archive detail screens display a range-scoped views total, but nothing on screen states which period the number covers; the date range is frozen at push time and these screens have no fetch path, so they cannot host the interactive date range control. Add an optional dateInterval to StandaloneMetricView (used only by these three screens) that renders the formatted period as a secondary line under the value. The ReferrerStatsView preview mock now uses .last7Days so the preview exercises a date-style period label instead of a bare year. Part of CMM-2319. --- .../Screens/ArchiveStatsView.swift | 2 +- .../Screens/ExternalLinkStatsView.swift | 2 +- .../Screens/ReferrerStatsView.swift | 4 ++-- .../Views/StandaloneMetricView.swift | 19 +++++++++++++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift b/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift index a46f641e8d5a..6061053cd8b0 100644 --- a/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift +++ b/Modules/Sources/JetpackStats/Screens/ArchiveStatsView.swift @@ -45,7 +45,7 @@ struct ArchiveStatsView: View { Spacer() if let totalViews = archiveSection.metrics.views { - StandaloneMetricView(metric: .views, value: totalViews) + StandaloneMetricView(metric: .views, value: totalViews, dateInterval: dateRange.dateInterval) } } } diff --git a/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift b/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift index d2e568f50337..83b9a0211777 100644 --- a/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift +++ b/Modules/Sources/JetpackStats/Screens/ExternalLinkStatsView.swift @@ -101,7 +101,7 @@ struct ExternalLinkStatsView: View { @ViewBuilder var viewsCount: some View { if let views = externalLink.metrics.views { - StandaloneMetricView(metric: .views, value: views) + StandaloneMetricView(metric: .views, value: views, dateInterval: dateRange.dateInterval) } } diff --git a/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift b/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift index e1105e3ede97..6bc8174618f0 100644 --- a/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift +++ b/Modules/Sources/JetpackStats/Screens/ReferrerStatsView.swift @@ -122,7 +122,7 @@ struct ReferrerStatsView: View { @ViewBuilder var viewsCount: some View { if let views = referrer.metrics.views { - StandaloneMetricView(metric: .views, value: views) + StandaloneMetricView(metric: .views, value: views, dateInterval: dateRange.dateInterval) } } @@ -203,7 +203,7 @@ struct ReferrerStatsView: View { NavigationView { ReferrerStatsView( referrer: .mock, - dateRange: Calendar.demo.makeDateRange(for: .thisYear) + dateRange: Calendar.demo.makeDateRange(for: .last7Days) ) } .navigationViewStyle(.stack) diff --git a/Modules/Sources/JetpackStats/Views/StandaloneMetricView.swift b/Modules/Sources/JetpackStats/Views/StandaloneMetricView.swift index 06a007262dab..74d4e0dfb9de 100644 --- a/Modules/Sources/JetpackStats/Views/StandaloneMetricView.swift +++ b/Modules/Sources/JetpackStats/Views/StandaloneMetricView.swift @@ -4,6 +4,9 @@ import DesignSystem struct StandaloneMetricView: View { let metric: SiteMetric let value: Int + var dateInterval: DateInterval? + + @Environment(\.context) private var context var body: some View { VStack(alignment: .trailing, spacing: 0) { @@ -15,11 +18,23 @@ struct StandaloneMetricView: View { .font(Constants.Typography.smallDisplayFont) .foregroundColor(.primary) .contentTransition(.numericText()) + if let dateInterval { + Text(context.formatters.dateRange.string(from: dateInterval)) + .font(.footnote) + .foregroundColor(.secondary) + } } } } #Preview { - StandaloneMetricView(metric: .views, value: 12345) - .padding() + VStack(spacing: 32) { + StandaloneMetricView(metric: .views, value: 12345) + StandaloneMetricView( + metric: .views, + value: 12345, + dateInterval: Calendar.demo.makeDateRange(for: .last7Days).dateInterval + ) + } + .padding() }