소스 검색

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)
         }
     }