Skip to content

Commit 04fd036

Browse files
committed
Structure POSServiceLocatorAdaptor to always use ServiceLocator when services are accessed
1 parent 3468eaa commit 04fd036

File tree

8 files changed

+94
-99
lines changed

8 files changed

+94
-99
lines changed

Modules/Sources/PointOfSale/DependencyProviders/POSDependencyProviding.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,31 @@ import struct Yosemite.Site
88
/// This abstracts away direct ServiceLocator access
99
public protocol POSDependencyProviding {
1010
var analytics: POSAnalyticsProviding { get }
11-
var currency: CurrencySettings { get }
11+
var currency: POSCurrencySettingsProviding { get }
1212
var featureFlags: POSFeatureFlagProviding { get }
1313
var session: POSSessionManagerProviding { get }
14-
var connectivity: ConnectivityObserver { get }
14+
var connectivity: POSConnectivityProviding { get }
1515
}
1616

17-
/// Analytics service abstraction
1817
public protocol POSAnalyticsProviding {
1918
func track(event: WooAnalyticsEvent)
2019
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType], error: Error)
2120
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType])
2221
func track(_ stat: WooAnalyticsStat)
2322
}
2423

25-
/// Session manager abstraction
2624
public protocol POSSessionManagerProviding {
2725
var defaultSite: Site? { get }
2826
}
2927

30-
/// Feature flag service abstraction
3128
public protocol POSFeatureFlagProviding {
3229
func isFeatureFlagEnabled(_ flag: FeatureFlag) -> Bool
3330
}
31+
32+
public protocol POSCurrencySettingsProviding {
33+
var currencySettings: CurrencySettings { get }
34+
}
35+
36+
public protocol POSConnectivityProviding {
37+
var connectivityObserver: ConnectivityObserver { get }
38+
}

WooCommerce/Classes/POS/Adaptors/POSServiceLocatorAdaptor.swift

Lines changed: 25 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,91 +9,68 @@ import protocol Storage.StorageManagerType
99
import protocol Yosemite.Action
1010

1111
/// Adaptor that bridges main app ServiceLocator to POS dependency abstraction to support POS modularization
12+
/// ServiceLocator is used directly in getters to always get the latest version of services at the moment they are used
13+
///
1214
final class POSServiceLocatorAdaptor: POSDependencyProviding {
13-
private let featureFlagService: FeatureFlagService
14-
private let storesManager: StoresManager
15-
private let connectivityObserver: ConnectivityObserver
16-
private let currencySettings: CurrencySettings
17-
private let serviceAnalytics: Analytics
18-
19-
init(featureFlagService: FeatureFlagService = ServiceLocator.featureFlagService,
20-
storesManager: StoresManager = ServiceLocator.stores,
21-
connectivityObserver: ConnectivityObserver = ServiceLocator.connectivityObserver,
22-
currencySettings: CurrencySettings = ServiceLocator.currencySettings,
23-
analytics: Analytics = ServiceLocator.analytics
24-
) {
25-
self.featureFlagService = featureFlagService
26-
self.storesManager = storesManager
27-
self.connectivityObserver = connectivityObserver
28-
self.currencySettings = currencySettings
29-
self.serviceAnalytics = analytics
30-
}
31-
3215
var analytics: POSAnalyticsProviding {
33-
POSAnalyticsAdaptor(analytics: serviceAnalytics)
16+
POSAnalyticsAdaptor()
3417
}
3518

36-
var currency: CurrencySettings {
37-
currencySettings
19+
var currency: POSCurrencySettingsProviding {
20+
POSCurrencySettingsAdaptor()
3821
}
3922

4023
var featureFlags: POSFeatureFlagProviding {
41-
POSFeatureFlagAdaptor(featureFlagService: featureFlagService)
24+
POSFeatureFlagAdaptor()
4225
}
4326

4427
var session: POSSessionManagerProviding {
45-
POSSessionManagerAdaptor(sessionManager: storesManager.sessionManager)
28+
POSSessionManagerAdaptor()
4629
}
4730

48-
var connectivity: ConnectivityObserver {
49-
connectivityObserver
31+
var connectivity: POSConnectivityProviding {
32+
POSConnectivityAdaptor()
5033
}
5134
}
5235

5336
private struct POSSessionManagerAdaptor: POSSessionManagerProviding {
54-
private let sessionManager: SessionManagerProtocol
55-
56-
init(sessionManager: SessionManagerProtocol) {
57-
self.sessionManager = sessionManager
58-
}
59-
6037
var defaultSite: Site? {
61-
return sessionManager.defaultSite
38+
return ServiceLocator.stores.sessionManager.defaultSite
6239
}
6340
}
6441

65-
private struct POSFeatureFlagAdaptor: POSFeatureFlagProviding {
66-
private let featureFlagService: FeatureFlagService
67-
68-
init(featureFlagService: FeatureFlagService) {
69-
self.featureFlagService = featureFlagService
42+
private struct POSCurrencySettingsAdaptor: POSCurrencySettingsProviding {
43+
var currencySettings: CurrencySettings {
44+
ServiceLocator.currencySettings
7045
}
46+
}
7147

48+
private struct POSFeatureFlagAdaptor: POSFeatureFlagProviding {
7249
func isFeatureFlagEnabled(_ flag: FeatureFlag) -> Bool {
73-
return featureFlagService.isFeatureFlagEnabled(flag)
50+
return ServiceLocator.featureFlagService.isFeatureFlagEnabled(flag)
7451
}
7552
}
7653

7754
private struct POSAnalyticsAdaptor: POSAnalyticsProviding {
78-
private let analytics: Analytics
79-
80-
init(analytics: Analytics = ServiceLocator.analytics) {
81-
self.analytics = analytics
82-
}
83-
8455
func track(event: WooAnalyticsEvent) {
85-
analytics.track(event: event)
56+
ServiceLocator.analytics.track(event: event)
8657
}
8758

8859
func track(_ stat: WooAnalyticsStat) {
8960
track(stat, parameters: [:])
9061
}
9162

9263
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType] = [:]) {
93-
analytics.track(stat, withProperties: parameters)
64+
ServiceLocator.analytics.track(stat, withProperties: parameters)
9465
}
9566

9667
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType] = [:], error: Error) {
97-
analytics.track(stat, properties: parameters, error: error)
68+
ServiceLocator.analytics.track(stat, properties: parameters, error: error)
69+
}
70+
}
71+
72+
private struct POSConnectivityAdaptor: POSConnectivityProviding {
73+
var connectivityObserver: ConnectivityObserver {
74+
ServiceLocator.connectivityObserver
9875
}
9976
}

WooCommerce/Classes/POS/Controllers/PointOfSaleOrderController.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,14 @@ protocol PointOfSaleOrderControllerProtocol {
4242
@Observable final class PointOfSaleOrderController: PointOfSaleOrderControllerProtocol {
4343
init(orderService: POSOrderServiceProtocol,
4444
receiptService: POSReceiptServiceProtocol,
45-
currencySettings: CurrencySettings,
45+
currencySettingsProvider: POSCurrencySettingsProviding,
4646
analytics: POSAnalyticsProviding,
4747
featureFlagService: POSFeatureFlagProviding,
4848
pluginsService: PluginsServiceProtocol,
4949
celebration: PaymentCaptureCelebrationProtocol = PaymentCaptureCelebration()) {
5050
self.orderService = orderService
5151
self.receiptService = receiptService
52-
self.storeCurrency = currencySettings.currencyCode
53-
self.currencyFormatter = CurrencyFormatter(currencySettings: currencySettings)
52+
self.currencySettingsProvider = currencySettingsProvider
5453
self.analytics = analytics
5554
self.featureFlagService = featureFlagService
5655
self.pluginsService = pluginsService
@@ -59,17 +58,23 @@ protocol PointOfSaleOrderControllerProtocol {
5958

6059
private let orderService: POSOrderServiceProtocol
6160
private let receiptService: POSReceiptServiceProtocol
62-
63-
private let currencyFormatter: CurrencyFormatter
61+
private let currencySettingsProvider: POSCurrencySettingsProviding
6462
private let celebration: PaymentCaptureCelebrationProtocol
65-
private let storeCurrency: CurrencyCode
6663
private let analytics: POSAnalyticsProviding
6764
private let featureFlagService: POSFeatureFlagProviding
6865
private let pluginsService: PluginsServiceProtocol
6966

7067
private(set) var orderState: PointOfSaleInternalOrderState = .idle
7168
private var order: Order? = nil
7269

70+
private var currencyFormatter: CurrencyFormatter {
71+
CurrencyFormatter(currencySettings: currencySettingsProvider.currencySettings)
72+
}
73+
74+
private var storeCurrency: CurrencyCode {
75+
currencySettingsProvider.currencySettings.currencyCode
76+
}
77+
7378
@MainActor @discardableResult
7479
func syncOrder(for cart: Cart,
7580
retryHandler: @escaping () async -> Void) async -> Result<SyncOrderState, Error> {

WooCommerce/Classes/POS/Presentation/PointOfSaleEntryPointView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ struct PointOfSaleEntryPointView: View {
8181
}
8282
.environmentObject(posModalManager)
8383
.environment(\.posAnalytics, services.analytics)
84-
.environment(\.posCurrencySettings, services.currency)
84+
.environment(\.posCurrencyProvider, services.currency)
8585
.environment(\.posFeatureFlags, services.featureFlags)
8686
.environment(\.posSession, services.session)
87-
.environment(\.posConnectivity, services.connectivity)
87+
.environment(\.posConnectivityProvider, services.connectivity)
8888
.injectKeyboardObserver()
8989
.onAppear {
9090
onPointOfSaleModeActiveStateChange(true)

WooCommerce/Classes/POS/Presentation/Reusable Views/POSConnectivityView.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import enum WooFoundation.ConnectivityStatus
55
struct POSConnectivityView: View {
66
@State private var isVisible = false
77
@State private var cancellable: AnyCancellable?
8-
@Environment(\.posConnectivity) private var connectivityObserver
8+
@Environment(\.posConnectivityProvider) private var provider
99

1010
var body: some View {
1111
ZStack(alignment: .top) {
@@ -17,8 +17,8 @@ struct POSConnectivityView: View {
1717
.animation(.easeInOut(duration: Constants.connectivityAnimationDuration),
1818
value: isVisible)
1919
.onAppear {
20-
updateVisibility(connectivityObserver.currentStatus)
21-
cancellable = connectivityObserver.statusPublisher
20+
updateVisibility(provider.connectivityObserver.currentStatus)
21+
cancellable = provider.connectivityObserver.statusPublisher
2222
.receive(on: DispatchQueue.main)
2323
.sink { status in
2424
updateVisibility(status)

WooCommerce/Classes/POS/Presentation/TotalsView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,13 +494,13 @@ private struct PaymentViewContent: View {
494494
private struct CashPaymentView: View {
495495
let cashPaymentState: PointOfSaleCashPaymentState
496496
let orderState: PointOfSaleOrderState
497-
@Environment(\.posCurrencySettings) private var currencySettings
497+
@Environment(\.posCurrencyProvider) private var currencyProvider
498498

499499
var body: some View {
500500
switch cashPaymentState {
501501
case .collectingCash:
502502
if case .loaded(let total) = orderState {
503-
PointOfSaleCollectCashView(orderTotal: total.orderTotal, currencySettings: currencySettings)
503+
PointOfSaleCollectCashView(orderTotal: total.orderTotal, currencySettings: currencyProvider.currencySettings)
504504
.transition(.move(edge: .trailing))
505505
}
506506
case .paymentSuccess:

WooCommerce/Classes/POS/TabBar/POSTabCoordinator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private extension POSTabCoordinator {
128128
cardPresentPaymentService: cardPresentPaymentService,
129129
orderController: PointOfSaleOrderController(orderService: orderService,
130130
receiptService: receiptService,
131-
currencySettings: serviceAdaptor.currency,
131+
currencySettingsProvider: serviceAdaptor.currency,
132132
analytics: serviceAdaptor.analytics,
133133
featureFlagService: serviceAdaptor.featureFlags,
134134
pluginsService: PluginsService(storageManager: storageManager)),

0 commit comments

Comments
 (0)