Skip to content

Commit 1a5dea0

Browse files
committed
Add previews for various TotalsView states
1 parent 007ff8e commit 1a5dea0

File tree

4 files changed

+135
-4
lines changed

4 files changed

+135
-4
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ final class CardPresentPaymentPreviewService: CardPresentPaymentFacade {
1414
$readerConnectionStatus.eraseToAnyPublisher()
1515
}
1616

17+
init(connectionStatus: CardPresentPaymentReaderConnectionStatus = .disconnected) {
18+
self.readerConnectionStatus = connectionStatus
19+
}
20+
1721
func connectReader(using connectionMethod: CardReaderConnectionMethod) async throws -> CardPresentPaymentReaderConnectionResult {
1822
.connected(CardPresentPaymentCardReader(name: "Test reader", batteryLevel: 0.85))
1923
}

WooCommerce/Classes/POS/Models/PointOfSaleAggregateModel.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,3 +629,12 @@ private extension PointOfSaleAggregateModel {
629629
static let initialPage: Int = 1
630630
}
631631
}
632+
633+
#if DEBUG
634+
extension PointOfSaleAggregateModel {
635+
func setPreviewState(paymentState: PointOfSalePaymentState, inlineMessage: PointOfSaleCardPresentPaymentMessageType?) {
636+
self.paymentState = paymentState
637+
self.cardPresentPaymentInlineMessage = inlineMessage
638+
}
639+
}
640+
#endif

WooCommerce/Classes/POS/Presentation/TotalsView.swift

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -566,8 +566,122 @@ private struct CashPaymentButton: View {
566566
}
567567

568568
#if DEBUG
569-
#Preview {
569+
#Preview("Card Reader Not Connected") {
570570
TotalsView()
571-
.environment(POSPreviewHelpers.makePreviewAggregateModel())
571+
.environment(POSPreviewHelpers.makePreviewAggregateModel(
572+
cardPresentPaymentService: CardPresentPaymentPreviewService(connectionStatus: .disconnected)
573+
))
574+
}
575+
576+
#Preview("Card Reader Connected") {
577+
TotalsView()
578+
.environment(POSPreviewHelpers.makePreviewAggregateModel(
579+
cardPresentPaymentService: CardPresentPaymentPreviewService(
580+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
581+
)
582+
))
583+
}
584+
585+
#Preview("Validating Order") {
586+
let aggregateModel = POSPreviewHelpers.makePreviewAggregateModel(
587+
cardPresentPaymentService: CardPresentPaymentPreviewService(
588+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
589+
)
590+
)
591+
Task { @MainActor in
592+
aggregateModel.setPreviewState(
593+
paymentState: PointOfSalePaymentState(card: .validatingOrder, cash: .idle),
594+
inlineMessage: .validatingOrder(viewModel: PointOfSaleCardPresentPaymentValidatingOrderMessageViewModel())
595+
)
596+
}
597+
return TotalsView()
598+
.environment(aggregateModel)
599+
}
600+
601+
#Preview("Accepting Card") {
602+
let aggregateModel = POSPreviewHelpers.makePreviewAggregateModel(
603+
cardPresentPaymentService: CardPresentPaymentPreviewService(
604+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
605+
)
606+
)
607+
Task { @MainActor in
608+
aggregateModel.setPreviewState(
609+
paymentState: PointOfSalePaymentState(card: .acceptingCard, cash: .idle),
610+
inlineMessage: .tapSwipeOrInsertCard(viewModel: PointOfSaleCardPresentPaymentTapSwipeInsertCardMessageViewModel(inputMethods: []))
611+
)
612+
}
613+
return TotalsView()
614+
.environment(aggregateModel)
572615
}
616+
617+
#Preview("Processing Payment") {
618+
let aggregateModel = POSPreviewHelpers.makePreviewAggregateModel(
619+
cardPresentPaymentService: CardPresentPaymentPreviewService(
620+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
621+
)
622+
)
623+
Task { @MainActor in
624+
aggregateModel.setPreviewState(
625+
paymentState: PointOfSalePaymentState(card: .processingPayment, cash: .idle),
626+
inlineMessage: .processing(viewModel: PointOfSaleCardPresentPaymentProcessingMessageViewModel())
627+
)
628+
}
629+
return TotalsView()
630+
.environment(aggregateModel)
631+
}
632+
633+
#Preview("Card Payment Successful") {
634+
let aggregateModel = POSPreviewHelpers.makePreviewAggregateModel(
635+
cardPresentPaymentService: CardPresentPaymentPreviewService(
636+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
637+
)
638+
)
639+
Task { @MainActor in
640+
aggregateModel.setPreviewState(
641+
paymentState: PointOfSalePaymentState(card: .cardPaymentSuccessful, cash: .idle),
642+
inlineMessage: .paymentSuccess(viewModel: PointOfSalePaymentSuccessViewModel(formattedOrderTotal: "$12.00", paymentMethod: .card))
643+
)
644+
}
645+
return TotalsView()
646+
.environment(aggregateModel)
647+
}
648+
649+
#Preview("Display Reader Message") {
650+
let aggregateModel = POSPreviewHelpers.makePreviewAggregateModel(
651+
cardPresentPaymentService: CardPresentPaymentPreviewService(
652+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
653+
)
654+
)
655+
Task { @MainActor in
656+
aggregateModel.setPreviewState(
657+
paymentState: PointOfSalePaymentState(card: .processingPayment, cash: .idle),
658+
inlineMessage: .displayReaderMessage(viewModel: PointOfSaleCardPresentPaymentDisplayReaderMessageMessageViewModel(message: "Remove card"))
659+
)
660+
}
661+
return TotalsView()
662+
.environment(aggregateModel)
663+
}
664+
665+
#Preview("Payment Error") {
666+
let aggregateModel = POSPreviewHelpers.makePreviewAggregateModel(
667+
cardPresentPaymentService: CardPresentPaymentPreviewService(
668+
connectionStatus: .connected(CardPresentPaymentCardReader(name: "Reader", batteryLevel: 0.85))
669+
)
670+
)
671+
Task { @MainActor in
672+
aggregateModel.setPreviewState(
673+
paymentState: PointOfSalePaymentState(card: .paymentError, cash: .idle),
674+
inlineMessage: .paymentError(viewModel: PointOfSaleCardPresentPaymentErrorMessageViewModel(
675+
error: NSError(domain: "CardPaymentError", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Card declined"]),
676+
tryPaymentAgainButtonAction: {},
677+
backToCheckoutButtonAction: {}
678+
))
679+
)
680+
}
681+
return TotalsView()
682+
.environment(aggregateModel)
683+
}
684+
685+
#endif
686+
573687
#endif

WooCommerce/Classes/POS/Utils/PointOfSalePreviewOrderController.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ import struct Yosemite.Order
44
import Combine
55

66
class PointOfSalePreviewOrderController: PointOfSaleOrderControllerProtocol {
7-
var orderState: PointOfSaleInternalOrderState = .loaded(
7+
var orderState: PointOfSaleInternalOrderState
8+
9+
init(orderState: PointOfSaleInternalOrderState = .loaded(
810
.init(cartTotal: "$10.50",
911
orderTotal: "$12.00",
1012
taxTotal: "$1.50",
1113
orderTotalDecimal: 12.00),
1214
OrderFactory.newOrder(currency: .USD)
13-
)
15+
)) {
16+
self.orderState = orderState
17+
}
1418

1519
func syncOrder(for cart: Cart, retryHandler: @escaping () async -> Void) async -> Result<SyncOrderState, Error> {
1620
return .success(.newOrder)

0 commit comments

Comments
 (0)