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

Tune launch experience for non-premium users by delaying the initial paywall and nudging the main window slightly left on startup.

This makes the first app open feel more balanced while still surfacing upgrade access shortly after launch.

Made-with: Cursor
huzaifahayat12 3 місяців тому
батько
коміт
a9601e3919
1 змінених файлів з 20 додано та 1 видалено
  1. 20 1
      meetings_app/ViewController.swift

+ 20 - 1
meetings_app/ViewController.swift

@@ -248,6 +248,7 @@ final class ViewController: NSViewController {
     private weak var centeredTitleLabel: NSTextField?
     private var paywallWindow: NSWindow?
     private let paywallContentWidth: CGFloat = 520
+    private let launchWindowLeftOffset: CGFloat = 80
     private var selectedPremiumPlan: PremiumPlan = .monthly
     private var paywallPlanViews: [PremiumPlan: NSView] = [:]
     private var premiumPlanByView = [ObjectIdentifier: PremiumPlan]()
@@ -275,8 +276,10 @@ final class ViewController: NSViewController {
     private var paywallSubtitleLabels: [PremiumPlan: NSTextField] = [:]
     private var paywallContinueEnabled = true
     private var paywallUpgradeFlowEnabled = false
+    private let launchPaywallDelay: TimeInterval = 3
     private var hasCompletedInitialStoreKitSync = false
     private var hasPresentedLaunchPaywall = false
+    private var launchPaywallWorkItem: DispatchWorkItem?
     private var hasViewAppearedOnce = false
     private var lastKnownPremiumAccess = false
     private var displayedScheduleMeetings: [ScheduledMeeting] = []
@@ -376,6 +379,13 @@ final class ViewController: NSViewController {
             newFrame.size = frameSize
             window.setFrame(newFrame, display: true)
             window.center()
+            if let screen = window.screen ?? NSScreen.main {
+                var adjustedFrame = window.frame
+                adjustedFrame.origin.x -= self.launchWindowLeftOffset
+                let minX = screen.visibleFrame.minX
+                adjustedFrame.origin.x = max(minX, adjustedFrame.origin.x)
+                window.setFrame(adjustedFrame, display: true)
+            }
 
             window.minSize = window.frameRect(forContentRect: NSRect(origin: .zero, size: self.launchMinContentSize)).size
             self.installCenteredTitleIfNeeded(on: window)
@@ -389,6 +399,7 @@ final class ViewController: NSViewController {
     deinit {
         storeKitStartupTask?.cancel()
         paywallPurchaseTask?.cancel()
+        launchPaywallWorkItem?.cancel()
     }
 }
 
@@ -1058,7 +1069,15 @@ private extension ViewController {
         guard hasCompletedInitialStoreKitSync, hasViewAppearedOnce, !hasPresentedLaunchPaywall else { return }
         hasPresentedLaunchPaywall = true
         if !storeKitCoordinator.hasPremiumAccess {
-            showPaywall()
+            launchPaywallWorkItem?.cancel()
+            let workItem = DispatchWorkItem { [weak self] in
+                guard let self else { return }
+                self.launchPaywallWorkItem = nil
+                guard !self.storeKitCoordinator.hasPremiumAccess else { return }
+                self.showPaywall()
+            }
+            launchPaywallWorkItem = workItem
+            DispatchQueue.main.asyncAfter(deadline: .now() + launchPaywallDelay, execute: workItem)
         }
     }