Skip to content

Commit ba4bb40

Browse files
authored
[Payments] Display card inserted status for card-present payments (#15591)
2 parents 2a486d6 + b8c4cb5 commit ba4bb40

File tree

27 files changed

+299
-15
lines changed

27 files changed

+299
-15
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ private extension CardPresentPaymentCollectOrderPaymentUseCaseAdaptor {
148148
return
149149
case .preparingForPayment(cancelPayment: let cancelPayment),
150150
.tapSwipeOrInsertCard(_, cancelPayment: let cancelPayment),
151+
.cardInserted(cancelPayment: let cancelPayment),
151152
.paymentError(_, _, cancelPayment: let cancelPayment),
152153
.paymentCaptureError(cancelPayment: let cancelPayment),
153154
.paymentIntentCreationError(_, cancelPayment: let cancelPayment):

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ enum CardPresentPaymentEventDetails {
4343
case connectionSuccess(done: () -> Void)
4444
case tapSwipeOrInsertCard(inputMethods: CardReaderInput,
4545
cancelPayment: () -> Void)
46+
case cardInserted(cancelPayment: () -> Void)
4647
case paymentSuccess(done: () -> Void)
4748
case paymentError(error: any Error,
4849
retryApproach: CardPresentPaymentRetryApproach,

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ final class CardPresentPaymentInvalidatablePaymentOrchestrator: PaymentCaptureOr
1717
channel: PaymentChannel,
1818
onPreparingReader: @escaping () -> Void,
1919
onWaitingForInput: @escaping (CardReaderInput) -> Void,
20+
onCardInserted: @escaping () -> Void,
2021
onProcessingMessage: @escaping () -> Void,
2122
onDisplayMessage: @escaping (String) -> Void,
2223
onProcessingCompletion: @escaping (PaymentIntent) -> Void,
@@ -32,6 +33,7 @@ final class CardPresentPaymentInvalidatablePaymentOrchestrator: PaymentCaptureOr
3233
channel: channel,
3334
onPreparingReader: onPreparingReader,
3435
onWaitingForInput: onWaitingForInput,
36+
onCardInserted: onCardInserted,
3537
onProcessingMessage: onProcessingMessage,
3638
onDisplayMessage: onDisplayMessage,
3739
onProcessingCompletion: onProcessingCompletion,

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ struct CardPresentPaymentsTransactionAlertsProvider: CardReaderTransactionAlerts
2020
cancelPayment: onCancel)
2121
}
2222

23+
func cardInserted(title: String,
24+
amount: String,
25+
onCancel: @escaping () -> Void) -> CardPresentPaymentEventDetails {
26+
.cardInserted(cancelPayment: onCancel)
27+
}
28+
2329
func displayReaderMessage(message: String) -> CardPresentPaymentEventDetails {
2430
.displayReaderMessage(message: message)
2531
}

WooCommerce/Classes/POS/Models/PointOfSalePaymentState.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ enum PointOfSalePaymentState: Equatable {
88
enum PointOfSaleCardPaymentState: Equatable {
99
case idle
1010
case acceptingCard
11+
case cardInserted
1112
case validatingOrder
1213
case validatingOrderError
1314
case preparingReader
@@ -33,6 +34,8 @@ extension PointOfSalePaymentState {
3334
self = .card(.preparingReader)
3435
case .show(.tapSwipeOrInsertCard):
3536
self = .card(.acceptingCard)
37+
case .show(.cardInserted):
38+
self = .card(.cardInserted)
3639
case .show(.processing),
3740
.show(.displayReaderMessage):
3841
self = .card(.processingPayment)
@@ -65,7 +68,8 @@ extension PointOfSalePaymentState {
6568
.card(.validatingOrder),
6669
.card(.validatingOrderError),
6770
.card(.preparingReader),
68-
.card(.acceptingCard):
71+
.card(.acceptingCard),
72+
.card(.cardInserted):
6973
return false
7074
case .cash:
7175
return true

WooCommerce/Classes/POS/Presentation/Card Present Payments/PointOfSaleCardPresentPaymentEventPresentationStyle.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ enum PointOfSaleCardPresentPaymentEventPresentationStyle {
187187
self = .message(.tapSwipeOrInsertCard(
188188
viewModel: PointOfSaleCardPresentPaymentTapSwipeInsertCardMessageViewModel(
189189
inputMethods: inputMethods)))
190+
case .cardInserted:
191+
self = .message(.cardInserted(viewModel: PointOfSaleCardPresentPaymentCardInsertedMessageViewModel()))
190192
case .paymentSuccess:
191193
self = .message(.paymentSuccess(viewModel: PointOfSalePaymentSuccessViewModel(
192194
formattedOrderTotal: dependencies.formattedOrderTotalPrice,
@@ -241,7 +243,9 @@ enum PointOfSaleCardPresentPaymentEventPresentationStyle {
241243

242244
case .cancelledOnReader:
243245
self = .message(.cancelledOnReader(
244-
viewModel: PointOfSaleCardPresentPaymentCancelledOnReaderMessageViewModel()))
246+
viewModel: PointOfSaleCardPresentPaymentCancelledOnReaderMessageViewModel(
247+
tryPaymentAgainButtonAction: dependencies.tryPaymentAgainBackToCheckoutAction))
248+
)
245249

246250
/// Not-yet supported types
247251
case .selectSearchType:

WooCommerce/Classes/POS/Presentation/Card Present Payments/Reader Messages/PointOfSaleCardPresentPaymentCancelledOnReaderMessageViewModel.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ import Foundation
22

33
struct PointOfSaleCardPresentPaymentCancelledOnReaderMessageViewModel: Equatable {
44
let title = Localization.cancelledOnReader
5+
let tryAgainButtonViewModel: CardPresentPaymentsModalButtonViewModel
6+
7+
init(tryPaymentAgainButtonAction: @escaping () -> Void) {
8+
self.tryAgainButtonViewModel = .init(title: Localization.tryPaymentAgain,
9+
actionHandler: tryPaymentAgainButtonAction)
10+
}
511
}
612

713
private extension PointOfSaleCardPresentPaymentCancelledOnReaderMessageViewModel {
@@ -11,5 +17,12 @@ private extension PointOfSaleCardPresentPaymentCancelledOnReaderMessageViewModel
1117
value: "Payment cancelled on reader",
1218
comment: "Indicates the status of a card reader. Presented to users when payment collection starts"
1319
)
20+
21+
static let tryPaymentAgain = NSLocalizedString(
22+
"pointOfSale.cardPresent.cancelledOnReader.tryPaymentAgain.button.title",
23+
value: "Try payment again",
24+
comment: "Button to try to collect a payment again. Presented to users after " +
25+
"card reader cancelled on the Point of Sale Checkout"
26+
)
1427
}
1528
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Foundation
2+
3+
struct PointOfSaleCardPresentPaymentCardInsertedMessageViewModel: Equatable {
4+
let title = Localization.title
5+
let subtitle = Localization.subtitle
6+
let imageName = PointOfSaleAssets.readyForPayment.imageName
7+
}
8+
9+
private extension PointOfSaleCardPresentPaymentCardInsertedMessageViewModel {
10+
enum Localization {
11+
static let title = NSLocalizedString(
12+
"pointOfSale.cardPresent.cardInserted.title",
13+
value: "Ready for payment",
14+
comment: "Indicates the status of a card reader. Presented to merchants when the card is inserted to the reader"
15+
)
16+
17+
static let subtitle = NSLocalizedString(
18+
"pointOfSale.cardPresent.cardInserted.subtitle",
19+
value: "Card inserted",
20+
comment: "Indicates the status of a card reader. Presented to merchants when the card is inserted to the reader"
21+
)
22+
}
23+
}

WooCommerce/Classes/POS/Presentation/Card Present Payments/Reader Messages/PointOfSaleCardPresentPaymentMessageType.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ enum PointOfSaleCardPresentPaymentMessageType: Equatable {
55
case validatingOrderError(viewModel: PointOfSaleCardPresentPaymentValidatingOrderErrorMessageViewModel)
66
case preparingForPayment(viewModel: PointOfSaleCardPresentPaymentPreparingForPaymentMessageViewModel)
77
case tapSwipeOrInsertCard(viewModel: PointOfSaleCardPresentPaymentTapSwipeInsertCardMessageViewModel)
8+
case cardInserted(viewModel: PointOfSaleCardPresentPaymentCardInsertedMessageViewModel)
89
case processing(viewModel: PointOfSaleCardPresentPaymentProcessingMessageViewModel)
910
case displayReaderMessage(viewModel: PointOfSaleCardPresentPaymentDisplayReaderMessageMessageViewModel)
1011
case paymentSuccess(viewModel: PointOfSalePaymentSuccessViewModel)

WooCommerce/Classes/POS/Presentation/CardReaderConnection/UI States/PointOfSaleCardPresentPaymentInLineMessage.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ struct PointOfSaleCardPresentPaymentInLineMessage: View {
1818
PointOfSaleCardPresentPaymentActivityIndicatingMessageView(title: viewModel.title, message: viewModel.message, animation: animation)
1919
case .tapSwipeOrInsertCard(let viewModel):
2020
PointOfSaleCardPresentPaymentTapSwipeInsertCardMessageView(viewModel: viewModel, animation: animation)
21+
case .cardInserted(viewModel: let viewModel):
22+
PointOfSaleCardPresentPaymentCardInsertedMessageView(viewModel: viewModel, animation: animation)
2123
case .processing(let viewModel):
2224
PointOfSaleCardPresentPaymentProcessingMessageView(viewModel: viewModel, animation: animation)
2325
case .displayReaderMessage(let viewModel):

0 commit comments

Comments
 (0)