@@ -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
7598private 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}
0 commit comments