Skip to content

Commit bb36598

Browse files
committed
Only subscribe to software update state changes when candidate reader is set.
1 parent 9da766d commit bb36598

File tree

4 files changed

+119
-90
lines changed

4 files changed

+119
-90
lines changed

WooCommerce/Classes/ViewRelated/CardPresentPayments/CardReaderConnectionAnalyticsTracker.swift

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ final class CardReaderConnectionAnalyticsTracker {
2727
/// Gateway ID to include in tracks events, which could be set in initialization and/or externally.
2828
private var gatewayID: String?
2929

30-
private var softwareUpdateCancelable: FallibleCancelable? = nil
31-
private var subscriptions = Set<AnyCancellable>()
30+
private var softwareUpdateCancelable: AnyCancellable?
3231

3332
private let configuration: CardPresentPaymentsConfiguration
3433
private let stores: StoresManager
@@ -41,7 +40,7 @@ final class CardReaderConnectionAnalyticsTracker {
4140
self.stores = stores
4241
self.analytics = analytics
4342

44-
observeConnectedReaderAndSoftwareUpdate()
43+
observeConnectedReader()
4544
}
4645

4746
/// Since gateway ID could be fetched asynchronously, this can also be set externally in addition to the initializer.
@@ -51,10 +50,24 @@ final class CardReaderConnectionAnalyticsTracker {
5150

5251
func setCandidateReader(_ reader: CardReader?) {
5352
candidateReader = reader
53+
if reader != nil {
54+
observeSoftwareUpdateState()
55+
} else {
56+
softwareUpdateCancelable?.cancel()
57+
}
58+
}
59+
60+
/// Called when the user taps to update card reader software when it is available.
61+
func cardReaderSoftwareUpdateTapped() {
62+
analytics.track(event: WooAnalyticsEvent.InPersonPayments
63+
.cardReaderSoftwareUpdateTapped(forGatewayID: gatewayID,
64+
updateType: updateType,
65+
countryCode: configuration.countryCode,
66+
cardReaderModel: cardReaderModel))
5467
}
5568

5669
/// Called when the user taps to cancel card reader software update.
57-
func softwareUpdateCancelTapped() {
70+
func cardReaderSoftwareUpdateCancelTapped() {
5871
analytics.track(event: WooAnalyticsEvent.InPersonPayments
5972
.cardReaderSoftwareUpdateCancelTapped(forGatewayID: gatewayID,
6073
updateType: .required,
@@ -63,32 +76,41 @@ final class CardReaderConnectionAnalyticsTracker {
6376
}
6477

6578
/// Called after the card reader software update is canceled.
66-
func softwareUpdateCanceled() {
79+
func cardReaderSoftwareUpdateCanceled() {
80+
softwareUpdateCancelable?.cancel()
6781
analytics.track(event: WooAnalyticsEvent.InPersonPayments
6882
.cardReaderSoftwareUpdateCanceled(forGatewayID: gatewayID,
6983
updateType: .required,
7084
countryCode: countryCode,
7185
cardReaderModel: cardReaderModel))
86+
completeCardReaderUpdate(success: false)
87+
}
88+
89+
/// Called when the user taps to disconnect card reader.
90+
func cardReaderDisconnectTapped() {
91+
analytics.track(event: WooAnalyticsEvent.InPersonPayments
92+
.cardReaderDisconnectTapped(forGatewayID: gatewayID,
93+
countryCode: configuration.countryCode,
94+
cardReaderModel: cardReaderModel))
7295
}
7396
}
7497

7598
private extension CardReaderConnectionAnalyticsTracker {
76-
/// Dispatches actions to the CardPresentPaymentStore so that we can monitor changes to the list of
77-
/// connected readers and software update states.
78-
func observeConnectedReaderAndSoftwareUpdate() {
99+
func observeConnectedReader() {
79100
let action = CardPresentPaymentAction.observeConnectedReaders() { [weak self] readers in
80101
self?.connectedReader = readers.first
81102
}
82103
stores.dispatch(action)
104+
}
83105

84-
let softwareUpdateAction = CardPresentPaymentAction.observeCardReaderUpdateState { softwareUpdateEvents in
85-
softwareUpdateEvents
106+
func observeSoftwareUpdateState() {
107+
let softwareUpdateAction = CardPresentPaymentAction.observeCardReaderUpdateState { [weak self] softwareUpdateEvents in
108+
guard let self = self else { return }
109+
self.softwareUpdateCancelable = softwareUpdateEvents
86110
.sink { [weak self] state in
87111
guard let self = self else { return }
88-
89112
switch state {
90-
case .started(cancelable: let cancelable):
91-
self.softwareUpdateCancelable = cancelable
113+
case .started:
92114
self.analytics.track(
93115
event: WooAnalyticsEvent.InPersonPayments
94116
.cardReaderSoftwareUpdateStarted(forGatewayID: self.gatewayID,
@@ -108,13 +130,15 @@ private extension CardReaderConnectionAnalyticsTracker {
108130
error: error,
109131
countryCode: self.countryCode,
110132
cardReaderModel: self.cardReaderModel))
133+
self.completeCardReaderUpdate(success: false)
111134
case .completed:
112-
self.softwareUpdateCancelable = nil
135+
self.softwareUpdateCancelable?.cancel()
113136
self.analytics.track(event: WooAnalyticsEvent.InPersonPayments
114137
.cardReaderSoftwareUpdateSuccess(forGatewayID: self.gatewayID,
115138
updateType: self.updateType,
116139
countryCode: self.countryCode,
117140
cardReaderModel: self.cardReaderModel))
141+
self.completeCardReaderUpdate(success: true)
118142
case .available:
119143
self.optionalReaderUpdateAvailable = true
120144
case .none:
@@ -123,8 +147,12 @@ private extension CardReaderConnectionAnalyticsTracker {
123147
break
124148
}
125149
}
126-
.store(in: &self.subscriptions)
127150
}
128151
stores.dispatch(softwareUpdateAction)
129152
}
153+
154+
func completeCardReaderUpdate(success: Bool) {
155+
// Avoids a failed mandatory reader update being shown as optional
156+
optionalReaderUpdateAvailable = optionalReaderUpdateAvailable && !success
157+
}
130158
}

WooCommerce/Classes/ViewRelated/CardPresentPayments/CardReaderConnectionController.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,12 +491,12 @@ private extension CardReaderConnectionController {
491491
return { [weak self] in
492492
guard let self = self else { return }
493493
self.state = .cancel
494-
self.analyticsTracker.softwareUpdateCancelTapped()
494+
self.analyticsTracker.cardReaderSoftwareUpdateCancelTapped()
495495
cancelable.cancel { [weak self] result in
496496
if case .failure(let error) = result {
497497
DDLogError("💳 Error: canceling software update \(error)")
498498
} else {
499-
self?.analyticsTracker.softwareUpdateCanceled()
499+
self?.analyticsTracker.cardReaderSoftwareUpdateCanceled()
500500
}
501501
}
502502
}
@@ -544,7 +544,9 @@ private extension CardReaderConnectionController {
544544
let softwareUpdateAction = CardPresentPaymentAction.observeCardReaderUpdateState { [weak self] softwareUpdateEvents in
545545
guard let self = self else { return }
546546

547-
softwareUpdateEvents.sink { event in
547+
softwareUpdateEvents.sink { [weak self] event in
548+
guard let self = self else { return }
549+
548550
switch event {
549551
case .started(cancelable: let cancelable):
550552
self.softwareUpdateCancelable = cancelable

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

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
4343
return CardReaderSettingsDataSource(siteID: siteID)
4444
}()
4545

46-
private var updateType: SoftwareUpdateTypeProperty {
47-
optionalReaderUpdateAvailable ? .optional : .required
48-
}
49-
5046
private let analyticsTracker: CardReaderConnectionAnalyticsTracker
5147

5248
init(didChangeShouldShow: ((CardReaderSettingsTriState) -> Void)?,
@@ -179,14 +175,7 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
179175
/// Allows the view controller to kick off a card reader update
180176
///
181177
func startCardReaderUpdate() {
182-
ServiceLocator.analytics.track(
183-
event: WooAnalyticsEvent.InPersonPayments.cardReaderSoftwareUpdateTapped(
184-
forGatewayID: connectedGatewayID,
185-
updateType: updateType,
186-
countryCode: configuration.countryCode,
187-
cardReaderModel: connectedReaderModel ?? ""
188-
)
189-
)
178+
analyticsTracker.cardReaderSoftwareUpdateTapped()
190179
let action = CardPresentPaymentAction.startCardReaderUpdate
191180
ServiceLocator.stores.dispatch(action)
192181
}
@@ -198,14 +187,14 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
198187
}
199188
return { [weak self] in
200189
guard let self = self else { return }
201-
self.analyticsTracker.softwareUpdateCancelTapped()
190+
self.analyticsTracker.cardReaderSoftwareUpdateCancelTapped()
202191
self.softwareUpdateCancelable?.cancel(completion: { [weak self] result in
203192
guard let self = self else { return }
204193

205194
if case .failure(let error) = result {
206195
DDLogError("💳 Error: canceling software update \(error)")
207196
} else {
208-
self.analyticsTracker.softwareUpdateCanceled()
197+
self.analyticsTracker.cardReaderSoftwareUpdateCanceled()
209198
self.completeCardReaderUpdate(success: false)
210199
}
211200
})
@@ -227,13 +216,7 @@ final class CardReaderSettingsConnectedViewModel: CardReaderSettingsPresentedVie
227216
/// Dispatch a request to disconnect from a reader
228217
///
229218
func disconnectReader() {
230-
ServiceLocator.analytics.track(
231-
event: WooAnalyticsEvent.InPersonPayments.cardReaderDisconnectTapped(
232-
forGatewayID: connectedGatewayID,
233-
countryCode: configuration.countryCode,
234-
cardReaderModel: connectedReaderModel ?? ""
235-
)
236-
)
219+
analyticsTracker.cardReaderDisconnectTapped()
237220

238221
self.readerDisconnectInProgress = true
239222
self.didUpdate?()

0 commit comments

Comments
 (0)