Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internal purchase controller refactor #186

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 17 additions & 13 deletions Sources/SuperwallKit/Analytics/App Session/AppSessionManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,23 @@ class AppSessionManager {
private var didTrackAppLaunch = false
private var cancellable: AnyCancellable?

private unowned let configManager: ConfigManager
private unowned let storage: Storage
private unowned let delegate: AppManagerDelegate & DeviceHelperFactory & UserAttributesEventFactory

init(
configManager: ConfigManager,
identityManager: IdentityManager,
storage: Storage,
delegate: AppManagerDelegate & DeviceHelperFactory & UserAttributesEventFactory
) {
self.configManager = configManager
self.storage = storage
self.delegate = delegate
private var configManager: ConfigManager {
return factory.configManager
}

private var storage: Storage {
return factory.storage
}

private var delegate: AppManagerDelegate & DeviceHelperFactory & UserAttributesEventFactory {
return factory
}

let factory: DependencyContainer

init(factory: DependencyContainer) {
self.factory = factory

Task {
await addActiveStateObservers()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ enum InternalSuperwallEvent {
}
let triggerName: String
var customParameters: [String: Any] = [:]
unowned let sessionEventsManager: SessionEventsManager
let sessionEventsManager: SessionEventsManager

func getSuperwallParameters() async -> [String: Any] {
var params: [String: Any] = [
Expand Down
37 changes: 19 additions & 18 deletions Sources/SuperwallKit/Analytics/SessionEventsManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,28 @@ class SessionEventsManager {
/// The trigger session manager.
lazy var triggerSession = factory.makeTriggerSessionManager()

private var cancellables: [AnyCancellable] = []

/// A queue of trigger session events that get sent to the server.
private let queue: SessionEnqueuable
private lazy var queue: SessionEnqueuable = {
return SessionEventsQueue(storage: storage, network: network, configManager: configManager)
}()

private var cancellables: [AnyCancellable] = []
private var network: Network {
return factory.network
}

private var storage: Storage {
return factory.storage
}

private var configManager: ConfigManager {
return factory.configManager
}

private var factory: DependencyContainer

private unowned let network: Network
private unowned let storage: Storage
private unowned let configManager: ConfigManager
private unowned let factory: TriggerSessionManagerFactory

init(
queue: SessionEnqueuable,
storage: Storage,
network: Network,
configManager: ConfigManager,
factory: TriggerSessionManagerFactory
) {
self.queue = queue
self.storage = storage
self.network = network
self.configManager = configManager
init(factory: DependencyContainer) {
self.factory = factory

Task {
Expand Down
6 changes: 3 additions & 3 deletions Sources/SuperwallKit/Analytics/SessionEventsQueue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ actor SessionEventsQueue: SessionEnqueuable {
private var willResignActiveObserver: AnyCancellable?
private lazy var lastTwentySessions = LimitedQueue<TriggerSession>(limit: 20)
private lazy var lastTwentyTransactions = LimitedQueue<StoreTransaction>(limit: 20)
private unowned let storage: Storage
private unowned let network: Network
private unowned let configManager: ConfigManager
private let storage: Storage
private let network: Network
private let configManager: ConfigManager

deinit {
timer?.invalidate()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ extension TriggerSession.Transaction {
type: introductoryPrice.type
)

self.introductoryRedeemable = await Superwall.shared.dependencyContainer.storeKitManager.isFreeTrialAvailable(for: product)
self.introductoryRedeemable = await Superwall.shared.dependencyContainer.receiptManager.isFreeTrialAvailable(for: product)
self.hasIntroductoryOffer = true
} else {
self.hasIntroductoryOffer = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ actor TriggerSessionManager {
/// The active trigger session.
var activeTriggerSession: TriggerSession?

private unowned let storage: Storage
private unowned let configManager: ConfigManager
private unowned let appSessionManager: AppSessionManager
private unowned let identityManager: IdentityManager
private unowned let delegate: SessionEventsDelegate
private unowned let sessionEventsManager: SessionEventsManager
private let storage: Storage
private let configManager: ConfigManager
private let appSessionManager: AppSessionManager
private let identityManager: IdentityManager
private let delegate: SessionEventsDelegate
private let sessionEventsManager: SessionEventsManager

/// A local count for transactions used within the trigger session.
private var transactionCount: TriggerSession.Transaction.Count?
Expand Down Expand Up @@ -132,7 +132,7 @@ actor TriggerSessionManager {
/// - presentationInfo: Information about the paywall presentation.
/// - presentingViewController: What view the paywall will be presented on, if any.
/// - paywall: The response from the server associated with the paywall
func activateSession(
@discardableResult func activateSession(
for presentationInfo: PresentationInfo,
on presentingViewController: UIViewController? = nil,
paywall: Paywall? = nil,
Expand Down
50 changes: 26 additions & 24 deletions Sources/SuperwallKit/Config/ConfigManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class ConfigManager {
}

/// Options for configuring the SDK.
var options = SuperwallOptions()
var options: SuperwallOptions

/// A dictionary of triggers by their event name.
@DispatchQueueBacked
Expand All @@ -38,37 +38,42 @@ class ConfigManager {
@DispatchQueueBacked
var unconfirmedAssignments: [Experiment.ID: Experiment.Variant] = [:]

private unowned let storeKitManager: StoreKitManager
private unowned let storage: Storage
private unowned let network: Network
private unowned let paywallManager: PaywallManager
private var storeKitManager: StoreKitManager {
return factory.storeKitManager
}

private var receiptManager: ReceiptManager {
return factory.receiptManager
}

private var storage: Storage {
return factory.storage
}

private var network: Network {
return factory.network
}

private var paywallManager: PaywallManager {
return factory.paywallManager
}

/// A task that is non-`nil` when preloading all paywalls.
private var currentPreloadingTask: Task<Void, Never>?

private let factory: RequestFactory & RuleAttributesFactory
private let factory: DependencyContainer

init(
options: SuperwallOptions?,
storeKitManager: StoreKitManager,
storage: Storage,
network: Network,
paywallManager: PaywallManager,
factory: RequestFactory & RuleAttributesFactory
options: SuperwallOptions,
factory: DependencyContainer
) {
if let options = options {
self.options = options
}
self.storeKitManager = storeKitManager
self.storage = storage
self.network = network
self.paywallManager = paywallManager
self.options = options
self.factory = factory
}

func fetchConfiguration() async {
do {
await storeKitManager.loadPurchasedProducts()
await receiptManager.loadPurchasedProducts()

let config = try await network.getConfig { [weak self] in
self?.configState.send(.retrying)
Expand Down Expand Up @@ -238,10 +243,7 @@ class ConfigManager {
.throwableAsync() else {
return
}
let expressionEvaluator = ExpressionEvaluator(
storage: storage,
factory: factory
)
let expressionEvaluator = ExpressionEvaluator(factory: factory)
let triggers = ConfigLogic.filterTriggers(
config.triggers,
removing: config.preloadingDisabled
Expand Down
11 changes: 5 additions & 6 deletions Sources/SuperwallKit/Debug/DebugManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,13 @@ final class DebugManager {
@MainActor var viewController: DebugViewController?
var isDebuggerLaunched = false

private unowned let storage: Storage
private unowned let factory: ViewControllerFactory
private var storage: Storage {
return factory.storage
}
private let factory: DependencyContainer

init(
storage: Storage,
factory: ViewControllerFactory
init(factory: DependencyContainer
) {
self.storage = storage
self.factory = factory
}

Expand Down
42 changes: 22 additions & 20 deletions Sources/SuperwallKit/Debug/DebugViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -120,26 +120,28 @@ final class DebugViewController: UIViewController {
private var cancellable: AnyCancellable?
private var initialLocaleIdentifier: String?

private unowned let storeKitManager: StoreKitManager
private unowned let network: Network
private unowned let paywallRequestManager: PaywallRequestManager
private unowned let paywallManager: PaywallManager
private unowned let debugManager: DebugManager
private let factory: RequestFactory & ViewControllerFactory

init(
storeKitManager: StoreKitManager,
network: Network,
paywallRequestManager: PaywallRequestManager,
paywallManager: PaywallManager,
debugManager: DebugManager,
factory: RequestFactory & ViewControllerFactory
) {
self.storeKitManager = storeKitManager
self.network = network
self.paywallRequestManager = paywallRequestManager
self.paywallManager = paywallManager
self.debugManager = debugManager
private var storeKitManager: StoreKitManager {
return factory.storeKitManager
}

private var network: Network {
return factory.network
}

private var paywallRequestManager: PaywallRequestManager {
return factory.paywallRequestManager
}

private var paywallManager: PaywallManager {
return factory.paywallManager
}

private var debugManager: DebugManager {
return factory.debugManager
}
private let factory: DependencyContainer

init(factory: DependencyContainer) {
self.factory = factory
super.init(nibName: nil, bundle: nil)
}
Expand Down
Loading