Skip to content

Commit 39641cb

Browse files
authored
Merge pull request #6171 from woocommerce/issue/5765-performance-section-loading-indicators
Coupons: Improve UX for the Performance section on Coupon Details screen
2 parents 6c946c9 + 7b6a21e commit 39641cb

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

WooCommerce/Classes/ViewRelated/Coupons/CouponDetails/CouponDetails.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,20 @@ struct CouponDetails: View {
8383
.secondaryBodyStyle()
8484
Text(viewModel.discountedOrdersCount)
8585
.font(.title)
86+
Spacer()
8687
}
8788
.frame(maxWidth: .infinity, alignment: .leading)
8889

8990
VStack(alignment: .leading, spacing: Constants.verticalSpacing) {
9091
Text(Localization.amount)
9192
.secondaryBodyStyle()
92-
Text(viewModel.discountedAmount)
93-
.font(.title)
93+
if let amount = viewModel.discountedAmount {
94+
Text(amount)
95+
.font(.title)
96+
} else {
97+
ActivityIndicator(isAnimating: .constant(true), style: .medium)
98+
}
99+
Spacer()
94100
}
95101
.padding(.leading, Constants.margin)
96102
.frame(maxWidth: .infinity, alignment: .leading)

WooCommerce/Classes/ViewRelated/Coupons/CouponDetails/CouponDetailsViewModel.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ final class CouponDetailsViewModel: ObservableObject {
4242

4343
/// Total amount deducted from orders that applied the coupon
4444
///
45-
@Published private(set) var discountedAmount: String = ""
45+
@Published private(set) var discountedAmount: String?
4646

4747
/// The current coupon
4848
///
@@ -61,7 +61,6 @@ final class CouponDetailsViewModel: ObservableObject {
6161
self.coupon = coupon
6262
self.stores = stores
6363
self.currencySettings = currencySettings
64-
self.discountedAmount = formatStringAmount("0")
6564
populateDetails()
6665
}
6766

@@ -102,6 +101,10 @@ private extension CouponDetailsViewModel {
102101
func populateDetails() {
103102
couponCode = coupon.code
104103
description = coupon.description
104+
discountedOrdersCount = "\(coupon.usageCount)"
105+
if coupon.usageCount == 0 {
106+
discountedAmount = formatStringAmount("0")
107+
}
105108

106109
switch coupon.discountType {
107110
case .percent:

WooCommerce/WooCommerceTests/ViewRelated/Coupons/CouponDetailsViewModelTests.swift

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ final class CouponDetailsViewModelTests: XCTestCase {
144144
XCTAssertEqual(viewModel.amount, "10%")
145145
}
146146

147-
func test_coupon_performance_is_correct() {
147+
func test_coupon_performance_is_correct_with_usage_count_equal_to_0() {
148148
// Given
149-
let sampleCoupon = Coupon.fake()
150-
let sampleReport = CouponReport.fake().copy(amount: 220.0, ordersCount: 10)
149+
let sampleCoupon = Coupon.fake().copy(usageCount: 0)
150+
let sampleReport = CouponReport.fake().copy(amount: 0, ordersCount: 0)
151151
let stores = MockStoresManager(sessionManager: .makeForTesting())
152152
let viewModel = CouponDetailsViewModel(coupon: sampleCoupon, stores: stores, currencySettings: CurrencySettings())
153153
XCTAssertEqual(viewModel.discountedOrdersCount, "0")
@@ -164,6 +164,31 @@ final class CouponDetailsViewModelTests: XCTestCase {
164164
}
165165
viewModel.loadCouponReport()
166166

167+
// Then
168+
XCTAssertEqual(viewModel.discountedOrdersCount, "0")
169+
XCTAssertEqual(viewModel.discountedAmount, "$0.00")
170+
}
171+
172+
func test_coupon_performance_is_correct_with_usage_count_larger_than_0() {
173+
// Given
174+
let sampleCoupon = Coupon.fake().copy(usageCount: 10)
175+
let sampleReport = CouponReport.fake().copy(amount: 220.0, ordersCount: 10)
176+
let stores = MockStoresManager(sessionManager: .makeForTesting())
177+
let viewModel = CouponDetailsViewModel(coupon: sampleCoupon, stores: stores, currencySettings: CurrencySettings())
178+
XCTAssertEqual(viewModel.discountedOrdersCount, "10")
179+
XCTAssertEqual(viewModel.discountedAmount, nil)
180+
181+
// When
182+
stores.whenReceivingAction(ofType: CouponAction.self) { action in
183+
switch action {
184+
case let .loadCouponReport(_, _, _, onCompletion):
185+
onCompletion(.success(sampleReport))
186+
default:
187+
break
188+
}
189+
}
190+
viewModel.loadCouponReport()
191+
167192
// Then
168193
XCTAssertEqual(viewModel.discountedOrdersCount, "10")
169194
XCTAssertEqual(viewModel.discountedAmount, "$220.00")

0 commit comments

Comments
 (0)