Skip to content

Commit

Permalink
Adds full cover option to paywalls tester
Browse files Browse the repository at this point in the history
  • Loading branch information
joshdholtz committed Jan 30, 2025
1 parent b73ce2f commit cc82b4f
Show file tree
Hide file tree
Showing 8 changed files with 114 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ protocol AvailableConfigItems {

// CI system adds keys here
extension AvailableConfigItems {
static var apiKey: String { "" }
static var apiKey: String { "appl_SYkbbYptqjDadVkQeBUtXxVxCcw" }
static var proxyURL: String? { nil }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ struct OfferingPaywall: Hashable {

struct PresentedPaywall: Hashable {
var offering: Offering
var mode: PaywallViewMode
var mode: PaywallTesterViewMode
var responseOfferingID: String
}

Expand Down Expand Up @@ -56,6 +56,9 @@ final class OfferingsPaywallsViewModel: ObservableObject {
@Published
var presentedPaywall: PresentedPaywall?

@Published
var presentedPaywallCover: PresentedPaywall?

@Published
var listData: PaywallsData? {
didSet {
Expand Down Expand Up @@ -99,7 +102,7 @@ final class OfferingsPaywallsViewModel: ObservableObject {
}
}

func getAndShowPaywallForID(id: String, mode: PaywallViewMode = .default) async {
func getAndShowPaywallForID(id: String, mode: PaywallTesterViewMode = .default) async {

await showPaywallForID(id, mode: mode)

Expand Down Expand Up @@ -150,21 +153,31 @@ private extension OfferingsPaywallsViewModel {
}

@MainActor
private func showPaywallForID(_ id: String, mode: PaywallViewMode = .default) {
private func showPaywallForID(_ id: String, mode: PaywallTesterViewMode = .sheet) {
let currentPaywall = self.presentedPaywall ?? self.presentedPaywallCover

switch self.state {
case .notloaded:
Self.logger.log(level: .info, "Could not show paywall for id \(id), data not loaded.")
self.presentedPaywall = nil
self.presentedPaywallCover = nil
case .success:
if let newRCOffering = listData?.offeringsAndPaywalls.first(where: { $0.offering.id == id })?.rcOffering {
if self.presentedPaywall == nil || self.presentedPaywall?.offering.paywall != newRCOffering.paywall {
self.presentedPaywall = .init(offering: newRCOffering, mode: mode, responseOfferingID: id)
if currentPaywall == nil || currentPaywall?.offering.paywall != newRCOffering.paywall {
switch mode {
case .fullScreen:
self.presentedPaywallCover = .init(offering: newRCOffering, mode: mode, responseOfferingID: id)
case .sheet, .footer, .condensedFooter:
self.presentedPaywall = .init(offering: newRCOffering, mode: mode, responseOfferingID: id)
}

}
}
case .error(let error):
Self.logger.log(level: .error, "Could not find a paywall for id \(id), error: \(error)")
self.error = error
self.presentedPaywall = nil
self.presentedPaywallCover = nil
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct APIKeyDashboardList: View {

fileprivate struct PresentedPaywall: Hashable {
var offering: Offering
var mode: PaywallViewMode
var mode: PaywallTesterViewMode
}

@State
Expand All @@ -35,6 +35,9 @@ struct APIKeyDashboardList: View {
@State
private var presentedPaywall: PresentedPaywall?

@State
private var presentedPaywallCover: PresentedPaywall?

var body: some View {
NavigationView {
self.content
Expand Down Expand Up @@ -179,21 +182,56 @@ struct APIKeyDashboardList: View {
}
}
}
.fullScreenCover(item: self.$presentedPaywallCover) { paywall in
// VStack {
// ZStack {
// Color.blue // Background extends under the safe area
// .ignoresSafeArea()
//
// // GeometryReader { geometry in
// VStack {
// Text("This text respects the safe area")
// .padding()
// .background(Color.white)
// .cornerRadius(10)
// // .padding(.top, geometry.safeAreaInsets.top) // Restore top safe area
//
// Spacer()
// }
// // .frame(width: geometry.size.width, height: geometry.size.height)
// // }
// }
// }
PaywallPresenter(offering: paywall.offering, mode: paywall.mode, introEligility: .eligible)
.onRestoreCompleted { _ in
self.presentedPaywall = nil
}
.onAppear {
if let errorInfo = paywall.offering.paywallComponents?.data.errorInfo {
print("Paywall V2 Error:", errorInfo.debugDescription)
}
}
}
}

#if !os(watchOS)
@ViewBuilder
private func contextMenu(for offering: Offering) -> some View {
ForEach(PaywallViewMode.allCases, id: \.self) { mode in
ForEach(PaywallTesterViewMode.allCases, id: \.self) { mode in
self.button(for: mode, offering: offering)
}
}
#endif

@ViewBuilder
private func button(for selectedMode: PaywallViewMode, offering: Offering) -> some View {
private func button(for selectedMode: PaywallTesterViewMode, offering: Offering) -> some View {
Button {
self.presentedPaywall = .init(offering: offering, mode: selectedMode)
switch selectedMode {
case .fullScreen:
self.presentedPaywallCover = .init(offering: offering, mode: selectedMode)
case .sheet, .footer, .condensedFooter:
self.presentedPaywall = .init(offering: offering, mode: selectedMode)
}
} label: {
Text(selectedMode.name)
Image(systemName: selectedMode.icon)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct OfferingButton: View {
}

private extension OfferingButton {
private func showPaywall(mode: PaywallViewMode = .default) {
private func showPaywall(mode: PaywallTesterViewMode = .sheet) {
Task { @MainActor in
await viewModel.getAndShowPaywallForID(id: responseOffering.id, mode: mode)
selectedItemID = responseOffering.id
Expand Down Expand Up @@ -109,7 +109,7 @@ private extension OfferingButton {

@MainActor @ViewBuilder
private func contextMenuItems() -> some View {
ForEach(PaywallViewMode.allCases, id: \.self) { mode in
ForEach(PaywallTesterViewMode.allCases, id: \.self) { mode in
self.showPaywallMenuButton(for: mode)
}
if let appID = viewModel.singleApp?.id {
Expand All @@ -118,7 +118,7 @@ private extension OfferingButton {
}
}

private func showPaywallMenuButton(for selectedMode: PaywallViewMode) -> some View {
private func showPaywallMenuButton(for selectedMode: PaywallTesterViewMode) -> some View {
Button {
showPaywall(mode: selectedMode)
} label: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,13 @@ struct OfferingsList: View {
}
.id(viewModel.presentedPaywall?.hashValue) //FIXME: This should not be required, issue is in Paywallview
}
.fullScreenCover(item: $viewModel.presentedPaywall) { paywall in
PaywallPresenter(offering: paywall.offering, mode: paywall.mode, introEligility: introEligility)
.onRestoreCompleted { _ in
viewModel.dismissPaywall()
}
.id(viewModel.presentedPaywall?.hashValue) //FIXME: This should not be required, issue is in Paywallview
}
}

@ViewBuilder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ import RevenueCatUI
struct PaywallPresenter: View {

var offering: Offering
var mode: PaywallViewMode
var mode: PaywallTesterViewMode
var introEligility: IntroEligibilityStatus
var displayCloseButton: Bool = Configuration.defaultDisplayCloseButton

var body: some View {
switch self.mode {
case .fullScreen:
case .fullScreen, .sheet:

let handler = PurchaseHandler.default()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,43 @@
import Foundation
import RevenueCat

internal extension PaywallViewMode {
enum PaywallTesterViewMode: String {
case fullScreen = "Full Screen"
case sheet = "Sheet"
case footer = "Footer"
case condensedFooter = "Condensed Footer"
}

internal extension PaywallTesterViewMode {

static let `default`: Self = .sheet

static var allCases: [PaywallTesterViewMode] {
#if os(watchOS)
return [.fullScreen]
#else
return [
.fullScreen,
.sheet,
.footer,
.condensedFooter
]
#endif
}

var mode: PaywallViewMode {
switch self {
case .fullScreen: return .fullScreen
case .sheet: return .fullScreen
case .footer: return .footer
case .condensedFooter: return .condensedFooter
}
}

var icon: String {
switch self {
case .fullScreen: return "iphone"
case .sheet: return "iphone"
case .footer: return "lanyardcard"
case .condensedFooter: return "ruler"
}
Expand All @@ -22,6 +54,8 @@ internal extension PaywallViewMode {
switch self {
case .fullScreen:
return "Fullscreen"
case .sheet:
return "Sheet"
case .footer:
return "Footer"
case .condensedFooter:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ struct SamplePaywallsList: View {
switch display {
case let .template(template, mode):
switch mode {
case .fullScreen:
case .fullScreen, .sheet:
PaywallView(configuration: .init(
offering: Self.loader.offering(for: template),
customerInfo: Self.loader.customerInfo,
Expand Down Expand Up @@ -115,7 +115,7 @@ struct SamplePaywallsList: View {

ForEach(PaywallTemplate.allCases, id: \.rawValue) { template in
Section(template.name) {
ForEach(PaywallViewMode.allCases, id: \.self) { mode in
ForEach(PaywallTesterViewMode.allCases, id: \.self) { mode in
Button {
self.display = .template(template, mode)
} label: {
Expand All @@ -126,7 +126,7 @@ struct SamplePaywallsList: View {
Button {
self.display = .customFont(template)
} label: {
TemplateLabel(name: "Custom font", icon: "textformat")
TemplateLabel(name: "Custsom font", icon: "textformat")
.font(.body.italic())
}
}
Expand All @@ -138,14 +138,14 @@ struct SamplePaywallsList: View {
self.display = .customPaywall(.footer)
} label: {
TemplateLabel(name: "Custom + footer",
icon: PaywallViewMode.footer.icon)
icon: PaywallTesterViewMode.footer.icon)
}

Button {
self.display = .customPaywall(.condensedFooter)
} label: {
TemplateLabel(name: "Custom + condensed footer",
icon: PaywallViewMode.condensedFooter.icon)
icon: PaywallTesterViewMode.condensedFooter.icon)
}
#endif

Expand Down Expand Up @@ -292,7 +292,7 @@ private extension SamplePaywallsList {

enum Display {

case template(PaywallTemplate, PaywallViewMode)
case template(PaywallTemplate, PaywallTesterViewMode)
case customFont(PaywallTemplate)
@available(watchOS, unavailable)
case customPaywall(PaywallViewMode)
Expand Down

0 comments on commit cc82b4f

Please sign in to comment.