@@ -10,9 +10,39 @@ import protocol Yosemite.StoresManager
1010final class CardPresentPaymentService: CardPresentPaymentFacade {
1111 let paymentEventPublisher : AnyPublisher < CardPresentPaymentEvent , Never >
1212
13- let readerConnectionStatusPublisher : AnyPublisher < CardPresentPaymentReaderConnectionStatus , Never >
14-
15- private let connectedReaderPublisher : AnyPublisher < CardPresentPaymentCardReader ? , Never >
13+ lazy var readerConnectionStatusPublisher : AnyPublisher < CardPresentPaymentReaderConnectionStatus , Never > = {
14+ connectedReaderPublisher
15+ . map ( { reader -> CardPresentPaymentReaderConnectionStatus in
16+ guard let reader else {
17+ return . disconnected
18+ }
19+ return . connected( reader)
20+ } )
21+ . merge ( with: paymentAlertsPresenterAdaptor. readerConnectionStatusPublisher)
22+ . merge ( with: readerConnectionStatusSubject)
23+ . receive ( on: DispatchQueue . main)
24+ . eraseToAnyPublisher ( )
25+ } ( )
26+
27+ private let connectedReaderSubject = PassthroughSubject < CardPresentPaymentCardReader ? , Never > ( )
28+ private lazy var connectedReaderPublisher : AnyPublisher < CardPresentPaymentCardReader ? , Never > = {
29+ let action = CardPresentPaymentAction . publishCardReaderConnections { [ weak self] cardReadersConnectionPublisher in
30+ guard let self else { return }
31+ cardReadersConnectionPublisher
32+ . map { readers -> CardPresentPaymentCardReader ? in
33+ guard let reader = readers. first else {
34+ return nil
35+ }
36+ return CardPresentPaymentCardReader ( name: reader. name ?? reader. id,
37+ batteryLevel: reader. batteryLevel)
38+ }
39+ . receive ( on: DispatchQueue . main)
40+ . subscribe ( self . connectedReaderSubject)
41+ . store ( in: & self . subscriptions)
42+ }
43+ stores. dispatch ( action)
44+ return connectedReaderSubject. eraseToAnyPublisher ( )
45+ } ( )
1646
1747 private let paymentEventSubject = PassthroughSubject < CardPresentPaymentEvent , Never > ( )
1848
@@ -33,8 +63,11 @@ final class CardPresentPaymentService: CardPresentPaymentFacade {
3363
3464 private var paymentTask : Task < CardPresentPaymentAdaptedCollectOrderPaymentResult , Error > ?
3565
36- @MainActor
37- init ( siteID: Int64 , stores: StoresManager = ServiceLocator . stores, collectOrderPaymentAnalyticsTracker: CollectOrderPaymentAnalyticsTracking ) async {
66+ private var subscriptions = Set < AnyCancellable > ( )
67+
68+ init ( siteID: Int64 ,
69+ stores: StoresManager = ServiceLocator . stores,
70+ collectOrderPaymentAnalyticsTracker: CollectOrderPaymentAnalyticsTracking ) {
3871 self . siteID = siteID
3972 let onboardingAdaptor = CardPresentPaymentsOnboardingPresenterAdaptor ( )
4073 self . onboardingAdaptor = onboardingAdaptor
@@ -61,21 +94,6 @@ final class CardPresentPaymentService: CardPresentPaymentFacade {
6194 . merge ( with: paymentEventSubject)
6295 . receive ( on: DispatchQueue . main) // These will be used for UI changes, so moving to the Main thread helps.
6396 . eraseToAnyPublisher ( )
64-
65- let connectedReaderPublisher = await Self . createCardReaderConnectionPublisher ( stores: stores)
66- self . connectedReaderPublisher = connectedReaderPublisher
67-
68- readerConnectionStatusPublisher = connectedReaderPublisher
69- . map ( { reader -> CardPresentPaymentReaderConnectionStatus in
70- guard let reader else {
71- return . disconnected
72- }
73- return . connected( reader)
74- } )
75- . merge ( with: paymentAlertsPresenterAdaptor. readerConnectionStatusPublisher)
76- . merge ( with: readerConnectionStatusSubject)
77- . receive ( on: DispatchQueue . main)
78- . eraseToAnyPublisher ( )
7997 }
8098
8199 @MainActor
@@ -183,30 +201,6 @@ final class CardPresentPaymentService: CardPresentPaymentFacade {
183201}
184202
185203private extension CardPresentPaymentService {
186- @MainActor
187- static func createCardReaderConnectionPublisher( stores: StoresManager ) async -> AnyPublisher < CardPresentPaymentCardReader ? , Never > {
188- return await withCheckedContinuation { continuation in
189- var nillableContinuation : CheckedContinuation < AnyPublisher < CardPresentPaymentCardReader ? , Never > , Never > ? = continuation
190-
191- let action = CardPresentPaymentAction . publishCardReaderConnections { cardReadersConnectionPublisher in
192- let readerConnectionPublisher = cardReadersConnectionPublisher
193- . map { readers -> CardPresentPaymentCardReader ? in
194- guard let reader = readers. first else {
195- return nil
196- }
197- return CardPresentPaymentCardReader ( name: reader. name ?? reader. id,
198- batteryLevel: reader. batteryLevel)
199- }
200- . receive ( on: DispatchQueue . main)
201- . eraseToAnyPublisher ( )
202-
203- nillableContinuation? . resume ( returning: readerConnectionPublisher)
204- nillableContinuation = nil
205- }
206- stores. dispatch ( action)
207- }
208- }
209-
210204 func createPreflightController( ) -> CardPresentPaymentPreflightController <
211205 CardPresentPaymentBuiltInReaderConnectionAlertsProvider ,
212206 CardPresentPaymentBluetoothReaderConnectionAlertsProvider ,
0 commit comments