|
|
@@ -59,26 +59,44 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
guard !hasPresentedStartupPaywall else { return }
|
|
|
guard !PremiumStore.shared.isPremiumUnlocked else { return }
|
|
|
guard let parent = launcherWindow else { return }
|
|
|
+ presentPremiumPaywall(over: parent, storeAsStartupPaywall: true)
|
|
|
+
|
|
|
+ hasPresentedStartupPaywall = true
|
|
|
+
|
|
|
+ observePremiumUnlockToAutoDismissPaywall()
|
|
|
+ }
|
|
|
+
|
|
|
+ /// Presents the premium paywall as a non-draggable, non-resizable child window that exactly covers `parent`.
|
|
|
+ @MainActor
|
|
|
+ func presentPremiumPaywall(over parent: NSWindow? = nil, storeAsStartupPaywall: Bool = false) {
|
|
|
+ guard !PremiumStore.shared.isPremiumUnlocked else { return }
|
|
|
+ guard let parentWindow = parent ?? launcherWindow else { return }
|
|
|
+
|
|
|
if let existing = startupPaywallWindow, existing.isVisible {
|
|
|
+ // Ensure it stays pinned to the parent’s current frame.
|
|
|
+ existing.setFrame(PremiumPaywallWindowSizing.paywallFrame(forParentWindow: parentWindow), display: false)
|
|
|
existing.makeKeyAndOrderFront(nil)
|
|
|
+ NSApp.activate(ignoringOtherApps: true)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- let paywallSize = PremiumPaywallWindowSizing.contentSize(forParentWindow: parent)
|
|
|
+ let paywallFrame = PremiumPaywallWindowSizing.paywallFrame(forParentWindow: parentWindow)
|
|
|
let paywallWindow = NSWindow(
|
|
|
- contentRect: NSRect(origin: .zero, size: paywallSize),
|
|
|
- styleMask: [.borderless, .resizable],
|
|
|
+ contentRect: paywallFrame,
|
|
|
+ styleMask: [.borderless],
|
|
|
backing: .buffered,
|
|
|
defer: false
|
|
|
)
|
|
|
paywallWindow.isReleasedWhenClosed = false
|
|
|
paywallWindow.delegate = self
|
|
|
- paywallWindow.isMovableByWindowBackground = true
|
|
|
+ paywallWindow.isMovable = false
|
|
|
+ paywallWindow.isMovableByWindowBackground = false
|
|
|
paywallWindow.hasShadow = true
|
|
|
paywallWindow.isOpaque = false
|
|
|
paywallWindow.backgroundColor = .clear
|
|
|
paywallWindow.level = .floating
|
|
|
- paywallWindow.minSize = NSSize(width: 560, height: 480)
|
|
|
+ paywallWindow.minSize = paywallFrame.size
|
|
|
+ paywallWindow.maxSize = paywallFrame.size
|
|
|
|
|
|
let hosting = NSHostingController(
|
|
|
rootView: PremiumFeaturesView(onDismissFromAppKitHost: { [weak self] in
|
|
|
@@ -86,7 +104,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
})
|
|
|
.environmentObject(PremiumStore.shared)
|
|
|
)
|
|
|
- hosting.view.frame = NSRect(origin: .zero, size: paywallSize)
|
|
|
+ hosting.view.frame = NSRect(origin: .zero, size: paywallFrame.size)
|
|
|
hosting.view.autoresizingMask = [.width, .height]
|
|
|
paywallWindow.contentViewController = hosting
|
|
|
|
|
|
@@ -99,24 +117,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
layer.masksToBounds = true
|
|
|
}
|
|
|
|
|
|
- let parentFrame = parent.frame
|
|
|
- paywallWindow.setFrame(
|
|
|
- NSRect(
|
|
|
- x: parentFrame.midX - paywallSize.width / 2,
|
|
|
- y: parentFrame.midY - paywallSize.height / 2,
|
|
|
- width: paywallSize.width,
|
|
|
- height: paywallSize.height
|
|
|
- ),
|
|
|
- display: false
|
|
|
- )
|
|
|
+ paywallWindow.setFrame(paywallFrame, display: false)
|
|
|
|
|
|
- startupPaywallWindow = paywallWindow
|
|
|
- hasPresentedStartupPaywall = true
|
|
|
- parent.addChildWindow(paywallWindow, ordered: .above)
|
|
|
+ if storeAsStartupPaywall {
|
|
|
+ startupPaywallWindow = paywallWindow
|
|
|
+ } else {
|
|
|
+ startupPaywallWindow = paywallWindow
|
|
|
+ }
|
|
|
+ parentWindow.addChildWindow(paywallWindow, ordered: .above)
|
|
|
paywallWindow.makeKeyAndOrderFront(nil)
|
|
|
NSApp.activate(ignoringOtherApps: true)
|
|
|
-
|
|
|
- observePremiumUnlockToAutoDismissPaywall()
|
|
|
}
|
|
|
|
|
|
@MainActor
|