Skip to content

Commit cf3dbf0

Browse files
committed
8082 Add temporary tap on iphone connection screens
1 parent 58cd33b commit cf3dbf0

File tree

12 files changed

+262
-16
lines changed

12 files changed

+262
-16
lines changed

WooCommerce/Classes/Extensions/UIImage+Woo.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,18 @@ extension UIImage {
492492
return UIImage(named: "card-reader-scanning")!
493493
}
494494

495+
static var tempBuiltInReaderCheck: UIImage {
496+
return UIImage(named: "temp-woo-tap-on-mobile-check")!
497+
}
498+
499+
static var tempBuiltInReaderPrepare: UIImage {
500+
return UIImage(named: "temp-woo-tap-on-mobile-prepare")!
501+
}
502+
503+
static var tempBuiltInReaderPayment: UIImage {
504+
return UIImage(named: "temp-woo-tap-on-mobile")!
505+
}
506+
495507
/// Found Card Reader
496508
///
497509
static var cardReaderFound: UIImage {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import UIKit
2+
3+
/// Modal presented when we are connecting to a reader
4+
///
5+
final class CardPresentModalBuiltInConnectingToReader: CardPresentPaymentsModalViewModel {
6+
let textMode: PaymentsModalTextMode = .reducedBottomInfo
7+
let actionsMode: PaymentsModalActionsMode = .none
8+
9+
let topTitle: String = Localization.title
10+
11+
var topSubtitle: String?
12+
13+
let image: UIImage = .tempBuiltInReaderCheck
14+
15+
let primaryButtonTitle: String? = nil
16+
17+
let secondaryButtonTitle: String? = nil
18+
19+
let auxiliaryButtonTitle: String? = nil
20+
21+
let bottomTitle: String? = Localization.instruction
22+
23+
var bottomSubtitle: String?
24+
25+
var accessibilityLabel: String? {
26+
return topTitle + Localization.instruction
27+
}
28+
29+
init() {}
30+
31+
func didTapPrimaryButton(in viewController: UIViewController?) {}
32+
33+
func didTapSecondaryButton(in viewController: UIViewController?) {}
34+
35+
func didTapAuxiliaryButton(in viewController: UIViewController?) {}
36+
}
37+
38+
private extension CardPresentModalBuiltInConnectingToReader {
39+
enum Localization {
40+
static let title = NSLocalizedString(
41+
"Preparing iPhone card reader...",
42+
comment: "Title label for modal dialog that appears when connecting to a built in card reader"
43+
)
44+
45+
static let instruction = NSLocalizedString(
46+
"The first time you connect, you may be prompted to accept Apple's Terms of Service.",
47+
comment: "Label within the modal dialog that appears when connecting to a built in card reader"
48+
)
49+
}
50+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import UIKit
2+
3+
/// Modal presented when we are scanning for a reader to connect to
4+
///
5+
final class CardPresentModalBuiltInReaderCheckingDeviceSupport: CardPresentPaymentsModalViewModel {
6+
/// Called when cancel button is tapped
7+
private let cancelAction: () -> Void
8+
9+
let textMode: PaymentsModalTextMode = .reducedBottomInfo
10+
let actionsMode: PaymentsModalActionsMode = .secondaryActionAndAuxiliaryButton
11+
12+
let topTitle: String = Localization.title
13+
14+
var topSubtitle: String?
15+
16+
let image: UIImage = .tempBuiltInReaderPrepare
17+
18+
let primaryButtonTitle: String? = nil
19+
20+
let secondaryButtonTitle: String? = Localization.cancel
21+
22+
let auxiliaryButtonTitle: String? = nil
23+
24+
let auxiliaryButtonimage: UIImage? = .infoOutlineImage
25+
26+
var auxiliaryAttributedButtonTitle: NSAttributedString? {
27+
let result = NSMutableAttributedString(
28+
string: .localizedStringWithFormat(
29+
Localization.learnMoreText,
30+
Localization.learnMoreLink
31+
),
32+
attributes: [.foregroundColor: UIColor.text]
33+
)
34+
result.replaceFirstOccurrence(
35+
of: Localization.learnMoreLink,
36+
with: NSAttributedString(
37+
string: Localization.learnMoreLink,
38+
attributes: [
39+
.foregroundColor: UIColor.accent,
40+
.underlineStyle: NSUnderlineStyle.single.rawValue
41+
]
42+
))
43+
result.addAttribute(.font, value: UIFont.footnote, range: NSRange(location: 0, length: result.length))
44+
return result
45+
}
46+
47+
let bottomTitle: String? = Localization.instruction
48+
49+
var bottomSubtitle: String?
50+
51+
var accessibilityLabel: String? {
52+
guard let bottomTitle = bottomTitle else {
53+
return topTitle
54+
}
55+
return topTitle + bottomTitle
56+
}
57+
58+
init(cancel: @escaping () -> Void) {
59+
self.cancelAction = cancel
60+
}
61+
62+
func didTapPrimaryButton(in viewController: UIViewController?) {}
63+
64+
func didTapSecondaryButton(in viewController: UIViewController?) {
65+
cancelAction()
66+
}
67+
68+
func didTapAuxiliaryButton(in viewController: UIViewController?) {
69+
ServiceLocator.analytics.track(.cardPresentOnboardingLearnMoreTapped)
70+
guard let viewController = viewController else {
71+
return
72+
}
73+
WebviewHelper.launch(Constants.learnMoreURL.asURL(), with: viewController)
74+
}
75+
}
76+
77+
private extension CardPresentModalBuiltInReaderCheckingDeviceSupport {
78+
enum Constants {
79+
static let learnMoreURL = WooConstants.URLs.inPersonPaymentsLearnMoreWCPay
80+
}
81+
82+
enum Localization {
83+
static let title = NSLocalizedString(
84+
"cardPresent.builtIn.modalCheckingDeviceSupport.title",
85+
value: "Checking device",
86+
comment: "Title label for modal dialog that appears when searching for a card reader"
87+
)
88+
89+
static let instruction = NSLocalizedString(
90+
"cardPresent.builtIn.modalCheckingDeviceSupport.instruction",
91+
value: "Please wait while we check that your device is ready for Tap to Pay on iPhone.",
92+
comment: "Label within the modal dialog that appears when checking the built in card reader"
93+
)
94+
95+
static let cancel = NSLocalizedString(
96+
"cardPresent.builtIn.modalCheckingDeviceSupport.cancelButton",
97+
value: "Cancel",
98+
comment: "Label for a cancel button"
99+
)
100+
101+
static let learnMoreLink = NSLocalizedString(
102+
"cardPresent.builtIn.modalCheckingDeviceSupport.learnMore.link",
103+
value: "Learn more",
104+
comment: """
105+
A label prompting users to learn more about In-Person Payments.
106+
This is the link to the website, and forms part of a longer sentence which it should be considered a part of.
107+
"""
108+
)
109+
110+
static let learnMoreText = NSLocalizedString(
111+
"cardPresent.builtIn.modalCheckingDeviceSupport.learnMore.text",
112+
value: "%1$@ about In‑Person Payments",
113+
comment: """
114+
A label prompting users to learn more about In-Person Payments.
115+
The hyphen in "In‑Person" is a non-breaking hyphen (U+2011).
116+
If your translation of that term also happens to contains a hyphen, please be sure to use the non-breaking hyphen character for it.
117+
%1$@ is a placeholder that always replaced with \"Learn more\" string,
118+
which should be translated separately and considered part of this sentence.
119+
"""
120+
)
121+
}
122+
}

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,59 @@ struct BluetoothReaderConnectionAlertsProvider: BluetoothReaderConnnectionAlerts
66
CardPresentModalScanningForReader(cancel: cancel)
77
}
88

9-
func scanningFailed(error: Error, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
9+
func scanningFailed(error: Error,
10+
close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
1011
CardPresentModalScanningFailed(error: error, primaryAction: close)
1112
}
1213

1314
func connectingToReader() -> CardPresentPaymentsModalViewModel {
1415
CardPresentModalConnectingToReader()
1516
}
1617

17-
func connectingFailed(continueSearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
18+
func connectingFailed(continueSearch: @escaping () -> Void,
19+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
1820
CardPresentModalConnectingFailed(continueSearch: continueSearch, cancelSearch: cancelSearch)
1921
}
2022

21-
func connectingFailedIncompleteAddress(openWCSettings: ((UIViewController) -> Void)?, retrySearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
23+
func connectingFailedIncompleteAddress(openWCSettings: ((UIViewController) -> Void)?,
24+
retrySearch: @escaping () -> Void,
25+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
2226
CardPresentModalConnectingFailedUpdateAddress(openWCSettings: openWCSettings, retrySearch: retrySearch, cancelSearch: cancelSearch)
2327
}
2428

25-
func connectingFailedInvalidPostalCode(retrySearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
29+
func connectingFailedInvalidPostalCode(retrySearch: @escaping () -> Void,
30+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
2631
CardPresentModalConnectingFailedUpdatePostalCode(retrySearch: retrySearch, cancelSearch: cancelSearch)
2732
}
2833

29-
func updatingFailed(tryAgain: (() -> Void)?, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
34+
func updatingFailed(tryAgain: (() -> Void)?,
35+
close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
3036
if let tryAgain = tryAgain {
3137
return CardPresentModalUpdateFailed(tryAgain: tryAgain, close: close)
3238
} else {
3339
return CardPresentModalUpdateFailedNonRetryable(close: close)
3440
}
3541
}
36-
func updateProgress(requiredUpdate: Bool, progress: Float, cancel: (() -> Void)?) -> CardPresentPaymentsModalViewModel {
42+
func updateProgress(requiredUpdate: Bool,
43+
progress: Float,
44+
cancel: (() -> Void)?) -> CardPresentPaymentsModalViewModel {
3745
CardPresentModalUpdateProgress(requiredUpdate: requiredUpdate, progress: progress, cancel: cancel)
3846
}
3947

40-
func foundReader(name: String, connect: @escaping () -> Void, continueSearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
48+
func foundReader(name: String,
49+
connect: @escaping () -> Void,
50+
continueSearch: @escaping () -> Void,
51+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
4152
CardPresentModalFoundReader(name: name, connect: connect, continueSearch: continueSearch, cancel: cancelSearch)
4253
}
4354

44-
func connectingFailedCriticallyLowBattery(retrySearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
55+
func connectingFailedCriticallyLowBattery(retrySearch: @escaping () -> Void,
56+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
4557
CardPresentModalConnectingFailedChargeReader(retrySearch: retrySearch, cancelSearch: cancelSearch)
4658
}
4759

48-
func updatingFailedLowBattery(batteryLevel: Double?, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
60+
func updatingFailedLowBattery(batteryLevel: Double?,
61+
close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
4962
CardPresentModalUpdateFailedLowBattery(batteryLevel: batteryLevel, close: close)
5063
}
5164

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@ import UIKit
33

44
struct BuiltInReaderConnectionAlertsProvider: CardReaderConnectionAlertsProviding {
55
func scanningForReader(cancel: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
6-
CardPresentModalScanningForReader(cancel: cancel)
6+
CardPresentModalBuiltInReaderCheckingDeviceSupport(cancel: cancel)
77
}
88

9-
func scanningFailed(error: Error, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
9+
func scanningFailed(error: Error,
10+
close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
1011
CardPresentModalScanningFailed(error: error, primaryAction: close)
1112
}
1213

1314
func connectingToReader() -> CardPresentPaymentsModalViewModel {
14-
CardPresentModalConnectingToReader()
15+
CardPresentModalBuiltInConnectingToReader()
1516
}
1617

17-
func connectingFailed(continueSearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
18+
func connectingFailed(continueSearch: @escaping () -> Void,
19+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
1820
CardPresentModalConnectingFailed(continueSearch: continueSearch, cancelSearch: cancelSearch)
1921
}
2022

@@ -24,18 +26,21 @@ struct BuiltInReaderConnectionAlertsProvider: CardReaderConnectionAlertsProvidin
2426
CardPresentModalConnectingFailedUpdateAddress(openWCSettings: openWCSettings, retrySearch: retrySearch, cancelSearch: cancelSearch)
2527
}
2628

27-
func connectingFailedInvalidPostalCode(retrySearch: @escaping () -> Void, cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
29+
func connectingFailedInvalidPostalCode(retrySearch: @escaping () -> Void,
30+
cancelSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
2831
CardPresentModalConnectingFailedUpdatePostalCode(retrySearch: retrySearch, cancelSearch: cancelSearch)
2932
}
3033

31-
func updatingFailed(tryAgain: (() -> Void)?, close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
34+
func updatingFailed(tryAgain: (() -> Void)?,
35+
close: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
3236
if let tryAgain = tryAgain {
3337
return CardPresentModalUpdateFailed(tryAgain: tryAgain, close: close)
3438
} else {
3539
return CardPresentModalUpdateFailedNonRetryable(close: close)
3640
}
3741
}
38-
func updateProgress(requiredUpdate: Bool, progress: Float, cancel: (() -> Void)?) -> CardPresentPaymentsModalViewModel {
42+
func updateProgress(requiredUpdate: Bool, progress: Float,
43+
cancel: (() -> Void)?) -> CardPresentPaymentsModalViewModel {
3944
CardPresentModalUpdateProgress(requiredUpdate: requiredUpdate, progress: progress, cancel: cancel)
4045
}
4146
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "temp-woo-tap-on-mobile-check~universal.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "temp-woo-tap-on-mobile-prepare~universal.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "temp-woo-tap-on-mobile~universal.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}

0 commit comments

Comments
 (0)