Skip to content
Draft
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4ae48ed
pull in Josh's changes to a branch that is not 2 AI models old
JZDesign Nov 11, 2025
5c2e711
add package context to view model styles function
JZDesign Nov 13, 2025
f7408c9
Plug in the package context to the build partial function and calcula…
JZDesign Nov 13, 2025
bae39c5
update tests
JZDesign Nov 13, 2025
419b1f2
update preview
JZDesign Nov 13, 2025
f9f0eff
Put in the !tvos directive
JZDesign Nov 14, 2025
7f6fd52
Merge branch 'main' of https://github.com//RevenueCat/purchases-ios i…
JZDesign Nov 18, 2025
91ee9ee
fix the intro offer
JZDesign Nov 19, 2025
e59564d
fix test
JZDesign Nov 20, 2025
5859da2
prep for promo offer and add tests
JZDesign Nov 20, 2025
a96931b
remove code that will never be executed
JZDesign Nov 20, 2025
6a32c66
correct the offer condition serialization and add any offer conditions
JZDesign Nov 20, 2025
c2e22cb
Codex added any intro and any promo offers
JZDesign Nov 20, 2025
2a4acd3
codex didn't use the right source of truth, had it fix that
JZDesign Nov 20, 2025
5c98e02
Revert intro_offer rename in paywalls (#5877)
facumenzella Nov 26, 2025
14e95de
revert code from other pr (#5878)
facumenzella Nov 26, 2025
1a253b9
Add default values for IntroOffer and MultipleIntroOffers (#5879)
facumenzella Nov 26, 2025
c0ca7f1
Conditional Visibility -> Screen Size calculation based on shortest d…
JZDesign Dec 1, 2025
c31e006
rename and docs for clarity
JZDesign Dec 2, 2025
388285e
add tests
JZDesign Dec 2, 2025
a3045da
ignore unsupported conditions instead of hiding components
JZDesign Dec 2, 2025
a2972e5
Bring back the early return
JZDesign Dec 5, 2025
24c1f9b
Go back to unsupported
JZDesign Dec 5, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,14 @@ struct CarouselComponentView: View {
viewModel.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
),
anyPackageHasPromoOffer: self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache),
colorScheme: colorScheme
) { style in
if style.visible {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,10 @@ class CarouselComponentViewModel {
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
colorScheme: ColorScheme,
@ViewBuilder apply: @escaping (CarouselComponentStyle) -> some View
) -> some View {
Expand All @@ -58,6 +60,9 @@ class CarouselComponentViewModel {
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,14 @@ struct IconComponentView: View {
self.viewModel.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
),
anyPackageHasPromoOffer: self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache),
colorScheme: colorScheme
) { style in
if style.visible {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,10 @@ class IconComponentViewModel {
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
colorScheme: ColorScheme,
@ViewBuilder apply: @escaping (IconComponentStyle) -> some View
) -> some View {
Expand All @@ -100,6 +102,9 @@ class IconComponentViewModel {
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,14 @@ struct ImageComponentView: View {
viewModel.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
),
anyPackageHasPromoOffer: self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache),
colorScheme: colorScheme
) { style in
if style.visible {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ class ImageComponentViewModel {
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
colorScheme: ColorScheme,
@ViewBuilder apply: @escaping (ImageComponentStyle) -> some View
) -> some View {
Expand All @@ -62,6 +64,9 @@ class ImageComponentViewModel {
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)
let partial = localizedPartial?.partial
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,14 @@ struct StackComponentView: View {
viewModel.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
),
anyPackageHasPromoOffer: self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache),
colorScheme: colorScheme
) { style in
if style.visible {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ class StackComponentViewModel {
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
colorScheme: ColorScheme,
@ViewBuilder apply: @escaping (StackComponentStyle) -> some View
) -> some View {
Expand All @@ -69,6 +71,9 @@ class StackComponentViewModel {
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ class TabViewModel {
let stackViewModel: StackComponentViewModel
let defaultSelectedPackage: Package?
let packages: [Package]

init(
tab: PaywallComponent.TabsComponent.Tab,
stackViewModel: StackComponentViewModel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ struct TextComponentView: View {
package: self.packageContext.package
),
promoOffer: self.paywallPromoOfferCache.get(for: self.packageContext.package),
anyPackageHasPromoOffer: self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache),
countdownTime: countdownTime
) { style in
if style.visible {
Expand Down Expand Up @@ -679,9 +680,7 @@ struct TextComponentView_Previews: PreviewProvider {
text: "id_1",
color: .init(light: .hex("#000000")),
overrides: [
.init(conditions: [
.medium
], properties: .init(
.init(conditions: [ ], properties: .init(
text: "id_2"
))
]
Expand Down Expand Up @@ -710,9 +709,7 @@ struct TextComponentView_Previews: PreviewProvider {
text: "id_1",
color: .init(light: .hex("#000000")),
overrides: [
.init(conditions: [
.medium
], properties: .init(
.init(conditions: [ .screenSize(.in, ["medium"]) ], properties: .init(
text: "id_2"
))
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class TextComponentViewModel {
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
promoOffer: PromotionalOffer?,
anyPackageHasPromoOffer: Bool,
countdownTime: CountdownTime? = nil,
@ViewBuilder apply: @escaping (TextComponentStyle) -> some View
) -> some View {
Expand All @@ -59,6 +60,9 @@ class TextComponentViewModel {
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: promoOffer != nil,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)
let partial = localizedPartial?.partial
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,37 +47,43 @@ struct TimelineComponentView: View {
@State private var maxIconWidth: CGFloat = 0

var body: some View {
let anyPromoOffer = self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache)
viewModel.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
)
),
anyPackageHasPromoOffer: anyPromoOffer
) { style in
if style.visible {
timeline(style: style)
timeline(style: style, anyPackageHasPromoOffer: anyPromoOffer)
}
}
}

@ViewBuilder
private func timeline(
style: TimelineComponentStyle
style: TimelineComponentStyle,
anyPackageHasPromoOffer: Bool
) -> some View {
VStack(alignment: .leading, spacing: style.itemSpacing ?? 0) {
ForEach(viewModel.items, id: \.component) { item in
item.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
)
),
anyPackageHasPromoOffer: anyPackageHasPromoOffer
) { itemStyle in
if itemStyle.visible {
timelineRow(itemStyle: itemStyle, style: style)
Expand All @@ -97,12 +103,14 @@ struct TimelineComponentView: View {
item.styles(
state: self.componentViewState,
condition: self.screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
)
),
anyPackageHasPromoOffer: anyPackageHasPromoOffer
) { itemStyle in
if itemStyle.visible {
let next = viewModel.items.indices.contains(index + 1) ? viewModel.items[index + 1] : nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,24 @@ class TimelineComponentViewModel {
}

@ViewBuilder
// swiftlint:disable:next function_parameter_count
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
@ViewBuilder apply: @escaping (TimelineComponentStyle) -> some View
) -> some View {
let partial = PresentedTimelinePartial.buildPartial(
state: state,
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)

Expand Down Expand Up @@ -99,18 +105,24 @@ class TimelineItemViewModel {
}

@ViewBuilder
// swiftlint:disable:next function_parameter_count
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
@ViewBuilder apply: @escaping (TimelineItemStyle) -> some View
) -> some View {
let partial = PresentedTimelineItemPartial.buildPartial(
state: state,
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,14 @@ struct VideoComponentView: View {
.styles(
state: componentViewState,
condition: screenCondition,
packageContext: self.packageContext,
isEligibleForIntroOffer: self.introOfferEligibilityContext.isEligible(
package: self.packageContext.package
),
isEligibleForPromoOffer: self.paywallPromoOfferCache.isMostLikelyEligible(
for: self.packageContext.package
),
anyPackageHasPromoOffer: self.packageContext.hasEligiblePromoOffer(using: self.paywallPromoOfferCache),
colorScheme: colorScheme
) { style in
if style.visible {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ class VideoComponentViewModel {
func styles(
state: ComponentViewState,
condition: ScreenCondition,
packageContext: PackageContext,
isEligibleForIntroOffer: Bool,
isEligibleForPromoOffer: Bool,
anyPackageHasPromoOffer: Bool,
colorScheme: ColorScheme,
@ViewBuilder apply: @escaping (VideoComponentStyle) -> some View
) -> some View {
Expand All @@ -57,6 +59,9 @@ class VideoComponentViewModel {
condition: condition,
isEligibleForIntroOffer: isEligibleForIntroOffer,
isEligibleForPromoOffer: isEligibleForPromoOffer,
anyPackageHasIntroOffer: packageContext.variableContext.hasAnyIntroOffer,
anyPackageHasPromoOffer: anyPackageHasPromoOffer,
selectedPackage: packageContext.package,
with: self.presentedOverrides
)
let partial = localizedPartial?.partial
Expand Down
Loading