Skip to content

Commit e7152fd

Browse files
facumenzellaclaude
andcommitted
Group workflow package environment values into WorkflowPackageContext
Replaces the two separate workflowContextPackage and workflowOnPackageSelected environment keys with a single WorkflowPackageContext struct. The struct also includes a fallbackPackage field so the upcoming singleStepFallbackId PR can populate it rather than adding a fourth key. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 3b3585e commit e7152fd

3 files changed

Lines changed: 34 additions & 30 deletions

File tree

RevenueCatUI/Modifiers/EnvironmentValues+Workflow.swift

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,23 @@ struct WorkflowPageTransitionContext {
2828

2929
}
3030

31+
/// Package-related state injected by `WorkflowPaywallView` into each `PaywallsV2View` page.
32+
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
33+
struct WorkflowPackageContext {
34+
35+
/// Package selected on the previous workflow step, forwarded to the current step as its
36+
/// initial selection (forward-only — back navigation does not set this).
37+
var contextPackage: Package?
38+
39+
/// Default package from the workflow's `singleStepFallbackId` step, used by packageless
40+
/// screens to resolve price/period template variables.
41+
var fallbackPackage: Package?
42+
43+
/// Called when the user's selected package changes inside a workflow paywall step.
44+
var onPackageSelected: ((Package?) -> Void)?
45+
46+
}
47+
3148
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
3249
private struct WorkflowTriggerActionKey: EnvironmentKey {
3350
static let defaultValue: ((String) -> Bool)? = nil
@@ -45,15 +62,8 @@ private struct IsWorkflowHeaderKey: EnvironmentKey {
4562
}
4663

4764
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
48-
private struct WorkflowContextPackageKey: EnvironmentKey {
49-
/// Package selected on the previous workflow step, forwarded to the current step's initial selection.
50-
static let defaultValue: Package? = nil
51-
}
52-
53-
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
54-
private struct WorkflowOnPackageSelectedKey: EnvironmentKey {
55-
/// Called when the user's selected package changes inside a workflow paywall step.
56-
static let defaultValue: ((Package?) -> Void)? = nil
65+
private struct WorkflowPackageContextKey: EnvironmentKey {
66+
static let defaultValue = WorkflowPackageContext()
5767
}
5868

5969
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
@@ -76,14 +86,9 @@ extension EnvironmentValues {
7686
set { self[IsWorkflowHeaderKey.self] = newValue }
7787
}
7888

79-
var workflowContextPackage: Package? {
80-
get { self[WorkflowContextPackageKey.self] }
81-
set { self[WorkflowContextPackageKey.self] = newValue }
82-
}
83-
84-
var workflowOnPackageSelected: ((Package?) -> Void)? {
85-
get { self[WorkflowOnPackageSelectedKey.self] }
86-
set { self[WorkflowOnPackageSelectedKey.self] = newValue }
89+
var workflowPackageContext: WorkflowPackageContext {
90+
get { self[WorkflowPackageContextKey.self] }
91+
set { self[WorkflowPackageContextKey.self] = newValue }
8792
}
8893
}
8994

RevenueCatUI/Templates/V2/PaywallsV2View.swift

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,8 @@ struct PaywallsV2View: View {
4848
@Environment(\.paywallSource)
4949
private var paywallSource
5050

51-
@Environment(\.workflowContextPackage)
52-
private var workflowContextPackage
53-
54-
@Environment(\.workflowOnPackageSelected)
55-
private var workflowOnPackageSelected
51+
@Environment(\.workflowPackageContext)
52+
private var workflowPackageContext
5653

5754
@StateObject
5855
private var introOfferEligibilityContext: IntroOfferEligibilityContext
@@ -299,16 +296,16 @@ struct PaywallsV2View: View {
299296

300297
self.dismissAfterPurchaseCompletionCallbacks()
301298
}
302-
.task(id: self.workflowContextPackage?.identifier) {
299+
.task(id: self.workflowPackageContext.contextPackage?.identifier) {
303300
guard case let .success(paywallState) = self.paywallStateManager.state,
304301
let resolved = Self.validatedContextPackage(
305-
self.workflowContextPackage,
302+
self.workflowPackageContext.contextPackage,
306303
in: paywallState.packages
307304
) else { return }
308305
self.selectedPackageContext.package = resolved
309306
}
310307
.onReceive(selectedPackageContext.$package) { package in
311-
self.workflowOnPackageSelected?(package)
308+
self.workflowPackageContext.onPackageSelected?(package)
312309
}
313310

314311
}

RevenueCatUI/Templates/V2/WorkflowPaywallView.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,13 @@ struct WorkflowPaywallView: View {
255255
colorScheme: self.colorScheme,
256256
promoOfferCache: self.promoOfferCache
257257
)
258-
.environment(\.workflowContextPackage, page.contextPackage)
259-
.environment(\.workflowOnPackageSelected, { package in
260-
guard let package else { return }
261-
self.currentSelectedPackage = package
262-
})
258+
.environment(\.workflowPackageContext, WorkflowPackageContext(
259+
contextPackage: page.contextPackage,
260+
onPackageSelected: { package in
261+
guard let package else { return }
262+
self.currentSelectedPackage = package
263+
}
264+
))
263265
.environment(\.workflowTriggerAction, { componentId in
264266
return self.handleTriggeredNavigation(componentId: componentId)
265267
})

0 commit comments

Comments
 (0)