Skip to content

Commit 5397401

Browse files
committed
Make DeltaTag and AnalyticsLineChart optional in the AnalyticsReportCard
1 parent eed8364 commit 5397401

File tree

3 files changed

+138
-25
lines changed

3 files changed

+138
-25
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsReportCard.swift

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import SwiftUI
22

3-
/// Resuable report card made for the Analytics Hub.
3+
/// Reusable report card made for the Analytics Hub.
44
///
55
struct AnalyticsReportCard: View {
66

77
let title: String
88
let leadingTitle: String
99
let leadingValue: String
10-
let leadingDelta: String
11-
let leadingDeltaColor: UIColor
12-
let leadingDeltaTextColor: UIColor
10+
let leadingDelta: String?
11+
let leadingDeltaColor: UIColor?
12+
let leadingDeltaTextColor: UIColor?
1313
let leadingChartData: [Double]
14-
let leadingChartColor: UIColor
14+
let leadingChartColor: UIColor?
1515
let trailingTitle: String
1616
let trailingValue: String
17-
let trailingDelta: String
18-
let trailingDeltaColor: UIColor
19-
let trailingDeltaTextColor: UIColor
17+
let trailingDelta: String?
18+
let trailingDeltaColor: UIColor?
19+
let trailingDeltaTextColor: UIColor?
2020
let trailingChartData: [Double]
21-
let trailingChartColor: UIColor
21+
let trailingChartColor: UIColor?
2222

2323
let isRedacted: Bool
2424

@@ -50,14 +50,18 @@ struct AnalyticsReportCard: View {
5050
.shimmering(active: isRedacted)
5151

5252
AdaptiveStack(horizontalAlignment: .leading) {
53-
DeltaTag(value: leadingDelta, backgroundColor: leadingDeltaColor, textColor: leadingDeltaTextColor)
54-
.frame(maxWidth: .infinity, alignment: .leading)
55-
.redacted(reason: isRedacted ? .placeholder : [])
56-
.shimmering(active: isRedacted)
57-
58-
AnalyticsLineChart(dataPoints: leadingChartData, lineChartColor: leadingChartColor)
59-
.aspectRatio(Layout.chartAspectRatio, contentMode: .fit)
60-
.frame(maxWidth: scaledChartWidth)
53+
if let leadingDelta, let leadingDeltaColor, let leadingDeltaTextColor {
54+
DeltaTag(value: leadingDelta, backgroundColor: leadingDeltaColor, textColor: leadingDeltaTextColor)
55+
.frame(maxWidth: .infinity, alignment: .leading)
56+
.redacted(reason: isRedacted ? .placeholder : [])
57+
.shimmering(active: isRedacted)
58+
}
59+
60+
if leadingChartData.isNotEmpty, let leadingChartColor {
61+
AnalyticsLineChart(dataPoints: leadingChartData, lineChartColor: leadingChartColor)
62+
.aspectRatio(Layout.chartAspectRatio, contentMode: .fit)
63+
.frame(maxWidth: scaledChartWidth)
64+
}
6165
}
6266

6367
}
@@ -75,14 +79,18 @@ struct AnalyticsReportCard: View {
7579
.shimmering(active: isRedacted)
7680

7781
AdaptiveStack(horizontalAlignment: .leading) {
78-
DeltaTag(value: trailingDelta, backgroundColor: trailingDeltaColor, textColor: trailingDeltaTextColor)
79-
.frame(maxWidth: .infinity, alignment: .leading)
80-
.redacted(reason: isRedacted ? .placeholder : [])
81-
.shimmering(active: isRedacted)
82-
83-
AnalyticsLineChart(dataPoints: trailingChartData, lineChartColor: trailingChartColor)
84-
.aspectRatio(Layout.chartAspectRatio, contentMode: .fit)
85-
.frame(maxWidth: scaledChartWidth)
82+
if let trailingDelta, let trailingDeltaColor, let trailingDeltaTextColor {
83+
DeltaTag(value: trailingDelta, backgroundColor: trailingDeltaColor, textColor: trailingDeltaTextColor)
84+
.frame(maxWidth: .infinity, alignment: .leading)
85+
.redacted(reason: isRedacted ? .placeholder : [])
86+
.shimmering(active: isRedacted)
87+
}
88+
89+
if trailingChartData.isNotEmpty, let trailingChartColor {
90+
AnalyticsLineChart(dataPoints: trailingChartData, lineChartColor: trailingChartColor)
91+
.aspectRatio(Layout.chartAspectRatio, contentMode: .fit)
92+
.frame(maxWidth: scaledChartWidth)
93+
}
8694
}
8795
}
8896
.frame(maxWidth: .infinity, alignment: .leading)
@@ -155,5 +163,26 @@ struct Previews: PreviewProvider {
155163
syncErrorMessage: "Error loading revenue analytics")
156164
.previewLayout(.sizeThatFits)
157165
.previewDisplayName("No data")
166+
167+
AnalyticsReportCard(title: "SESSIONS",
168+
leadingTitle: "Views",
169+
leadingValue: "1,458",
170+
leadingDelta: nil,
171+
leadingDeltaColor: nil,
172+
leadingDeltaTextColor: nil,
173+
leadingChartData: [],
174+
leadingChartColor: nil,
175+
trailingTitle: "Conversion Rate",
176+
trailingValue: "4.5%",
177+
trailingDelta: nil,
178+
trailingDeltaColor: nil,
179+
trailingDeltaTextColor: nil,
180+
trailingChartData: [],
181+
trailingChartColor: nil,
182+
isRedacted: false,
183+
showSyncError: true,
184+
syncErrorMessage: "")
185+
.previewLayout(.sizeThatFits)
186+
.previewDisplayName("Current period only")
158187
}
159188
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import Foundation
2+
3+
/// Analytics Hub Report Card Current Period ViewModel.
4+
/// Used to transmit analytics report data for the current period (no comparison to previous periods).
5+
///
6+
struct AnalyticsReportCardCurrentPeriodViewModel {
7+
/// Report Card Title.
8+
///
9+
let title: String
10+
11+
/// First Column Title
12+
///
13+
let leadingTitle: String
14+
15+
/// First Column Value
16+
///
17+
let leadingValue: String
18+
19+
/// Second Column Title
20+
///
21+
let trailingTitle: String
22+
23+
/// Second Column Value
24+
///
25+
let trailingValue: String
26+
27+
/// Indicates if the values should be hidden (for loading state)
28+
///
29+
let isRedacted: Bool
30+
31+
/// Indicates if there was an error loading the data for the card
32+
///
33+
let showSyncError: Bool
34+
35+
/// Message to display if there was an error loading the data for the card
36+
///
37+
let syncErrorMessage: String
38+
}
39+
40+
extension AnalyticsReportCardCurrentPeriodViewModel {
41+
42+
/// Make redacted state of the card, replacing values with hardcoded placeholders
43+
///
44+
var redacted: Self {
45+
// Values here are placeholders and will be redacted in the UI
46+
.init(title: title,
47+
leadingTitle: leadingTitle,
48+
leadingValue: "$1000",
49+
trailingTitle: trailingTitle,
50+
trailingValue: "$1000",
51+
isRedacted: true,
52+
showSyncError: false,
53+
syncErrorMessage: "")
54+
}
55+
}
56+
57+
/// Convenience extension to create an `AnalyticsReportCard` from a view model.
58+
///
59+
extension AnalyticsReportCard {
60+
init(viewModel: AnalyticsReportCardCurrentPeriodViewModel) {
61+
self.title = viewModel.title
62+
self.leadingTitle = viewModel.leadingTitle
63+
self.leadingValue = viewModel.leadingValue
64+
self.leadingDelta = nil
65+
self.leadingDeltaColor = nil
66+
self.leadingDeltaTextColor = nil
67+
self.leadingChartData = []
68+
self.leadingChartColor = nil
69+
self.trailingTitle = viewModel.trailingTitle
70+
self.trailingValue = viewModel.trailingValue
71+
self.trailingDelta = nil
72+
self.trailingDeltaColor = nil
73+
self.trailingDeltaTextColor = nil
74+
self.trailingChartData = []
75+
self.trailingChartColor = nil
76+
self.isRedacted = viewModel.isRedacted
77+
self.showSyncError = viewModel.showSyncError
78+
self.syncErrorMessage = viewModel.syncErrorMessage
79+
}
80+
}

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,7 @@
14801480
CC8413E523F5C49100EFC277 /* start.sh in Resources */ = {isa = PBXBuildFile; fileRef = CCFC011023E9E3F400157A78 /* start.sh */; };
14811481
CC923A1D2847A8E0008EEEBE /* OrderStatusListViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC923A1C2847A8E0008EEEBE /* OrderStatusListViewModelTests.swift */; };
14821482
CCA1D5FE293F537400B40560 /* DeltaPercentage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA1D5FD293F537400B40560 /* DeltaPercentage.swift */; };
1483+
CCA1D6022943636100B40560 /* AnalyticsReportCardCurrentPeriodViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA1D6012943636100B40560 /* AnalyticsReportCardCurrentPeriodViewModel.swift */; };
14831484
CCB366AF274518EC007D437A /* EditableOrderViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCB366AE274518EC007D437A /* EditableOrderViewModelTests.swift */; };
14841485
CCC284112768C18500F6CC8B /* ProductInOrder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC284102768C18500F6CC8B /* ProductInOrder.swift */; };
14851486
CCCC29DD25E5757C0046B96F /* RenameAttributesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CCCC29DC25E5757C0046B96F /* RenameAttributesViewController.xib */; };
@@ -3506,6 +3507,7 @@
35063507
CC77488D2719A07D0043CDD7 /* ShippingLabelAddressTopBannerFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingLabelAddressTopBannerFactoryTests.swift; sourceTree = "<group>"; };
35073508
CC923A1C2847A8E0008EEEBE /* OrderStatusListViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderStatusListViewModelTests.swift; sourceTree = "<group>"; };
35083509
CCA1D5FD293F537400B40560 /* DeltaPercentage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeltaPercentage.swift; sourceTree = "<group>"; };
3510+
CCA1D6012943636100B40560 /* AnalyticsReportCardCurrentPeriodViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsReportCardCurrentPeriodViewModel.swift; sourceTree = "<group>"; };
35093511
CCB366AE274518EC007D437A /* EditableOrderViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditableOrderViewModelTests.swift; sourceTree = "<group>"; };
35103512
CCC284102768C18500F6CC8B /* ProductInOrder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductInOrder.swift; sourceTree = "<group>"; };
35113513
CCCC29DC25E5757C0046B96F /* RenameAttributesViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RenameAttributesViewController.xib; sourceTree = "<group>"; };
@@ -5371,6 +5373,7 @@
53715373
26E7EE69292D688900793045 /* AnalyticsHubViewModel.swift */,
53725374
2647F7B9292BE2F900D59FDF /* AnalyticsReportCard.swift */,
53735375
26E7EE6B292D894100793045 /* AnalyticsReportCardViewModel.swift */,
5376+
CCA1D6012943636100B40560 /* AnalyticsReportCardCurrentPeriodViewModel.swift */,
53745377
B60B5025292D308A00178C26 /* AnalyticsTimeRangeCard.swift */,
53755378
B6A10E9B292E5DEE00790797 /* AnalyticsTimeRangeCardViewModel.swift */,
53765379
26E7EE6D29300E8100793045 /* AnalyticsProductCard.swift */,
@@ -10568,6 +10571,7 @@
1056810571
EEADF624281A421A001B40F1 /* DefaultShippingValueLocalizer.swift in Sources */,
1056910572
0263E3BB290BB21800E5F88F /* WooAnalyticsEvent+StoreCreation.swift in Sources */,
1057010573
4A68E3E32941D4CE004AC3DC /* WordPressLibraryLogger.swift in Sources */,
10574+
CCA1D6022943636100B40560 /* AnalyticsReportCardCurrentPeriodViewModel.swift in Sources */,
1057110575
174CA86E27DBFD2D00126524 /* ShareAppTextItemActivitySource.swift in Sources */,
1057210576
262C921F26EEF8B100011F92 /* Binding.swift in Sources */,
1057310577
DE4FB7732812AE96003D20D6 /* FilterListView.swift in Sources */,

0 commit comments

Comments
 (0)