Skip to content

Commit 0ad9e56

Browse files
committed
Ensure card has been removed before attempting a payment
1 parent f0ae7a8 commit 0ad9e56

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

Hardware/Hardware/CardReader/StripeCardReader/StripeCardReaderService.swift

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)