@@ -73,10 +73,6 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
7373 ///
7474 private let alertsPresenter : CardPresentPaymentAlertsPresenting
7575
76- /// Payment alerts provider
77- ///
78- private let paymentAlerts : CardReaderTransactionAlertsProviding
79-
8076 /// Stores the card reader listener subscription while trying to connect to one.
8177 ///
8278 private var readerSubscription : AnyCancellable ?
@@ -117,7 +113,6 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
117113 self . paymentGatewayAccount = paymentGatewayAccount
118114 self . rootViewController = rootViewController
119115 self . alertsPresenter = CardPresentPaymentAlertsPresenter ( rootViewController: rootViewController)
120- self . paymentAlerts = CardReaderPaymentAlertsProvider ( transactionType: . collectPayment)
121116 self . configuration = configuration
122117 self . stores = stores
123118 self . paymentCaptureCelebration = paymentCaptureCelebration
@@ -155,7 +150,8 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
155150 switch connectionResult {
156151 case . connected( let reader) :
157152 self . connectedReader = reader
158- self . attemptPayment ( onCompletion: { [ weak self] result in
153+ let paymentAlertProvider = reader. paymentAlertProvider ( )
154+ self . attemptPayment ( alertProvider: paymentAlertProvider, onCompletion: { [ weak self] result in
159155 guard let self = self else { return }
160156 // Inform about the collect payment state
161157 switch result {
@@ -169,7 +165,9 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
169165 guard let paymentData = try ? result. get ( ) else {
170166 return onCompleted ( )
171167 }
172- self . presentReceiptAlert ( receiptParameters: paymentData. receiptParameters, onCompleted: onCompleted)
168+ self . presentReceiptAlert ( receiptParameters: paymentData. receiptParameters,
169+ alertProvider: paymentAlertProvider,
170+ onCompleted: onCompleted)
173171 } )
174172 case . canceled:
175173 self . alertsPresenter. dismiss ( )
@@ -185,6 +183,17 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
185183 }
186184}
187185
186+ private extension CardReader {
187+ func paymentAlertProvider( ) -> CardReaderTransactionAlertsProviding {
188+ switch readerType {
189+ case . appleBuiltIn:
190+ return BuiltInCardReaderPaymentAlertsProvider ( )
191+ default :
192+ return BluetoothCardReaderPaymentAlertsProvider ( transactionType: . collectPayment)
193+ }
194+ }
195+ }
196+
188197// MARK: Private functions
189198private extension CollectOrderPaymentUseCase {
190199 /// Checks whether the amount to be collected is valid: (not nil, convertible to decimal, higher than minimum amount ...)
@@ -212,16 +221,19 @@ private extension CollectOrderPaymentUseCase {
212221 return NotValidAmountError . belowMinimumAmount ( amount: minimum)
213222 }
214223
215- func handleTotalAmountInvalidError( _ error: Error , onCompleted: @escaping ( ) -> ( ) ) {
224+ func handleTotalAmountInvalidError( _ error: Error ,
225+ onCompleted: @escaping ( ) -> ( ) ) {
216226 trackPaymentFailure ( with: error)
217227 DDLogError ( " 💳 Error: failed to capture payment for order. Order amount is below minimum or not valid " )
218- self . alertsPresenter. present ( viewModel: paymentAlerts. nonRetryableError ( error: totalAmountInvalidError ( ) ,
219- dismissCompletion: onCompleted) )
228+ alertsPresenter. present ( viewModel: CardPresentModalNonRetryableError ( amount: formattedAmount,
229+ error: totalAmountInvalidError ( ) ,
230+ onDismiss: onCompleted) )
220231 }
221232
222233 /// Attempts to collect payment for an order.
223234 ///
224- func attemptPayment( onCompletion: @escaping ( Result < CardPresentCapturedPaymentData , Error > ) -> ( ) ) {
235+ func attemptPayment( alertProvider paymentAlerts: CardReaderTransactionAlertsProviding ,
236+ onCompletion: @escaping ( Result < CardPresentCapturedPaymentData , Error > ) -> ( ) ) {
225237 guard let orderTotal = orderTotal else {
226238 onCompletion ( . failure( NotValidAmountError . other) )
227239 return
@@ -244,7 +256,7 @@ private extension CollectOrderPaymentUseCase {
244256 onWaitingForInput: { [ weak self] inputMethods in
245257 guard let self = self else { return }
246258 self . alertsPresenter. present (
247- viewModel: self . paymentAlerts. tapOrInsertCard (
259+ viewModel: paymentAlerts. tapOrInsertCard (
248260 title: Localization . collectPaymentTitle ( username: self . order. billingAddress? . firstName) ,
249261 amount: self . formattedAmount,
250262 inputMethods: inputMethods,
@@ -257,11 +269,11 @@ private extension CollectOrderPaymentUseCase {
257269 } , onProcessingMessage: { [ weak self] in
258270 guard let self = self else { return }
259271 // Waiting message
260- self . alertsPresenter. present ( viewModel: self . paymentAlerts. processingTransaction ( ) )
272+ self . alertsPresenter. present ( viewModel: paymentAlerts. processingTransaction ( ) )
261273 } , onDisplayMessage: { [ weak self] message in
262274 guard let self = self else { return }
263275 // Reader messages. EG: Remove Card
264- self . alertsPresenter. present ( viewModel: self . paymentAlerts. displayReaderMessage ( message: message) )
276+ self . alertsPresenter. present ( viewModel: paymentAlerts. displayReaderMessage ( message: message) )
265277 } , onProcessingCompletion: { [ weak self] intent in
266278 self ? . trackProcessingCompletion ( intent: intent)
267279 self ? . markOrderAsPaidIfNeeded ( intent: intent)
@@ -270,7 +282,7 @@ private extension CollectOrderPaymentUseCase {
270282 case . success( let capturedPaymentData) :
271283 self ? . handleSuccessfulPayment ( capturedPaymentData: capturedPaymentData, onCompletion: onCompletion)
272284 case . failure( let error) :
273- self ? . handlePaymentFailureAndRetryPayment ( error, onCompletion: onCompletion)
285+ self ? . handlePaymentFailureAndRetryPayment ( error, alertProvider : paymentAlerts , onCompletion: onCompletion)
274286 }
275287 }
276288 )
@@ -293,7 +305,9 @@ private extension CollectOrderPaymentUseCase {
293305
294306 /// Log the failure reason, cancel the current payment and retry it if possible.
295307 ///
296- func handlePaymentFailureAndRetryPayment( _ error: Error , onCompletion: @escaping ( Result < CardPresentCapturedPaymentData , Error > ) -> ( ) ) {
308+ func handlePaymentFailureAndRetryPayment( _ error: Error ,
309+ alertProvider paymentAlerts: CardReaderTransactionAlertsProviding ,
310+ onCompletion: @escaping ( Result < CardPresentCapturedPaymentData , Error > ) -> ( ) ) {
297311 DDLogError ( " Failed to collect payment: \( error. localizedDescription) " )
298312
299313 trackPaymentFailure ( with: error)
@@ -310,12 +324,13 @@ private extension CollectOrderPaymentUseCase {
310324 switch result {
311325 case . success:
312326 // Retry payment
313- self . attemptPayment ( onCompletion: onCompletion)
327+ self . attemptPayment ( alertProvider: paymentAlerts,
328+ onCompletion: onCompletion)
314329
315330 case . failure( let cancelError) :
316331 // Inform that payment can't be retried.
317332 self . alertsPresenter. present (
318- viewModel: self . paymentAlerts. nonRetryableError ( error: cancelError) {
333+ viewModel: paymentAlerts. nonRetryableError ( error: cancelError) {
319334 onCompletion ( . failure( error) )
320335 } )
321336 }
@@ -351,7 +366,9 @@ private extension CollectOrderPaymentUseCase {
351366
352367 /// Allow merchants to print or email the payment receipt.
353368 ///
354- func presentReceiptAlert( receiptParameters: CardPresentReceiptParameters , onCompleted: @escaping ( ) -> ( ) ) {
369+ func presentReceiptAlert( receiptParameters: CardPresentReceiptParameters ,
370+ alertProvider paymentAlerts: CardReaderTransactionAlertsProviding ,
371+ onCompleted: @escaping ( ) -> ( ) ) {
355372 // Present receipt alert
356373 alertsPresenter. present ( viewModel: paymentAlerts. success ( printReceipt: { [ order, configuration, weak self] in
357374 guard let self = self else { return }
0 commit comments