Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import SwiftUI
///
final class AnalyticsHubHostingViewController: UIHostingController<AnalyticsHubView> {
init(timeRange: StatsTimeRangeV4) {
super.init(rootView: AnalyticsHubView())
let viewModel = AnalyticsHubViewModel()
super.init(rootView: AnalyticsHubView(viewModel: viewModel))
}

@available(*, unavailable)
Expand All @@ -19,10 +20,12 @@ final class AnalyticsHubHostingViewController: UIHostingController<AnalyticsHubV
///
struct AnalyticsHubView: View {

@StateObject var viewModel: AnalyticsHubViewModel

var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: Layout.vertialSpacing) {
VStack(spacing: 0) {
VStack(spacing: Layout.dividerSpacing) {
Divider()
Text("Placeholder for Time Range Selection")
.padding(.leading)
Expand All @@ -33,35 +36,19 @@ struct AnalyticsHubView: View {
}


VStack(spacing: 0) {
VStack(spacing: Layout.dividerSpacing) {
Divider()

AnalyticsReportCard(title: "REVENUE",
leadingTitle: "Total Sales",
leadingValue: "$3.234",
leadingDelta: "+23%",
leadingDeltaColor: .withColorStudio(.green, shade: .shade50),
trailingTitle: "Net Sales",
trailingValue: "$2.324",
trailingDelta: "-4%",
trailingDeltaColor: .withColorStudio(.red, shade: .shade40))
AnalyticsReportCard(viewModel: viewModel.revenueCard)
.background(Color(uiColor: .listForeground))

Divider()
}

VStack(spacing: 0) {
VStack(spacing: Layout.dividerSpacing) {
Divider()

AnalyticsReportCard(title: "ORDERS",
leadingTitle: "Total Orders",
leadingValue: "145",
leadingDelta: "+36%",
leadingDeltaColor: .withColorStudio(.green, shade: .shade50),
trailingTitle: "Average Order Value",
trailingValue: "$57,99",
trailingDelta: "-16%",
trailingDeltaColor: .withColorStudio(.red, shade: .shade40))
AnalyticsReportCard(viewModel: viewModel.ordersCard)
.background(Color(uiColor: .listForeground))

Divider()
Expand All @@ -85,6 +72,7 @@ private extension AnalyticsHubView {

struct Layout {
static let vertialSpacing: CGFloat = 24.0
static let dividerSpacing: CGFloat = .zero
}
}

Expand All @@ -93,7 +81,7 @@ private extension AnalyticsHubView {
struct AnalyticsHubPreview: PreviewProvider {
static var previews: some View {
NavigationView {
AnalyticsHubView()
AnalyticsHubView(viewModel: AnalyticsHubViewModel())
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import Foundation

/// Main View Model for the Analytics Hub.
///
final class AnalyticsHubViewModel: ObservableObject {

/// Revenue Card ViewModel
///
@Published var revenueCard = AnalyticsReportCardViewModel(title: "REVENUE",
leadingTitle: "Total Sales",
leadingValue: "$3.234",
leadingDelta: "+23%",
leadingDeltaColor: .withColorStudio(.green, shade: .shade50),
trailingTitle: "Net Sales",
trailingValue: "$2.324",
trailingDelta: "-4%",
trailingDeltaColor: .withColorStudio(.red, shade: .shade40))

/// Orders Card ViewModel
///
@Published var ordersCard = AnalyticsReportCardViewModel(title: "ORDERS",
leadingTitle: "Total Orders",
leadingValue: "145",
leadingDelta: "+36%",
leadingDeltaColor: .withColorStudio(.green, shade: .shade50),
trailingTitle: "Average Order Value",
trailingValue: "$57,99",
trailingDelta: "-16%",
trailingDeltaColor: .withColorStudio(.red, shade: .shade40))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import Foundation
import class UIKit.UIColor

/// Analytics Hub Report Card ViewModel.
/// Used to transmit analytics report data.
///
struct AnalyticsReportCardViewModel {
/// Report Card Title.
///
let title: String

/// First Column Title
///
let leadingTitle: String

/// First Column Value
///
let leadingValue: String

/// First Column Delta Value
///
let leadingDelta: String

/// First Column delta background color.
///
let leadingDeltaColor: UIColor

/// Second Column Titlke
///
let trailingTitle: String

/// Second Column Value
///
let trailingValue: String

/// Second Column Delta Value
///
let trailingDelta: String

/// Second Column Delta Background Color
///
let trailingDeltaColor: UIColor
}

/// Convenience extension to create an `AnalyticsReportCard` from a view model.
///
extension AnalyticsReportCard {
init(viewModel: AnalyticsReportCardViewModel) {
self.title = viewModel.title
self.leadingTitle = viewModel.leadingTitle
self.leadingValue = viewModel.leadingValue
self.leadingDelta = viewModel.leadingDelta
self.leadingDeltaColor = viewModel.leadingDeltaColor
self.trailingTitle = viewModel.trailingTitle
self.trailingValue = viewModel.trailingValue
self.trailingDelta = viewModel.trailingDelta
self.trailingDeltaColor = viewModel.trailingDeltaColor
}
}
16 changes: 12 additions & 4 deletions WooCommerce/WooCommerce.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,7 @@
263E38472641FF3400260D3B /* Codegen in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 263E38452641FF3400260D3B /* Codegen */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
263EB409242C58EA00F3A15F /* ProductFormActionsFactoryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 263EB408242C58EA00F3A15F /* ProductFormActionsFactoryTests.swift */; };
2647F7B529280A7F00D59FDF /* AnalyticsHubView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2647F7B429280A7F00D59FDF /* AnalyticsHubView.swift */; };
2647F7BA292BE2F900D59FDF /* StatsCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2647F7B9292BE2F900D59FDF /* StatsCard.swift */; };
2647F7BA292BE2F900D59FDF /* AnalyticsReportCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2647F7B9292BE2F900D59FDF /* AnalyticsReportCard.swift */; };
265284022624937600F91BA1 /* AddOnCrossreferenceUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265284012624937600F91BA1 /* AddOnCrossreferenceUseCase.swift */; };
265284092624ACE900F91BA1 /* AddOnCrossreferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265284082624ACE900F91BA1 /* AddOnCrossreferenceTests.swift */; };
2655905B27863D1300BB8457 /* MockCollectOrderPaymentUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2655905A27863D1300BB8457 /* MockCollectOrderPaymentUseCase.swift */; };
Expand Down Expand Up @@ -642,6 +642,8 @@
26E1BECA251BE5390096D0A1 /* RefundItemTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E1BEC9251BE5390096D0A1 /* RefundItemTableViewCell.swift */; };
26E1BECC251BE5570096D0A1 /* RefundItemTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 26E1BECB251BE5570096D0A1 /* RefundItemTableViewCell.xib */; };
26E1BECE251CD9F80096D0A1 /* RefundItemViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E1BECD251CD9F80096D0A1 /* RefundItemViewModel.swift */; };
26E7EE6A292D688900793045 /* AnalyticsHubViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E7EE69292D688900793045 /* AnalyticsHubViewModel.swift */; };
26E7EE6C292D894100793045 /* AnalyticsReportCardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26E7EE6B292D894100793045 /* AnalyticsReportCardViewModel.swift */; };
26ED9660274328BC00FA00A1 /* SimplePaymentsSummaryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26ED965F274328BC00FA00A1 /* SimplePaymentsSummaryViewModel.swift */; };
26F65C9825DEDAF0008FAE29 /* GenerateVariationUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26F65C9725DEDAF0008FAE29 /* GenerateVariationUseCase.swift */; };
26F65C9E25DEDE67008FAE29 /* GenerateVariationUseCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26F65C9D25DEDE67008FAE29 /* GenerateVariationUseCaseTests.swift */; };
Expand Down Expand Up @@ -2523,7 +2525,7 @@
26309F16277D0AEA0012797F /* SafeAreaInsetsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaInsetsKey.swift; sourceTree = "<group>"; };
263EB408242C58EA00F3A15F /* ProductFormActionsFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductFormActionsFactoryTests.swift; sourceTree = "<group>"; };
2647F7B429280A7F00D59FDF /* AnalyticsHubView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubView.swift; sourceTree = "<group>"; };
2647F7B9292BE2F900D59FDF /* StatsCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatsCard.swift; sourceTree = "<group>"; };
2647F7B9292BE2F900D59FDF /* AnalyticsReportCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsReportCard.swift; sourceTree = "<group>"; };
265284012624937600F91BA1 /* AddOnCrossreferenceUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddOnCrossreferenceUseCase.swift; sourceTree = "<group>"; };
265284082624ACE900F91BA1 /* AddOnCrossreferenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddOnCrossreferenceTests.swift; sourceTree = "<group>"; };
2655905A27863D1300BB8457 /* MockCollectOrderPaymentUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockCollectOrderPaymentUseCase.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2604,6 +2606,8 @@
26E1BEC9251BE5390096D0A1 /* RefundItemTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundItemTableViewCell.swift; sourceTree = "<group>"; };
26E1BECB251BE5570096D0A1 /* RefundItemTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RefundItemTableViewCell.xib; sourceTree = "<group>"; };
26E1BECD251CD9F80096D0A1 /* RefundItemViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefundItemViewModel.swift; sourceTree = "<group>"; };
26E7EE69292D688900793045 /* AnalyticsHubViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsHubViewModel.swift; sourceTree = "<group>"; };
26E7EE6B292D894100793045 /* AnalyticsReportCardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsReportCardViewModel.swift; sourceTree = "<group>"; };
26ED965F274328BC00FA00A1 /* SimplePaymentsSummaryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplePaymentsSummaryViewModel.swift; sourceTree = "<group>"; };
26F65C9725DEDAF0008FAE29 /* GenerateVariationUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenerateVariationUseCase.swift; sourceTree = "<group>"; };
26F65C9D25DEDE67008FAE29 /* GenerateVariationUseCaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenerateVariationUseCaseTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5239,7 +5243,9 @@
isa = PBXGroup;
children = (
2647F7B429280A7F00D59FDF /* AnalyticsHubView.swift */,
2647F7B9292BE2F900D59FDF /* StatsCard.swift */,
26E7EE69292D688900793045 /* AnalyticsHubViewModel.swift */,
2647F7B9292BE2F900D59FDF /* AnalyticsReportCard.swift */,
26E7EE6B292D894100793045 /* AnalyticsReportCardViewModel.swift */,
);
path = "Analytics Hub";
sourceTree = "<group>";
Expand Down Expand Up @@ -9757,6 +9763,7 @@
57896D6625362B0C000E8C4D /* TitleAndEditableValueTableViewCellViewModel.swift in Sources */,
0205021E27C8B6C600FB1C6B /* InboxEligibilityUseCase.swift in Sources */,
26E1BECE251CD9F80096D0A1 /* RefundItemViewModel.swift in Sources */,
26E7EE6C292D894100793045 /* AnalyticsReportCardViewModel.swift in Sources */,
6827141128A5410D00E6E3F6 /* NewSimplePaymentsLocationNoticeViewModel.swift in Sources */,
DE7B479027A153C20018742E /* CouponSearchUICommand.swift in Sources */,
DE50294D28BEF8F100551736 /* JetpackConnectionWebViewModel.swift in Sources */,
Expand Down Expand Up @@ -10173,7 +10180,7 @@
02482A8B237BE8C7007E73ED /* LinkSettingsViewController.swift in Sources */,
CE227097228F152400C0626C /* WooBasicTableViewCell.swift in Sources */,
02C27BCE282CB52F0065471A /* CardPresentPaymentReceiptEmailCoordinator.swift in Sources */,
2647F7BA292BE2F900D59FDF /* StatsCard.swift in Sources */,
2647F7BA292BE2F900D59FDF /* AnalyticsReportCard.swift in Sources */,
451526392577D89E0076B03C /* AddAttributeViewModel.swift in Sources */,
DE0A2EAF281BA278007A8015 /* ProductCategorySelectorViewModel.swift in Sources */,
45B9C64323A91CB6007FC4C5 /* PriceInputFormatter.swift in Sources */,
Expand Down Expand Up @@ -10557,6 +10564,7 @@
020F41E623163C0100776C4D /* TopBannerView.swift in Sources */,
DE6906E327D7121800735E3B /* GhostTableViewController.swift in Sources */,
02EEB5C42424AFAA00B8A701 /* TextFieldTableViewCell.swift in Sources */,
26E7EE6A292D688900793045 /* AnalyticsHubViewModel.swift in Sources */,
AE457813275644590092F687 /* OrderStatusSection.swift in Sources */,
B57C744E20F56E3800EEFC87 /* UITableViewCell+Helpers.swift in Sources */,
0295355B245ADF8100BDC42B /* FilterType+Products.swift in Sources */,
Expand Down