Переглянути джерело

Preserve manual paywall plan selection when store data refreshes.

Stop auto-selecting the trial/yearly plan after the user taps a different option so lifetime stays highlighted during purchase.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 2 тижнів тому
батько
коміт
4fc6212c56
1 змінених файлів з 13 додано та 2 видалено
  1. 13 2
      smart_printer/PaywallView.swift

+ 13 - 2
smart_printer/PaywallView.swift

@@ -625,6 +625,7 @@ final class PaywallView: NSView, AppearanceRefreshable {
     var onClose: (() -> Void)?
 
     private var selectedPlan: PaywallPlan = StoreKitCatalog.shared.defaultSelectedPlan()
+    private var hasUserSelectedPlan = false
     private var planCards: [PaywallPlan: PaywallPlanCard] = [:]
     private let ctaButton = PaywallCTAButton()
     private let renewalDisclosureLabel = NSTextField(wrappingLabelWithString: "")
@@ -675,7 +676,6 @@ final class PaywallView: NSView, AppearanceRefreshable {
             },
             center.addObserver(forName: .storeStateDidChange, object: nil, queue: .main) { [weak self] _ in
                 self?.refreshProductDisplay()
-                self?.selectTrialEligiblePlanIfAvailable()
             },
             center.addObserver(forName: .premiumStatusDidChange, object: nil, queue: .main) { [weak self] _ in
                 self?.refreshProductDisplay()
@@ -688,6 +688,8 @@ final class PaywallView: NSView, AppearanceRefreshable {
     }
 
     private func selectTrialEligiblePlanIfAvailable() {
+        guard !hasUserSelectedPlan else { return }
+
         let store = StoreManager.shared
         let config = paywallConfig
         guard let eligiblePlan = config.trialEligiblePlan,
@@ -697,6 +699,10 @@ final class PaywallView: NSView, AppearanceRefreshable {
         selectPlan(eligiblePlan)
     }
 
+    func resetAutomaticPlanSelection() {
+        hasUserSelectedPlan = false
+    }
+
     private var paywallConfig: PaywallConfig {
         PaywallConfigService.shared.config
     }
@@ -763,6 +769,7 @@ final class PaywallView: NSView, AppearanceRefreshable {
                 config: config,
                 trial: store.trialDisplay(for: plan)
             )
+            card.isChosen = plan == selectedPlan
         }
 
         ensureValidSelectedPlan(from: availablePlans)
@@ -800,7 +807,10 @@ final class PaywallView: NSView, AppearanceRefreshable {
         for plan in plans where planCards[plan] == nil {
             let card = PaywallPlanCard(plan: plan)
             card.isChosen = plan == selectedPlan
-            card.onSelect = { [weak self] in self?.selectPlan(plan) }
+            card.onSelect = { [weak self] in
+                self?.hasUserSelectedPlan = true
+                self?.selectPlan(plan)
+            }
             planCards[plan] = card
         }
 
@@ -1566,6 +1576,7 @@ final class PaywallOverlayView: NSView, AppearanceRefreshable {
         }
         alphaValue = 1
         acceptsHitTesting = true
+        paywallView.resetAutomaticPlanSelection()
         paywallView.refreshStoreState()
 
         Task { @MainActor in