Skip to content

Commit 3cdde78

Browse files
committed
8353 Make some connection errors non-retryable
1 parent 7036da3 commit 3cdde78

File tree

7 files changed

+113
-5
lines changed

7 files changed

+113
-5
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import UIKit
2+
import Yosemite
3+
4+
/// Modal presented when an error occurs while connecting to a reader
5+
///
6+
final class CardPresentModalBuiltInConnectingFailedNonRetryable: CardPresentPaymentsModalViewModel {
7+
private let closeAction: () -> Void
8+
9+
let textMode: PaymentsModalTextMode = .reducedTopInfo
10+
let actionsMode: PaymentsModalActionsMode = .oneAction
11+
12+
let topTitle: String = Localization.title
13+
14+
var topSubtitle: String? = nil
15+
16+
let image: UIImage = .builtInReaderError
17+
18+
let primaryButtonTitle: String? = Localization.close
19+
20+
let secondaryButtonTitle: String? = nil
21+
22+
let auxiliaryButtonTitle: String? = nil
23+
24+
var bottomTitle: String? = nil
25+
26+
let bottomSubtitle: String? = nil
27+
28+
var accessibilityLabel: String? {
29+
return topTitle
30+
}
31+
32+
init(error: Error,
33+
close: @escaping () -> Void) {
34+
self.closeAction = close
35+
36+
switch error {
37+
case CardReaderServiceError.connection(let underlyingError):
38+
bottomTitle = underlyingError.localizedDescription
39+
default:
40+
break
41+
}
42+
}
43+
44+
func didTapPrimaryButton(in viewController: UIViewController?) {
45+
closeAction()
46+
}
47+
48+
func didTapSecondaryButton(in viewController: UIViewController?) { }
49+
50+
func didTapAuxiliaryButton(in viewController: UIViewController?) { }
51+
}
52+
53+
private extension CardPresentModalBuiltInConnectingFailedNonRetryable {
54+
enum Localization {
55+
static let title = NSLocalizedString(
56+
"We couldn't start Tap to Pay on iPhone",
57+
comment: "Title of the alert presented when the user tries to start Tap to Pay on iPhone and it fails"
58+
)
59+
60+
static let close = NSLocalizedString(
61+
"Close",
62+
comment: "Button to dismiss the alert presented when starting Tap to Pay on iPhone fails. This also cancels searching."
63+
)
64+
}
65+
}

WooCommerce/Classes/ViewRelated/CardPresentPayments/BuiltInCardReaderConnectionController.swift

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -471,11 +471,17 @@ private extension BuiltInCardReaderConnectionController {
471471
retrySearch: retrySearch,
472472
cancelSearch: cancelSearch))
473473
default:
474-
alertsPresenter.present(
475-
viewModel: alertsProvider.connectingFailed(
476-
error: error,
477-
continueSearch: continueSearch,
478-
cancelSearch: cancelSearch))
474+
if underlyingError.canBeResolvedByRetrying {
475+
alertsPresenter.present(
476+
viewModel: alertsProvider.connectingFailed(
477+
error: error,
478+
continueSearch: continueSearch,
479+
cancelSearch: cancelSearch))
480+
} else {
481+
alertsPresenter.present(
482+
viewModel: alertsProvider.connectingFailedNonRetryable(error: error,
483+
close: cancelSearch))
484+
}
479485
}
480486
}
481487

@@ -566,3 +572,19 @@ private extension BuiltInCardReaderConnectionController {
566572
)
567573
}
568574
}
575+
576+
private extension CardReaderServiceUnderlyingError {
577+
var canBeResolvedByRetrying: Bool {
578+
switch self {
579+
case .appleBuiltInReaderTOSAcceptanceRequiresiCloudSignIn,
580+
.passcodeNotEnabled,
581+
.appleBuiltInReaderDeviceBanned,
582+
.appleBuiltInReaderMerchantBlocked,
583+
.nfcDisabled,
584+
.unsupportedMobileDeviceConfiguration:
585+
return false
586+
default:
587+
return true
588+
}
589+
}
590+
}

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/BluetoothReaderConnectionAlertsProvider.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ struct BluetoothReaderConnectionAlertsProvider: BluetoothReaderConnnectionAlerts
2121
CardPresentModalConnectingFailed(error: error, continueSearch: continueSearch, cancelSearch: cancelSearch)
2222
}
2323

24+
func connectingFailedNonRetryable(error: Error, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
25+
CardPresentModalNonRetryableError(amount: "", error: error, onDismiss: close)
26+
}
27+
2428
func connectingFailedIncompleteAddress(openWCSettings: ((UIViewController) -> Void)?,
2529
retrySearch: @escaping () -> Void,
2630
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/BuiltInReaderConnectionAlertsProvider.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ struct BuiltInReaderConnectionAlertsProvider: CardReaderConnectionAlertsProvidin
2323
cancelSearch: cancelSearch)
2424
}
2525

26+
func connectingFailedNonRetryable(error: Error, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
27+
CardPresentModalBuiltInConnectingFailedNonRetryable(error: error,
28+
close: close)
29+
}
30+
31+
2632
func connectingFailedIncompleteAddress(openWCSettings: ((UIViewController) -> Void)?,
2733
retrySearch: @escaping () -> Void,
2834
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {

WooCommerce/Classes/ViewRelated/Dashboard/Settings/CardReadersV2/CardReaderConnectionAlertsProviding.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ protocol CardReaderConnectionAlertsProviding {
2626
continueSearch: @escaping () -> Void,
2727
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel
2828

29+
/// Defines an alert indicating connecting failed, in a way which must be resolved outside
30+
/// the connection flow. The user can close the alert.
31+
///
32+
func connectingFailedNonRetryable(error: Error,
33+
close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel
34+
2935
/// Defines an alert indicating connecting failed because their address needs updating.
3036
/// The user may try again or cancel
3137
///

WooCommerce/WooCommerce.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@
493493
03191AE628E1DF0600670723 /* WooCommercePluginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03191AE528E1DF0600670723 /* WooCommercePluginViewModel.swift */; };
494494
03191AE928E20C9200670723 /* PluginDetailsRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03191AE828E20C9200670723 /* PluginDetailsRowView.swift */; };
495495
031B10E3274FE2AE007390BA /* CardPresentModalConnectionFailedUpdateAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031B10E2274FE2AE007390BA /* CardPresentModalConnectionFailedUpdateAddress.swift */; };
496+
032E481D2982996E00469D92 /* CardPresentModalBuiltInConnectingFailedNonRetryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 032E481C2982996E00469D92 /* CardPresentModalBuiltInConnectingFailedNonRetryable.swift */; };
496497
035BA3A8291000E90056F0AD /* JustInTimeMessageAnnouncementCardViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035BA3A7291000E90056F0AD /* JustInTimeMessageAnnouncementCardViewModelTests.swift */; };
497498
035C6DEB273EA12D00F70406 /* SoftwareUpdateTypeProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035C6DEA273EA12D00F70406 /* SoftwareUpdateTypeProperty.swift */; };
498499
035DBA45292D0164003E5125 /* CollectOrderPaymentUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035DBA44292D0163003E5125 /* CollectOrderPaymentUseCase.swift */; };
@@ -2578,6 +2579,7 @@
25782579
03191AE528E1DF0600670723 /* WooCommercePluginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WooCommercePluginViewModel.swift; sourceTree = "<group>"; };
25792580
03191AE828E20C9200670723 /* PluginDetailsRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginDetailsRowView.swift; sourceTree = "<group>"; };
25802581
031B10E2274FE2AE007390BA /* CardPresentModalConnectionFailedUpdateAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentModalConnectionFailedUpdateAddress.swift; sourceTree = "<group>"; };
2582+
032E481C2982996E00469D92 /* CardPresentModalBuiltInConnectingFailedNonRetryable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CardPresentModalBuiltInConnectingFailedNonRetryable.swift; sourceTree = "<group>"; };
25812583
035BA3A7291000E90056F0AD /* JustInTimeMessageAnnouncementCardViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JustInTimeMessageAnnouncementCardViewModelTests.swift; sourceTree = "<group>"; };
25822584
035C6DEA273EA12D00F70406 /* SoftwareUpdateTypeProperty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoftwareUpdateTypeProperty.swift; sourceTree = "<group>"; };
25832585
035DBA44292D0163003E5125 /* CollectOrderPaymentUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectOrderPaymentUseCase.swift; sourceTree = "<group>"; };
@@ -8823,6 +8825,7 @@
88238825
children = (
88248826
D8815AE626383FD600EDAD62 /* CardPresentPaymentsModalViewModel.swift */,
88258827
0396CFAC2981476800E91436 /* CardPresentModalBuiltInConnectingFailed.swift */,
8828+
032E481C2982996E00469D92 /* CardPresentModalBuiltInConnectingFailedNonRetryable.swift */,
88268829
03E471C5293A2E95001A58AD /* CardPresentModalBuiltInReaderCheckingDeviceSupport.swift */,
88278830
03E471C9293E0A2F001A58AD /* CardPresentModalBuiltInConfigurationProgress.swift */,
88288831
03E471CB293E0FB8001A58AD /* CardPresentModalProgressDisplaying.swift */,
@@ -10996,6 +10999,7 @@
1099610999
023A059A24135F2600E3FC99 /* ReviewsViewController.swift in Sources */,
1099711000
B5C3876421C41B9F006CE970 /* UIApplication+Woo.swift in Sources */,
1099811001
09E41E1D27B90B3C00BFCB7C /* BulkUpdateViewModel.swift in Sources */,
11002+
032E481D2982996E00469D92 /* CardPresentModalBuiltInConnectingFailedNonRetryable.swift in Sources */,
1099911003
0379C51B27BFE23F00A7E284 /* RefundConfirmationCardDetailsCell.swift in Sources */,
1100011004
D85136B9231CED5800DD0539 /* ReviewAge.swift in Sources */,
1100111005
5718852C2465D9EC00E2486F /* ReviewsCoordinator.swift in Sources */,

Yosemite/Yosemite/Model/Model.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ public typealias CardReaderInput = Hardware.CardReaderInput
147147
public typealias CardReaderSoftwareUpdateState = Hardware.CardReaderSoftwareUpdateState
148148
public typealias CardReaderServiceDiscoveryStatus = Hardware.CardReaderServiceDiscoveryStatus
149149
public typealias CardReaderServiceError = Hardware.CardReaderServiceError
150+
public typealias CardReaderServiceUnderlyingError = Hardware.UnderlyingError
150151
public typealias CardReaderType = Hardware.CardReaderType
151152
public typealias CardReaderConfigError = Hardware.CardReaderConfigError
152153
public typealias PaymentMethod = Hardware.PaymentMethod

0 commit comments

Comments
 (0)