Skip to content

Commit 222b6f6

Browse files
authored
Merge pull request #9763 from woocommerce/issue/9735-handle-site-change-during-reconnection
[Mobile Payments] Handle site change during TTP auto reconnection
2 parents 6abd60b + 12e9bf0 commit 222b6f6

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

Hardware/Hardware/CardReader/StripeCardReader/StripeCardReaderService.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public final class StripeCardReaderService: NSObject {
1515
private let discoveryStatusSubject = CurrentValueSubject<CardReaderServiceDiscoveryStatus, Never>(.idle)
1616
private let readerEventsSubject = PassthroughSubject<CardReaderEvent, Never>()
1717
private let softwareUpdateSubject = CurrentValueSubject<CardReaderSoftwareUpdateState, Never>(.none)
18+
private var connectionAttemptInvalidated: Bool = false
1819

1920
/// Volatile, in-memory cache of discovered readers. It has to be cleared after we connect to a reader
2021
/// see
@@ -287,6 +288,10 @@ extension StripeCardReaderService: CardReaderService {
287288
return
288289
}
289290

291+
if Terminal.shared.connectionStatus == .connecting {
292+
connectionAttemptInvalidated = true
293+
}
294+
290295
Terminal.shared.clearCachedCredentials()
291296
}
292297

@@ -354,6 +359,7 @@ extension StripeCardReaderService: CardReaderService {
354359
}.eraseToAnyPublisher()
355360
}
356361

362+
connectionAttemptInvalidated = false
357363
switch stripeReader.deviceType {
358364
case .appleBuiltIn:
359365
return getLocalMobileConfiguration(stripeReader, options: options).flatMap { configuration in
@@ -448,6 +454,10 @@ extension StripeCardReaderService: CardReaderService {
448454
}
449455

450456
if let reader = reader {
457+
if self.connectionAttemptInvalidated {
458+
_ = self.disconnect()
459+
promise(.failure(CardReaderServiceError.connection(underlyingError: .connectionAttemptInvalidated)))
460+
}
451461
self.connectedReadersSubject.send([CardReader(reader: reader)])
452462
self.switchStatusToIdle()
453463
promise(.success(CardReader(reader: reader)))
@@ -482,6 +492,10 @@ extension StripeCardReaderService: CardReaderService {
482492
}
483493

484494
if let reader = reader {
495+
if self.connectionAttemptInvalidated {
496+
_ = self.disconnect()
497+
promise(.failure(CardReaderServiceError.connection(underlyingError: .connectionAttemptInvalidated)))
498+
}
485499
self.connectedReadersSubject.send([CardReader(reader: reader)])
486500
self.switchStatusToIdle()
487501
promise(.success(CardReader(reader: reader)))

Hardware/Hardware/CardReader/UnderlyingError.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ public enum UnderlyingError: Error, Equatable {
149149
/// There was no refund in progress to cancel
150150
case noRefundInProgress
151151

152+
/// Connection attempt invalidated while it was in progress – e.g. the store was changed during a connection
153+
case connectionAttemptInvalidated
154+
152155
// MARK: - Tap to Pay on iPhone related errors
153156

154157
/// The device must have a passcode in order to use Tap to Pay on iPhone
@@ -408,6 +411,9 @@ extension UnderlyingError: LocalizedError {
408411
return NSLocalizedString("Sorry, this refund could not be canceled",
409412
comment: "Error message shown when a refund could not be canceled (likely because " +
410413
"it had already completed)")
414+
case .connectionAttemptInvalidated:
415+
return NSLocalizedString("Sorry, we could not connect to the reader. Please try again.",
416+
comment: "Error message shown when an in-progress connection is cancelled by the system")
411417

412418
// MARK: - Tap to Pay on iPhone errors
413419
case .passcodeNotEnabled:

0 commit comments

Comments
 (0)