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