Skip to content

Commit 3342f01

Browse files
authored
[Woo POS][Modularization] Remove all ServiceLocator usage from POS code (#15956)
2 parents f589dd6 + 04fd036 commit 3342f01

File tree

40 files changed

+432
-193
lines changed

40 files changed

+432
-193
lines changed
Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,38 @@
11
import Foundation
22
import WooFoundation
33
import Experiments
4+
import protocol Yosemite.Action
5+
import struct Yosemite.Site
46

57
/// Main dependency provider protocol for POS module
68
/// This abstracts away direct ServiceLocator access
79
public protocol POSDependencyProviding {
810
var analytics: POSAnalyticsProviding { get }
9-
var stores: POSStoresProviding { get }
10-
var currency: POSCurrencyProviding { get }
11-
var storage: POSStorageProviding { get }
11+
var currency: POSCurrencySettingsProviding { get }
1212
var featureFlags: POSFeatureFlagProviding { get }
13-
var pushNotifications: POSPushNotificationProviding { get }
13+
var session: POSSessionManagerProviding { get }
14+
var connectivity: POSConnectivityProviding { get }
1415
}
1516

16-
/// Analytics service abstraction
1717
public protocol POSAnalyticsProviding {
1818
func track(event: WooAnalyticsEvent)
1919
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType], error: Error)
2020
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType])
2121
func track(_ stat: WooAnalyticsStat)
2222
}
2323

24-
/// Stores manager abstraction
25-
public protocol POSStoresProviding {
26-
var sessionManager: POSSessionManagerProviding { get }
27-
// Add other stores manager methods as needed
28-
}
29-
30-
/// Session manager abstraction
3124
public protocol POSSessionManagerProviding {
32-
var defaultSite: POSSiteProviding? { get }
33-
}
34-
35-
/// Site abstraction
36-
public protocol POSSiteProviding {
37-
// Add site properties as needed during migration
38-
}
39-
40-
/// Currency settings and formatting abstraction
41-
public protocol POSCurrencyProviding {
42-
// Currency-related methods will be added as we migrate files
43-
}
44-
45-
/// Storage manager abstraction
46-
public protocol POSStorageProviding {
47-
// Storage methods will be added as we migrate files
25+
var defaultSite: Site? { get }
4826
}
4927

50-
/// Feature flag service abstraction
5128
public protocol POSFeatureFlagProviding {
5229
func isFeatureFlagEnabled(_ flag: FeatureFlag) -> Bool
5330
}
5431

55-
/// Push notifications abstraction
56-
public protocol POSPushNotificationProviding {
57-
// Push notification methods will be added as we migrate files
32+
public protocol POSCurrencySettingsProviding {
33+
var currencySettings: CurrencySettings { get }
34+
}
35+
36+
public protocol POSConnectivityProviding {
37+
var connectivityObserver: ConnectivityObserver { get }
5838
}
Lines changed: 79 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,96 @@
11
import SwiftUI
2+
import Combine
23
import WooFoundation
4+
import Experiments
5+
import protocol Yosemite.Action
6+
import struct Yosemite.Site
37

4-
/// Environment key for POS analytics service
8+
/// Environment key for POS analytics service in SwiftUI
59
public struct POSAnalyticsKey: EnvironmentKey {
6-
public static let defaultValue: POSAnalyticsProviding = DefaultPOSAnalytics()
10+
public static let defaultValue: POSAnalyticsProviding = EmptyPOSAnalytics()
711
}
812

9-
/// Default implementation that does nothing (for previews/testing)
10-
private struct DefaultPOSAnalytics: POSAnalyticsProviding {
11-
func track(event: WooAnalyticsEvent) {
12-
// No-op implementation for previews/testing
13-
}
13+
/// Environment key for POS currency settings
14+
public struct POSCurrencySettingsKey: EnvironmentKey {
15+
public static let defaultValue: POSCurrencySettingsProviding = EmptyPOSCurrencySettings()
16+
}
1417

15-
func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType] = [:]) {
16-
// No-op implementation for previews/testing
17-
}
18+
/// Environment key for POS feature flags service
19+
public struct POSFeatureFlagsKey: EnvironmentKey {
20+
public static let defaultValue: POSFeatureFlagProviding = EmptyPOSFeatureFlags()
21+
}
1822

19-
func track(_ stat: WooAnalyticsStat) {
20-
// No-op implementation for previews/testing
21-
}
23+
/// Environment key for POS session manager
24+
public struct POSSessionManagerKey: EnvironmentKey {
25+
public static let defaultValue: POSSessionManagerProviding = EmptyPOSSessionManager()
26+
}
2227

23-
func track(_ stat: WooFoundationCore.WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType], error: any Error) {
24-
// No-op implementation for previews/testing
25-
}
28+
/// Environment key for POS connectivity
29+
public struct POSConnectivityKey: EnvironmentKey {
30+
public static let defaultValue: POSConnectivityProviding = EmptyPOSConnectivityProvider()
2631
}
2732

2833
public extension EnvironmentValues {
2934
var posAnalytics: POSAnalyticsProviding {
3035
get { self[POSAnalyticsKey.self] }
3136
set { self[POSAnalyticsKey.self] = newValue }
3237
}
38+
39+
var posCurrencyProvider: POSCurrencySettingsProviding {
40+
get { self[POSCurrencySettingsKey.self] }
41+
set { self[POSCurrencySettingsKey.self] = newValue }
42+
}
43+
44+
var posFeatureFlags: POSFeatureFlagProviding {
45+
get { self[POSFeatureFlagsKey.self] }
46+
set { self[POSFeatureFlagsKey.self] = newValue }
47+
}
48+
49+
var posSession: POSSessionManagerProviding {
50+
get { self[POSSessionManagerKey.self] }
51+
set { self[POSSessionManagerKey.self] = newValue }
52+
}
53+
54+
var posConnectivityProvider: POSConnectivityProviding {
55+
get { self[POSConnectivityKey.self] }
56+
set { self[POSConnectivityKey.self] = newValue }
57+
}
58+
}
59+
60+
// MARK: - Empty Default Values
61+
62+
public struct EmptyPOSSessionManager: POSSessionManagerProviding {
63+
public var defaultSite: Site? = nil
64+
public init() {}
65+
}
66+
67+
public struct EmptyPOSFeatureFlags: POSFeatureFlagProviding {
68+
public func isFeatureFlagEnabled(_ flag: FeatureFlag) -> Bool { false }
69+
public init() {}
70+
}
71+
72+
public struct EmptyPOSCurrencySettings: POSCurrencySettingsProviding {
73+
public var currencySettings = CurrencySettings()
74+
public init() {}
75+
}
76+
77+
public class EmptyPOSConnectivityProvider: POSConnectivityProviding {
78+
public var connectivityObserver: WooFoundation.ConnectivityObserver = EmptyPOSConnectivity()
79+
public init() {}
80+
}
81+
82+
public class EmptyPOSConnectivity: ConnectivityObserver {
83+
@Published private(set) public var currentStatus: ConnectivityStatus = .reachable(type: .ethernetOrWiFi)
84+
public var statusPublisher: AnyPublisher<ConnectivityStatus, Never> { $currentStatus.eraseToAnyPublisher() }
85+
public func startObserving() {}
86+
public func stopObserving() {}
87+
public init() {}
88+
}
89+
90+
public struct EmptyPOSAnalytics: POSAnalyticsProviding {
91+
public func track(event: WooAnalyticsEvent) {}
92+
public func track(_ stat: WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType] = [:]) {}
93+
public func track(_ stat: WooAnalyticsStat) {}
94+
public func track(_ stat: WooFoundationCore.WooAnalyticsStat, parameters: [String: WooAnalyticsEventPropertyType], error: any Error) {}
95+
public init() {}
3396
}

WooCommerce/Classes/Tools/Connectivity/ConnectivityObserver.swift renamed to Modules/Sources/WooFoundation/Utilities/Connectivity/ConnectivityObserver.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Combine
22

33
/// Interface for the observing connectivity
44
///
5-
protocol ConnectivityObserver {
5+
public protocol ConnectivityObserver {
66
/// Getter for current state of the connectivity.
77
var currentStatus: ConnectivityStatus { get }
88

@@ -21,7 +21,7 @@ protocol ConnectivityObserver {
2121
/// - unknown: It is unknown whether the network is reachable.
2222
/// - notReachable: The network is not reachable.
2323
/// - reachable: The network is reachable.
24-
enum ConnectivityStatus: Equatable {
24+
public enum ConnectivityStatus: Equatable {
2525
case unknown
2626
case notReachable
2727
case reachable(type: ConnectionType)
@@ -32,7 +32,7 @@ enum ConnectivityStatus: Equatable {
3232
/// - ethernetOrWiFi: The connection type is either over Ethernet or WiFi.
3333
/// - cellular: The connection type is a cellular connection.
3434
/// - other: The connection type is via a local loopback network, virtual network or other unknown types.
35-
enum ConnectionType: Equatable {
35+
public enum ConnectionType: Equatable {
3636
case ethernetOrWiFi
3737
case cellular
3838
case other

WooCommerce/Classes/Tools/Connectivity/DefaultConnectivityObserver.swift renamed to Modules/Sources/WooFoundation/Utilities/Connectivity/DefaultConnectivityObserver.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
import Combine
22
import Network
33

4-
final class DefaultConnectivityObserver: ConnectivityObserver {
4+
public final class DefaultConnectivityObserver: ConnectivityObserver {
55

66
/// Network monitor to evaluate connection.
77
///
88
private let networkMonitor: NetworkMonitoring
99
private let observingQueue: DispatchQueue = .global(qos: .background)
1010

11-
@Published private(set) var currentStatus: ConnectivityStatus = .unknown
11+
@Published private(set) public var currentStatus: ConnectivityStatus = .unknown
1212

13-
var statusPublisher: AnyPublisher<ConnectivityStatus, Never> {
13+
public var statusPublisher: AnyPublisher<ConnectivityStatus, Never> {
1414
$currentStatus.eraseToAnyPublisher()
1515
}
1616

17+
public convenience init() {
18+
self.init(networkMonitor: NWPathMonitor())
19+
}
20+
1721
init(networkMonitor: NetworkMonitoring = NWPathMonitor()) {
1822
self.networkMonitor = networkMonitor
1923
startObserving()
@@ -25,11 +29,11 @@ final class DefaultConnectivityObserver: ConnectivityObserver {
2529
}
2630
}
2731

28-
func startObserving() {
32+
public func startObserving() {
2933
networkMonitor.start(queue: observingQueue)
3034
}
3135

32-
func stopObserving() {
36+
public func stopObserving() {
3337
networkMonitor.cancel()
3438
}
3539

WooCommerce/WooCommerceTests/Tools/DefaultConnectivityObserver.swift renamed to Modules/Tests/WooFoundationTests/Utilities/DefaultConnectivityObserverTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Combine
22
import Network
33
import XCTest
4-
@testable import WooCommerce
4+
@testable import WooFoundation
55

66
final class DefaultConnectivityObserverTests: XCTestCase {
77
private var subscriptions: Set<AnyCancellable> = []

WooCommerce/Classes/POS/Card Present Payments/CardPresentPaymentService.swift renamed to WooCommerce/Classes/POS/Adaptors/Card Present Payments/CardPresentPaymentService.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import struct Yosemite.CardReader
66
import enum Yosemite.CardPresentPaymentAction
77
import enum Yosemite.PaymentChannel
88
import protocol Yosemite.StoresManager
9+
import class WooFoundation.CurrencySettings
910

1011
final class CardPresentPaymentService: CardPresentPaymentFacade {
1112
let paymentEventPublisher: AnyPublisher<CardPresentPaymentEvent, Never>

0 commit comments

Comments
 (0)