@@ -211,14 +211,23 @@ extension StripeCardReaderService: CardReaderService {
211211 // a single value or it will fail.
212212 // This isn't enforced by the type system, but it is guaranteed as long as all the
213213 // steps produce a Future.
214- return createPaymentIntent ( parameters)
215- . flatMap { intent in
214+
215+ if isChipCardInserted {
216+ sendReaderEvent ( CardReaderEvent . make ( displayMessage: . removeCard) )
217+ }
218+ return waitForInsertedCardToBeRemoved ( )
219+ . flatMap {
220+ self . createPaymentIntent ( parameters)
221+ } . flatMap { intent in
216222 self . collectPaymentMethod ( intent: intent)
217223 } . flatMap { intent in
218224 self . processPayment ( intent: intent)
219225 } . flatMap { intent in
220- self . waitForInsertedCardToBeRemoved ( intent: intent)
221- } . eraseToAnyPublisher ( )
226+ self . waitForInsertedCardToBeRemoved ( )
227+ . map { intent }
228+ }
229+ . map ( PaymentIntent . init ( intent: ) )
230+ . eraseToAnyPublisher ( )
222231 }
223232
224233 public func cancelPaymentIntent( ) -> Future < Void , Error > {
@@ -406,15 +415,15 @@ private extension StripeCardReaderService {
406415 }
407416 }
408417
409- func waitForInsertedCardToBeRemoved( intent : PaymentIntent ) -> Future < PaymentIntent , Error > {
418+ func waitForInsertedCardToBeRemoved( ) -> Future < Void , Error > {
410419 return Future ( ) { [ weak self] promise in
411420 guard let self = self else {
412421 return
413422 }
414423
415424 // If there is no chip card inserted, it is ok to immediatedly return. The payment method may have been swipe or tap.
416425 if !self . isChipCardInserted {
417- return promise ( . success( intent ) )
426+ return promise ( . success( ( ) ) )
418427 }
419428
420429 self . timerCancellable = Timer . publish ( every: 1 , tolerance: 0.1 , on: . main, in: . default)
@@ -423,13 +432,13 @@ private extension StripeCardReaderService {
423432 . sink ( receiveValue: { _ in
424433 if !self . isChipCardInserted {
425434 self . timerCancellable? . cancel ( )
426- return promise ( . success( intent ) )
435+ return promise ( . success( ( ) ) )
427436 }
428437 } )
429438 }
430439 }
431440
432- func processPayment( intent: StripeTerminal . PaymentIntent ) -> Future < PaymentIntent , Error > {
441+ func processPayment( intent: StripeTerminal . PaymentIntent ) -> Future < StripeTerminal . PaymentIntent , Error > {
433442 return Future ( ) { [ weak self] promise in
434443 Terminal . shared. processPayment ( intent) { ( intent, error) in
435444 if let error = error {
@@ -438,7 +447,7 @@ private extension StripeCardReaderService {
438447 }
439448
440449 if let intent = intent {
441- promise ( . success( PaymentIntent ( intent: intent ) ) )
450+ promise ( . success( intent) )
442451 self ? . activePaymentIntent = nil
443452 }
444453 }
0 commit comments