Skip to content

Commit 4f4f837

Browse files
authored
[Woo POS] [Beta fix] Cash payment issues - hide button when checking order and don't cancel payment task (#15233)
2 parents 9e1de2a + 88a1015 commit 4f4f837

File tree

6 files changed

+60
-25
lines changed

6 files changed

+60
-25
lines changed

WooCommerce/Classes/POS/Card Present Payments/CardPresentPaymentService.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,6 @@ final class CardPresentPaymentService: CardPresentPaymentFacade {
170170

171171
@MainActor
172172
func cancelPayment() async throws {
173-
cancelPaymentTask()
174-
175173
try await withCheckedThrowingContinuation { continuation in
176174
var nillableContinuation: CheckedContinuation<Void, any Error>? = continuation
177175
let action = CardPresentPaymentAction.cancelPayment { result in

WooCommerce/Classes/POS/Models/PointOfSaleAggregateModel.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,9 @@ extension PointOfSaleAggregateModel {
493493
try await cardPresentPaymentService.cancelPayment()
494494
}
495495

496+
// Cancels payment task
497+
cardPresentPaymentService.cancelPayment()
498+
496499
// Before exiting Point of Sale, we warn the merchant about losing their in-progress order.
497500
// We need to clear it down as any accidental retention can cause issues especially when reconnecting card readers.
498501
orderController.clearOrder()

WooCommerce/Classes/POS/Presentation/TotalsView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ struct TotalsView: View {
7171
.padding(.horizontal, Constants.buttonHorizontalPadding)
7272
.safeAreaPadding(.bottom, Constants.cashButtonBottomPadding)
7373
.renderedIf(viewHelper.shouldShowCollectCashPaymentButton(orderState: posModel.orderState,
74-
paymentState: posModel.paymentState))
74+
paymentState: posModel.paymentState,
75+
cardReaderConnectionStatus: posModel.cardReaderConnectionStatus))
7576
}
7677
.animation(.default, value: isShowingPaymentView)
7778
case .error(let viewModel):

WooCommerce/Classes/POS/ViewHelpers/TotalsViewHelper.swift

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,23 @@ final class TotalsViewHelper {
4141
}
4242

4343
func shouldShowCollectCashPaymentButton(orderState: PointOfSaleOrderState,
44-
paymentState: PointOfSalePaymentState) -> Bool {
44+
paymentState: PointOfSalePaymentState,
45+
cardReaderConnectionStatus: CardPresentPaymentReaderConnectionStatus) -> Bool {
4546
guard orderState != .syncing,
4647
case .card(let cardState) = paymentState else {
4748
return false
4849
}
4950

51+
if cardReaderConnectionStatus == .disconnected {
52+
return true
53+
}
54+
55+
if case let .loaded(totals) = orderState, totals.orderTotalDecimal.isZero {
56+
return true
57+
}
58+
5059
switch cardState {
51-
case .idle,
52-
.validatingOrder,
53-
.validatingOrderError,
54-
.preparingReader,
60+
case .validatingOrderError,
5561
.acceptingCard:
5662
return true
5763
default:

WooCommerce/WooCommerceTests/POS/Models/PointOfSaleAggregateModelTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ struct PointOfSaleAggregateModelTests {
339339

340340
// Then
341341
#expect(orderController.clearOrderWasCalled == true)
342+
#expect(cardPresentPaymentService.cancelPaymentCalled == true)
342343
}
343344
}
344345

@@ -541,7 +542,7 @@ struct PointOfSaleAggregateModelTests {
541542
Issue.record("Expected cardPresentPaymentInlineMessage to be paymentSuccess")
542543
return
543544
}
544-
#expect(viewModel.message == "A card payment of $52.30 was successfully made")
545+
#expect(viewModel.message == "A card payment of $52.30 was successfully made.")
545546
}
546547

547548
@available(iOS 17.0, *)

WooCommerce/WooCommerceTests/POS/ViewHelpers/TotalsViewHelperTests.swift

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,57 @@ struct TotalsViewHelperTests {
4747
}
4848

4949
@Test(arguments: [
50-
(PointOfSaleOrderState.idle, PointOfSalePaymentState.card(.idle)),
51-
(PointOfSaleOrderState.idle, PointOfSalePaymentState.card(.validatingOrder)),
52-
(PointOfSaleOrderState.idle, PointOfSalePaymentState.card(.validatingOrderError)),
53-
(PointOfSaleOrderState.idle, PointOfSalePaymentState.card(.preparingReader)),
54-
(PointOfSaleOrderState.idle, PointOfSalePaymentState.card(.acceptingCard))
50+
(PointOfSalePaymentState.card(.validatingOrderError)),
51+
(PointOfSalePaymentState.card(.acceptingCard))
5552
])
5653
func test_shouldShowCollectCashPaymentButton_returns_true_for_supported_states(
57-
orderState: PointOfSaleOrderState,
5854
paymentState: PointOfSalePaymentState) {
59-
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: orderState,
60-
paymentState: paymentState))
55+
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: .loaded(.init(cartTotal: "10",
56+
orderTotal: "10",
57+
taxTotal: "10",
58+
orderTotalDecimal: 0)),
59+
paymentState: paymentState,
60+
cardReaderConnectionStatus: .connected(.init(name: "", batteryLevel: nil))))
6161
}
6262

63+
@Test
64+
func test_shouldShowCollectCashPaymentButton_returns_true_for_idle_when_reader_disconnected() {
65+
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: .loaded(.init(cartTotal: "10",
66+
orderTotal: "10",
67+
taxTotal: "10",
68+
orderTotalDecimal: 0)),
69+
paymentState: .card(.idle),
70+
cardReaderConnectionStatus: .disconnected))
71+
}
72+
73+
@Test
74+
func test_shouldShowCollectCashPaymentButton_returns_true_for_idle_when_reader_connected_but_order_zero() {
75+
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: .loaded(.init(cartTotal: "0",
76+
orderTotal: "0",
77+
taxTotal: "0",
78+
orderTotalDecimal: 0)),
79+
paymentState: .card(.idle),
80+
cardReaderConnectionStatus: .connected(.init(name: "", batteryLevel: nil))))
81+
}
82+
83+
@Test
84+
func test_shouldShowCollectCashPaymentButton_returns_false_for_idle_when_reader_connected_but_order_not_zero() {
85+
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: .loaded(.init(cartTotal: "10",
86+
orderTotal: "10",
87+
taxTotal: "10",
88+
orderTotalDecimal: 10)),
89+
paymentState: .card(.idle),
90+
cardReaderConnectionStatus: .connected(.init(name: "", batteryLevel: nil))) == false)
91+
}
6392

6493
@Test(arguments: [
65-
(PointOfSaleOrderState.syncing, PointOfSalePaymentState.card(.idle)),
66-
(PointOfSaleOrderState.syncing, PointOfSalePaymentState.card(.validatingOrder)),
67-
(PointOfSaleOrderState.syncing, PointOfSalePaymentState.card(.validatingOrderError)),
68-
(PointOfSaleOrderState.syncing, PointOfSalePaymentState.card(.preparingReader)),
69-
(PointOfSaleOrderState.syncing, PointOfSalePaymentState.card(.acceptingCard))
94+
(PointOfSalePaymentState.card(.validatingOrderError)),
95+
(PointOfSalePaymentState.card(.acceptingCard))
7096
])
7197
func test_shouldShowCollectCashPaymentButton_returns_false_when_order_syncing(
72-
orderState: PointOfSaleOrderState,
7398
paymentState: PointOfSalePaymentState) {
74-
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: orderState,
75-
paymentState: paymentState) == false)
99+
#expect(TotalsViewHelper().shouldShowCollectCashPaymentButton(orderState: .syncing,
100+
paymentState: paymentState,
101+
cardReaderConnectionStatus: .connected(.init(name: "", batteryLevel: nil))) == false)
76102
}
77103
}

0 commit comments

Comments
 (0)