Skip to content

Commit 2f718b2

Browse files
authored
Merge pull request #6908 from woocommerce/issue/6904-add-tertiary-cancel-button-to-card-reader-found-modal
[Mobile Payments] Add a Cancel button to the Card Reader Found modal
2 parents 23da628 + 49a08ae commit 2f718b2

File tree

5 files changed

+50
-11
lines changed

5 files changed

+50
-11
lines changed

WooCommerce/Classes/Extensions/UIButton+Helpers.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,15 @@ extension UIButton {
134134
tintColor = .accent
135135
}
136136

137+
/// By default UIButton adds an animation when changing the title. Use this method to avoid that
138+
///
139+
func setTitleWithoutAnimation(_ title: String?, for state: UIControl.State) {
140+
UIView.performWithoutAnimation {
141+
setTitle(title, for: .normal)
142+
layoutIfNeeded()
143+
}
144+
}
145+
137146
/// Supports title of multiple lines, either from longer text than allocated width or text with line breaks.
138147
private func enableMultipleLines() {
139148
titleLabel?.lineBreakMode = .byWordWrapping

WooCommerce/Classes/ViewModels/CardPresentPayments/CardPresentModalFoundReader.swift

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ final class CardPresentModalFoundReader: CardPresentPaymentsModalViewModel {
99
/// Called when keep searching button is tapped
1010
private let continueSearchAction: () -> Void
1111

12+
/// Called when the cancel button is tapped
13+
private let cancelAction: () -> Void
14+
1215
let textMode: PaymentsModalTextMode = .noBottomInfo
13-
let actionsMode: PaymentsModalActionsMode = .twoAction
16+
let actionsMode: PaymentsModalActionsMode = .twoActionAndAuxiliary
1417

1518
var topTitle: String
1619

@@ -22,7 +25,7 @@ final class CardPresentModalFoundReader: CardPresentPaymentsModalViewModel {
2225

2326
let secondaryButtonTitle: String? = Localization.continueSearching
2427

25-
let auxiliaryButtonTitle: String? = nil
28+
let auxiliaryButtonTitle: String? = Localization.cancel
2629

2730
let bottomTitle: String? = nil
2831

@@ -32,10 +35,11 @@ final class CardPresentModalFoundReader: CardPresentPaymentsModalViewModel {
3235
return Localization.connect
3336
}
3437

35-
init(name: String, connect: @escaping () -> Void, continueSearch: @escaping () -> Void) {
38+
init(name: String, connect: @escaping () -> Void, continueSearch: @escaping () -> Void, cancel: @escaping () -> Void) {
3639
self.topTitle = String.localizedStringWithFormat(Localization.title, name)
3740
self.connectAction = connect
3841
self.continueSearchAction = continueSearch
42+
self.cancelAction = cancel
3943
}
4044

4145
func didTapPrimaryButton(in viewController: UIViewController?) {
@@ -46,7 +50,9 @@ final class CardPresentModalFoundReader: CardPresentPaymentsModalViewModel {
4650
continueSearchAction()
4751
}
4852

49-
func didTapAuxiliaryButton(in viewController: UIViewController?) {}
53+
func didTapAuxiliaryButton(in viewController: UIViewController?) {
54+
cancelAction()
55+
}
5056
}
5157

5258
private extension CardPresentModalFoundReader {
@@ -65,5 +71,10 @@ private extension CardPresentModalFoundReader {
6571
"Keep Searching",
6672
comment: "Label for a button that when tapped, continues searching for card readers"
6773
)
74+
75+
static let cancel = NSLocalizedString(
76+
"Cancel",
77+
comment: "Label for a button that when tapped, cancels the process of connecting to a card reader "
78+
)
6879
}
6980
}

WooCommerce/Classes/ViewRelated/CardPresentPayments/CardPresentPaymentsModalViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ private extension CardPresentPaymentsModalViewController {
279279
return
280280
}
281281

282+
auxiliaryButton.setTitleWithoutAnimation(viewModel.auxiliaryButtonTitle, for: .normal)
282283
auxiliaryButton.isHidden = false
283-
auxiliaryButton.setTitle(viewModel.auxiliaryButtonTitle, for: .normal)
284284
}
285285

286286
func configureSpacer() {

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ final class CardReaderSettingsAlerts: CardReaderSettingsAlertsProvider {
5858
setViewModelAndPresent(from: from,
5959
viewModel: foundReader(name: name,
6060
connect: connect,
61-
continueSearch: continueSearch
61+
continueSearch: continueSearch,
62+
cancel: { from.dismiss(animated: true) }
6263
)
6364
)
6465
}
@@ -208,8 +209,10 @@ private extension CardReaderSettingsAlerts {
208209
}
209210
}
210211

211-
func foundReader(name: String, connect: @escaping () -> Void, continueSearch: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
212-
CardPresentModalFoundReader(name: name, connect: connect, continueSearch: continueSearch)
212+
func foundReader(name: String, connect: @escaping () -> Void,
213+
continueSearch: @escaping () -> Void,
214+
cancel: @escaping () -> Void) -> CardPresentPaymentsModalViewModel {
215+
CardPresentModalFoundReader(name: name, connect: connect, continueSearch: continueSearch, cancel: cancel)
213216
}
214217

215218
func setViewModelAndPresent(from: UIViewController, viewModel: CardPresentPaymentsModalViewModel) {

WooCommerce/WooCommerceTests/ViewModels/CardPresentPayments/CardPresentModalFoundReaderTests.swift

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ final class CardPresentModalFoundReaderTests: XCTestCase {
88
override func setUp() {
99
super.setUp()
1010
closures = Closures()
11-
viewModel = CardPresentModalFoundReader(name: Expectations.name, connect: closures.primaryAction(), continueSearch: closures.secondaryAction())
11+
viewModel = CardPresentModalFoundReader(name: Expectations.name,
12+
connect: closures.primaryAction(),
13+
continueSearch: closures.secondaryAction(),
14+
cancel: closures.auxiliaryAction())
1215
}
1316

1417
override func tearDown() {
@@ -36,8 +39,8 @@ final class CardPresentModalFoundReaderTests: XCTestCase {
3639
XCTAssertNotNil(viewModel.secondaryButtonTitle)
3740
}
3841

39-
func test_auxiliary_button_title_is_nil() {
40-
XCTAssertNil(viewModel.auxiliaryButtonTitle)
42+
func test_auxiliary_button_title_is_not_nil() {
43+
XCTAssertNotNil(viewModel.auxiliaryButtonTitle)
4144
}
4245

4346
func test_bottom_title_is_nil() {
@@ -59,6 +62,12 @@ final class CardPresentModalFoundReaderTests: XCTestCase {
5962

6063
XCTAssertTrue(closures.didTapContinue)
6164
}
65+
66+
func test_auxiliary_button_action_calls_closure() {
67+
viewModel.didTapAuxiliaryButton(in: nil)
68+
69+
XCTAssertTrue(closures.didTapCancel)
70+
}
6271
}
6372

6473

@@ -74,6 +83,7 @@ private extension CardPresentModalFoundReaderTests {
7483
private final class Closures {
7584
var didTapConnect = false
7685
var didTapContinue = false
86+
var didTapCancel = false
7787

7888
func primaryAction() -> () -> Void {
7989
return {[weak self] in
@@ -86,4 +96,10 @@ private final class Closures {
8696
self?.didTapContinue = true
8797
}
8898
}
99+
100+
func auxiliaryAction() -> () -> Void {
101+
return {[weak self] in
102+
self?.didTapCancel = true
103+
}
104+
}
89105
}

0 commit comments

Comments
 (0)