@@ -32,10 +32,13 @@ final class OrderDetailsPaymentAlerts: OrderDetailsPaymentAlertsProtocol {
3232
3333 private let transactionType : CardPresentTransactionType
3434
35+ private let alertsProvider : CardReaderTransactionAlertsProviding
36+
3537 init ( transactionType: CardPresentTransactionType ,
3638 presentingController: UIViewController ) {
3739 self . transactionType = transactionType
3840 self . presentingController = presentingController
41+ self . alertsProvider = CardReaderPaymentAlertsProvider ( transactionType: transactionType)
3942 }
4043
4144 func presentViewModel( viewModel: CardPresentPaymentsModalViewModel ) {
@@ -60,166 +63,45 @@ final class OrderDetailsPaymentAlerts: OrderDetailsPaymentAlertsProtocol {
6063
6164 // Initial presentation of the modal view controller. We need to provide
6265 // a customer name and an amount.
63- let viewModel = tapOrInsert ( readerInputMethods: inputMethods, onCancel: onCancel)
66+ let viewModel = alertsProvider. tapOrInsertCard ( title: title,
67+ amount: amount,
68+ inputMethods: inputMethods,
69+ onCancel: onCancel)
6470 presentViewModel ( viewModel: viewModel)
6571 }
6672
6773 func displayReaderMessage( message: String ) {
68- let viewModel = displayMessage ( message: message)
74+ let viewModel = alertsProvider . displayReaderMessage ( message: message)
6975 presentViewModel ( viewModel: viewModel)
7076 }
7177
7278 func processingPayment( ) {
73- let viewModel = processing ( )
79+ let viewModel = alertsProvider . processingTransaction ( )
7480 presentViewModel ( viewModel: viewModel)
7581 }
7682
7783 func success( printReceipt: @escaping ( ) -> Void , emailReceipt: @escaping ( ) -> Void , noReceiptAction: @escaping ( ) -> Void ) {
78- let viewModel = successViewModel ( printReceipt: printReceipt,
79- emailReceipt: emailReceipt,
80- noReceiptAction: noReceiptAction)
84+ let viewModel = alertsProvider . success ( printReceipt: printReceipt,
85+ emailReceipt: emailReceipt,
86+ noReceiptAction: noReceiptAction)
8187 presentViewModel ( viewModel: viewModel)
8288 }
8389
8490 func error( error: Error , tryAgain: @escaping ( ) -> Void , dismissCompletion: @escaping ( ) -> Void ) {
85- let viewModel = errorViewModel ( error: error, tryAgain: tryAgain, dismissCompletion: dismissCompletion)
91+ let viewModel = alertsProvider. error ( error: error,
92+ tryAgain: tryAgain,
93+ dismissCompletion: dismissCompletion)
8694 presentViewModel ( viewModel: viewModel)
8795 }
8896
8997 func nonRetryableError( from: UIViewController ? , error: Error , dismissCompletion: @escaping ( ) -> Void ) {
90- let viewModel = nonRetryableErrorViewModel ( amount: amount, error: error, dismissCompletion: dismissCompletion)
98+ let viewModel = alertsProvider. nonRetryableError ( error: error,
99+ dismissCompletion: dismissCompletion)
91100 presentViewModel ( viewModel: viewModel)
92101 }
93102
94103 func retryableError( from: UIViewController ? , tryAgain: @escaping ( ) -> Void ) {
95- let viewModel = retryableErrorViewModel ( tryAgain: tryAgain)
104+ let viewModel = alertsProvider . retryableError ( tryAgain: tryAgain)
96105 presentViewModel ( viewModel: viewModel)
97106 }
98107}
99-
100- private extension OrderDetailsPaymentAlerts {
101- func tapOrInsert( readerInputMethods: CardReaderInput , onCancel: @escaping ( ) -> Void ) -> CardPresentPaymentsModalViewModel {
102- CardPresentModalTapCard ( name: name,
103- amount: amount,
104- transactionType: transactionType,
105- inputMethods: readerInputMethods,
106- onCancel: onCancel)
107- }
108-
109- func displayMessage( message: String ) -> CardPresentPaymentsModalViewModel {
110- CardPresentModalDisplayMessage ( name: name, amount: amount, message: message)
111- }
112-
113- func processing( ) -> CardPresentPaymentsModalViewModel {
114- CardPresentModalProcessing ( name: name, amount: amount, transactionType: transactionType)
115- }
116-
117- func successViewModel( printReceipt: @escaping ( ) -> Void ,
118- emailReceipt: @escaping ( ) -> Void ,
119- noReceiptAction: @escaping ( ) -> Void ) -> CardPresentPaymentsModalViewModel {
120- if MFMailComposeViewController . canSendMail ( ) {
121- return CardPresentModalSuccess ( printReceipt: printReceipt,
122- emailReceipt: emailReceipt,
123- noReceiptAction: noReceiptAction)
124- } else {
125- return CardPresentModalSuccessWithoutEmail ( printReceipt: printReceipt, noReceiptAction: noReceiptAction)
126- }
127- }
128-
129- func errorViewModel( error: Error ,
130- tryAgain: @escaping ( ) -> Void ,
131- dismissCompletion: @escaping ( ) -> Void ) -> CardPresentPaymentsModalViewModel {
132- let errorDescription : String ?
133- if let error = error as? CardReaderServiceError {
134- switch error {
135- case . connection( let underlyingError) ,
136- . discovery( let underlyingError) ,
137- . disconnection( let underlyingError) ,
138- . intentCreation( let underlyingError) ,
139- . paymentMethodCollection( let underlyingError) ,
140- . paymentCapture( let underlyingError) ,
141- . paymentCancellation( let underlyingError) ,
142- . refundCreation( let underlyingError) ,
143- . refundPayment( let underlyingError, _) ,
144- . refundCancellation( let underlyingError) ,
145- . softwareUpdate( let underlyingError, _) :
146- errorDescription = Localization . errorDescription ( underlyingError: underlyingError, transactionType: transactionType)
147- default :
148- errorDescription = error. errorDescription
149- }
150- } else {
151- errorDescription = error. localizedDescription
152- }
153- return CardPresentModalError ( errorDescription: errorDescription,
154- transactionType: transactionType,
155- primaryAction: tryAgain,
156- dismissCompletion: dismissCompletion)
157- }
158-
159- func retryableErrorViewModel( tryAgain: @escaping ( ) -> Void ) -> CardPresentPaymentsModalViewModel {
160- CardPresentModalRetryableError ( primaryAction: tryAgain)
161- }
162-
163- func nonRetryableErrorViewModel( amount: String , error: Error , dismissCompletion: @escaping ( ) -> Void ) -> CardPresentPaymentsModalViewModel {
164- CardPresentModalNonRetryableError ( amount: amount, error: error, onDismiss: dismissCompletion)
165- }
166- }
167-
168- private extension OrderDetailsPaymentAlerts {
169- enum Localization {
170- static func errorDescription( underlyingError: UnderlyingError , transactionType: CardPresentTransactionType ) -> String ? {
171- switch underlyingError {
172- case . unsupportedReaderVersion:
173- switch transactionType {
174- case . collectPayment:
175- return NSLocalizedString (
176- " The card reader software is out-of-date - please update the card reader software before attempting to process payments " ,
177- comment: " Error message when the card reader software is too far out of date to process payments. "
178- )
179- case . refund:
180- return NSLocalizedString (
181- " The card reader software is out-of-date - please update the card reader software before attempting to process refunds " ,
182- comment: " Error message when the card reader software is too far out of date to process in-person refunds. "
183- )
184- }
185- case . paymentDeclinedByCardReader:
186- switch transactionType {
187- case . collectPayment:
188- return NSLocalizedString ( " The card was declined by the card reader - please try another means of payment " ,
189- comment: " Error message when the card reader itself declines the card. " )
190- case . refund:
191- return NSLocalizedString ( " The card was declined by the card reader - please try another means of refund " ,
192- comment: " Error message when the card reader itself declines the card. " )
193- }
194- case . processorAPIError:
195- switch transactionType {
196- case . collectPayment:
197- return NSLocalizedString (
198- " The payment can not be processed by the payment processor. " ,
199- comment: " Error message when the payment can not be processed (i.e. order amount is below the minimum amount allowed.) "
200- )
201- case . refund:
202- return NSLocalizedString (
203- " The refund can not be processed by the payment processor. " ,
204- comment: " Error message when the in-person refund can not be processed (i.e. order amount is below the minimum amount allowed.) "
205- )
206- }
207- case . internalServiceError:
208- switch transactionType {
209- case . collectPayment:
210- return NSLocalizedString (
211- " Sorry, this payment couldn’t be processed " ,
212- comment: " Error message when the card reader service experiences an unexpected internal service error. "
213- )
214- case . refund:
215- return NSLocalizedString (
216- " Sorry, this refund couldn’t be processed " ,
217- comment: " Error message when the card reader service experiences an unexpected internal service error. "
218- )
219- }
220- default :
221- return underlyingError. errorDescription
222- }
223- }
224- }
225- }
0 commit comments