Skip to content

Commit 9da766d

Browse files
committed
Reuse CardReaderConnectionAnalyticsTracker in card settings - search and connected views.
1 parent cfa9f5c commit 9da766d

File tree

10 files changed

+111
-49
lines changed

10 files changed

+111
-49
lines changed

WooCommerce/Classes/ViewRelated/CardPresentPayments/CardReaderConnectionAnalyticsTracker.swift

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,18 @@ final class CardReaderConnectionAnalyticsTracker {
88
private var connectedReader: CardReader?
99

1010
/// The reader the user is trying to connect.
11-
private let candidateReader: CardReader
11+
private var candidateReader: CardReader?
1212

1313
private var updateType: SoftwareUpdateTypeProperty {
1414
optionalReaderUpdateAvailable ? .optional : .required
1515
}
1616

1717
private var cardReaderModel: String {
18-
(connectedReader ?? candidateReader).readerType.model
18+
(connectedReader ?? candidateReader)?.readerType.model ?? ""
19+
}
20+
21+
private var countryCode: String {
22+
configuration.countryCode
1923
}
2024

2125
private(set) var optionalReaderUpdateAvailable: Bool = false
@@ -30,14 +34,10 @@ final class CardReaderConnectionAnalyticsTracker {
3034
private let stores: StoresManager
3135
private let analytics: Analytics
3236

33-
init(candidateReader: CardReader,
34-
configuration: CardPresentPaymentsConfiguration,
35-
gatewayID: String?,
37+
init(configuration: CardPresentPaymentsConfiguration,
3638
stores: StoresManager = ServiceLocator.stores,
3739
analytics: Analytics = ServiceLocator.analytics) {
38-
self.candidateReader = candidateReader
3940
self.configuration = configuration
40-
self.gatewayID = gatewayID
4141
self.stores = stores
4242
self.analytics = analytics
4343

@@ -49,12 +49,16 @@ final class CardReaderConnectionAnalyticsTracker {
4949
self.gatewayID = gatewayID
5050
}
5151

52+
func setCandidateReader(_ reader: CardReader?) {
53+
candidateReader = reader
54+
}
55+
5256
/// Called when the user taps to cancel card reader software update.
5357
func softwareUpdateCancelTapped() {
5458
analytics.track(event: WooAnalyticsEvent.InPersonPayments
5559
.cardReaderSoftwareUpdateCancelTapped(forGatewayID: gatewayID,
5660
updateType: .required,
57-
countryCode: configuration.countryCode,
61+
countryCode: countryCode,
5862
cardReaderModel: cardReaderModel))
5963
}
6064

@@ -63,7 +67,7 @@ final class CardReaderConnectionAnalyticsTracker {
6367
analytics.track(event: WooAnalyticsEvent.InPersonPayments
6468
.cardReaderSoftwareUpdateCanceled(forGatewayID: gatewayID,
6569
updateType: .required,
66-
countryCode: configuration.countryCode,
70+
countryCode: countryCode,
6771
cardReaderModel: cardReaderModel))
6872
}
6973
}
@@ -89,7 +93,7 @@ private extension CardReaderConnectionAnalyticsTracker {
8993
event: WooAnalyticsEvent.InPersonPayments
9094
.cardReaderSoftwareUpdateStarted(forGatewayID: self.gatewayID,
9195
updateType: self.updateType,
92-
countryCode: self.configuration.countryCode,
96+
countryCode: self.countryCode,
9397
cardReaderModel: self.cardReaderModel)
9498
)
9599
case .failed(error: let error):
@@ -102,14 +106,14 @@ private extension CardReaderConnectionAnalyticsTracker {
102106
.cardReaderSoftwareUpdateFailed(forGatewayID: self.gatewayID,
103107
updateType: self.updateType,
104108
error: error,
105-
countryCode: self.configuration.countryCode,
109+
countryCode: self.countryCode,
106110
cardReaderModel: self.cardReaderModel))
107111
case .completed:
108112
self.softwareUpdateCancelable = nil
109113
self.analytics.track(event: WooAnalyticsEvent.InPersonPayments
110114
.cardReaderSoftwareUpdateSuccess(forGatewayID: self.gatewayID,
111115
updateType: self.updateType,
112-
countryCode: self.configuration.countryCode,
116+
countryCode: self.countryCode,
113117
cardReaderModel: self.cardReaderModel))
114118
case .available:
115119
self.optionalReaderUpdateAvailable = true

WooCommerce/Classes/ViewRelated/CardPresentPayments/CardReaderConnectionController.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ final class CardReaderConnectionController {
101101

102102
/// Tracks analytics for card reader connection events
103103
///
104-
private var analyticsTracker: CardReaderConnectionAnalyticsTracker?
104+
private let analyticsTracker: CardReaderConnectionAnalyticsTracker
105105

106106
/// Since the number of readers can go greater than 1 and then back to 1, and we don't
107107
/// want to keep changing the UI from the several-readers-found list to a single prompt
@@ -124,7 +124,7 @@ final class CardReaderConnectionController {
124124
private var gatewayID: String? {
125125
didSet {
126126
didSetGatewayID()
127-
analyticsTracker?.setGatewayID(gatewayID: gatewayID)
127+
analyticsTracker.setGatewayID(gatewayID: gatewayID)
128128
}
129129
}
130130

@@ -134,7 +134,8 @@ final class CardReaderConnectionController {
134134
stores: StoresManager = ServiceLocator.stores,
135135
knownReaderProvider: CardReaderSettingsKnownReaderProvider,
136136
alertsProvider: CardReaderSettingsAlertsProvider,
137-
configuration: CardPresentPaymentsConfiguration
137+
configuration: CardPresentPaymentsConfiguration,
138+
analyticsTracker: CardReaderConnectionAnalyticsTracker
138139
) {
139140
siteID = forSiteID
140141
self.storageManager = storageManager
@@ -146,6 +147,7 @@ final class CardReaderConnectionController {
146147
knownReaderID = nil
147148
skippedReaderIDs = []
148149
self.configuration = configuration
150+
self.analyticsTracker = analyticsTracker
149151

150152
configureResultsControllers()
151153
loadPaymentGatewayAccounts()
@@ -489,12 +491,12 @@ private extension CardReaderConnectionController {
489491
return { [weak self] in
490492
guard let self = self else { return }
491493
self.state = .cancel
492-
self.analyticsTracker?.softwareUpdateCancelTapped()
494+
self.analyticsTracker.softwareUpdateCancelTapped()
493495
cancelable.cancel { [weak self] result in
494496
if case .failure(let error) = result {
495497
DDLogError("💳 Error: canceling software update \(error)")
496498
} else {
497-
self?.analyticsTracker?.softwareUpdateCanceled()
499+
self?.analyticsTracker.softwareUpdateCanceled()
498500
}
499501
}
500502
}
@@ -537,11 +539,7 @@ private extension CardReaderConnectionController {
537539
return
538540
}
539541

540-
let analyticsTracker = CardReaderConnectionAnalyticsTracker(candidateReader: candidateReader,
541-
configuration: configuration,
542-
gatewayID: gatewayID,
543-
stores: stores)
544-
self.analyticsTracker = analyticsTracker
542+
analyticsTracker.setCandidateReader(candidateReader)
545543

546544
let softwareUpdateAction = CardPresentPaymentAction.observeCardReaderUpdateState { [weak self] softwareUpdateEvents in
547545
guard let self = self else { return }
@@ -568,9 +566,12 @@ private extension CardReaderConnectionController {
568566
stores.dispatch(softwareUpdateAction)
569567

570568
let action = CardPresentPaymentAction.connect(reader: candidateReader) { [weak self] result in
569+
guard let self = self else { return }
570+
571+
self.analyticsTracker.setCandidateReader(nil)
572+
571573
switch result {
572574
case .success(let reader):
573-
guard let self = self else { return }
574575
self.knownCardReaderProvider.rememberCardReader(cardReaderID: reader.id)
575576
ServiceLocator.analytics.track(
576577
event: WooAnalyticsEvent.InPersonPayments
@@ -589,7 +590,6 @@ private extension CardReaderConnectionController {
589590
self.returnSuccess(connected: true)
590591
}
591592
case .failure(let error):
592-
guard let self = self else { return }
593593
ServiceLocator.analytics.track(
594594
event: WooAnalyticsEvent.InPersonPayments.cardReaderConnectionFailed(forGatewayID: self.gatewayID,
595595
error: error,

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,18 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
4747
optionalReaderUpdateAvailable ? .optional : .required
4848
}
4949

50+
private let analyticsTracker: CardReaderConnectionAnalyticsTracker
51+
5052
init(didChangeShouldShow: ((CardReaderSettingsTriState) -> Void)?,
5153
knownReaderProvider: CardReaderSettingsKnownReaderProvider? = nil,
5254
configuration: CardPresentPaymentsConfiguration,
55+
analyticsTracker: CardReaderConnectionAnalyticsTracker,
5356
delayToShowUpdateSuccessMessage: DispatchTimeInterval = .seconds(1)) {
5457
self.didChangeShouldShow = didChangeShouldShow
5558
self.knownReaderProvider = knownReaderProvider
5659
self.siteID = ServiceLocator.stores.sessionManager.defaultStoreID ?? Int64.min
5760
self.configuration = configuration
61+
self.analyticsTracker = analyticsTracker
5862
self.delayToShowUpdateSuccessMessage = delayToShowUpdateSuccessMessage
5963

6064
configureResultsControllers()
@@ -194,12 +198,14 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
194198
}
195199
return { [weak self] in
196200
guard let self = self else { return }
201+
self.analyticsTracker.softwareUpdateCancelTapped()
197202
self.softwareUpdateCancelable?.cancel(completion: { [weak self] result in
198203
guard let self = self else { return }
199204

200205
if case .failure(let error) = result {
201206
DDLogError("💳 Error: canceling software update \(error)")
202207
} else {
208+
self.analyticsTracker.softwareUpdateCanceled()
203209
self.completeCardReaderUpdate(success: false)
204210
}
205211
})

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ final class CardReaderSettingsSearchingViewController: UIHostingController<CardR
2121
forSiteID: viewModel.siteID,
2222
knownReaderProvider: knownReaderProvider,
2323
alertsProvider: CardReaderSettingsAlerts(),
24-
configuration: viewModel.configuration
24+
configuration: viewModel.configuration,
25+
analyticsTracker: viewModel.cardReaderConnectionAnalyticsTracker
2526
)
2627
}()
2728

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,18 @@ final class CardReaderSettingsSearchingViewModel: CardReaderSettingsPresentedVie
3131
}
3232

3333
let configuration: CardPresentPaymentsConfiguration
34+
let cardReaderConnectionAnalyticsTracker: CardReaderConnectionAnalyticsTracker
3435

3536
init(didChangeShouldShow: ((CardReaderSettingsTriState) -> Void)?,
3637
knownReaderProvider: CardReaderSettingsKnownReaderProvider? = nil,
3738
stores: StoresManager = ServiceLocator.stores,
38-
configuration: CardPresentPaymentsConfiguration) {
39+
configuration: CardPresentPaymentsConfiguration,
40+
cardReaderConnectionAnalyticsTracker: CardReaderConnectionAnalyticsTracker) {
3941
self.didChangeShouldShow = didChangeShouldShow
4042
self.siteID = ServiceLocator.stores.sessionManager.defaultStoreID ?? Int64.min
4143
self.knownReaderProvider = knownReaderProvider
4244
self.configuration = configuration
45+
self.cardReaderConnectionAnalyticsTracker = cardReaderConnectionAnalyticsTracker
4346

4447
beginKnownReaderObservation()
4548
beginConnectedReaderObservation()

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ final class CardReaderSettingsViewModelsOrderedList: CardReaderSettingsPrioritiz
1818

1919
private var knownReaderProvider: CardReaderSettingsKnownReaderProvider?
2020

21+
private let cardReaderConnectionAnalyticsTracker: CardReaderConnectionAnalyticsTracker
22+
2123
init(configuration: CardPresentPaymentsConfiguration) {
2224
/// Initialize dependencies for viewmodels first, then viewmodels
2325
///
2426
knownReaderProvider = CardReaderSettingsKnownReaderStorage()
2527

28+
cardReaderConnectionAnalyticsTracker = CardReaderConnectionAnalyticsTracker(configuration: configuration)
29+
2630
/// Instantiate and add each viewmodel related to card reader settings to the
2731
/// array. Viewmodels will be evaluated for shouldShow starting at the top
2832
/// of the array. The first viewmodel to return true for shouldShow is given
@@ -36,7 +40,8 @@ final class CardReaderSettingsViewModelsOrderedList: CardReaderSettingsPrioritiz
3640
self?.onDidChangeShouldShow(state)
3741
},
3842
knownReaderProvider: knownReaderProvider,
39-
configuration: configuration
43+
configuration: configuration,
44+
cardReaderConnectionAnalyticsTracker: cardReaderConnectionAnalyticsTracker
4045
),
4146
viewIdentifier: "CardReaderSettingsSearchingViewController"
4247
)
@@ -49,7 +54,8 @@ final class CardReaderSettingsViewModelsOrderedList: CardReaderSettingsPrioritiz
4954
self?.onDidChangeShouldShow(state)
5055
},
5156
knownReaderProvider: knownReaderProvider,
52-
configuration: configuration
57+
configuration: configuration,
58+
analyticsTracker: cardReaderConnectionAnalyticsTracker
5359
),
5460
viewIdentifier: "CardReaderSettingsConnectedViewController"
5561
)

WooCommerce/Classes/ViewRelated/Orders/Collect Payments/CollectOrderPaymentUseCase.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ final class CollectOrderPaymentUseCase: NSObject, CollectOrderPaymentProtocol {
7878
CardReaderConnectionController(forSiteID: siteID,
7979
knownReaderProvider: CardReaderSettingsKnownReaderStorage(),
8080
alertsProvider: CardReaderSettingsAlerts(),
81-
configuration: configurationLoader.configuration)
81+
configuration: configurationLoader.configuration,
82+
analyticsTracker: CardReaderConnectionAnalyticsTracker(configuration: configurationLoader.configuration))
8283
}()
8384

8485
/// IPP Configuration loader

WooCommerce/WooCommerceTests/ViewRelated/CardPresentPayments/CardReaderConnectionControllerTests.swift

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
4949
storageManager: storageManager,
5050
knownReaderProvider: mockKnownReaderProvider,
5151
alertsProvider: mockAlerts,
52-
configuration: Mocks.configuration
52+
configuration: Mocks.configuration,
53+
analyticsTracker: .init(configuration: Mocks.configuration,
54+
stores: mockStoresManager)
5355
)
5456

5557
// When
@@ -84,7 +86,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
8486
storageManager: storageManager,
8587
knownReaderProvider: mockKnownReaderProvider,
8688
alertsProvider: mockAlerts,
87-
configuration: Mocks.configuration
89+
configuration: Mocks.configuration,
90+
analyticsTracker: .init(configuration: Mocks.configuration,
91+
stores: mockStoresManager)
8892
)
8993

9094
// When
@@ -127,7 +131,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
127131
storageManager: storageManager,
128132
knownReaderProvider: mockKnownReaderProvider,
129133
alertsProvider: mockAlerts,
130-
configuration: Mocks.configuration
134+
configuration: Mocks.configuration,
135+
analyticsTracker: .init(configuration: Mocks.configuration,
136+
stores: mockStoresManager)
131137
)
132138

133139
// When
@@ -163,7 +169,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
163169
storageManager: storageManager,
164170
knownReaderProvider: mockKnownReaderProvider,
165171
alertsProvider: mockAlerts,
166-
configuration: Mocks.configuration
172+
configuration: Mocks.configuration,
173+
analyticsTracker: .init(configuration: Mocks.configuration,
174+
stores: mockStoresManager)
167175
)
168176

169177
// When
@@ -200,7 +208,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
200208
storageManager: storageManager,
201209
knownReaderProvider: mockKnownReaderProvider,
202210
alertsProvider: mockAlerts,
203-
configuration: Mocks.configuration
211+
configuration: Mocks.configuration,
212+
analyticsTracker: .init(configuration: Mocks.configuration,
213+
stores: mockStoresManager)
204214
)
205215

206216
// When
@@ -239,7 +249,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
239249
storageManager: storageManager,
240250
knownReaderProvider: mockKnownReaderProvider,
241251
alertsProvider: mockAlerts,
242-
configuration: Mocks.configuration
252+
configuration: Mocks.configuration,
253+
analyticsTracker: .init(configuration: Mocks.configuration,
254+
stores: mockStoresManager)
243255
)
244256

245257
// When
@@ -282,7 +294,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
282294
storageManager: storageManager,
283295
knownReaderProvider: mockKnownReaderProvider,
284296
alertsProvider: mockAlerts,
285-
configuration: Mocks.configuration
297+
configuration: Mocks.configuration,
298+
analyticsTracker: .init(configuration: Mocks.configuration,
299+
stores: mockStoresManager)
286300
)
287301

288302
// When
@@ -318,7 +332,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
318332
storageManager: storageManager,
319333
knownReaderProvider: mockKnownReaderProvider,
320334
alertsProvider: mockAlerts,
321-
configuration: Mocks.configuration
335+
configuration: Mocks.configuration,
336+
analyticsTracker: .init(configuration: Mocks.configuration,
337+
stores: mockStoresManager)
322338
)
323339

324340
// When
@@ -357,7 +373,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
357373
storageManager: storageManager,
358374
knownReaderProvider: mockKnownReaderProvider,
359375
alertsProvider: mockAlerts,
360-
configuration: Mocks.configuration
376+
configuration: Mocks.configuration,
377+
analyticsTracker: .init(configuration: Mocks.configuration,
378+
stores: mockStoresManager)
361379
)
362380

363381
// When
@@ -396,7 +414,9 @@ class CardReaderConnectionControllerTests: XCTestCase {
396414
storageManager: storageManager,
397415
knownReaderProvider: mockKnownReaderProvider,
398416
alertsProvider: mockAlerts,
399-
configuration: Mocks.configuration
417+
configuration: Mocks.configuration,
418+
analyticsTracker: .init(configuration: Mocks.configuration,
419+
stores: mockStoresManager)
400420
)
401421

402422
// When

0 commit comments

Comments
 (0)