Sfoglia il codice sorgente

Animate paywall entry from top of screen.

Present the paywall with a smooth top-down slide and fade each time it opens, including when reopening an existing paywall window.

Made-with: Cursor
huzaifahayat12 3 mesi fa
parent
commit
dc8a1d5abc
1 ha cambiato i file con 25 aggiunte e 0 eliminazioni
  1. 25 0
      meetings_app/ViewController.swift

+ 25 - 0
meetings_app/ViewController.swift

@@ -749,6 +749,7 @@ private extension ViewController {
 
     private func showPaywall() {
         if let existing = paywallWindow {
+            animatePaywallPresentation(existing)
             existing.makeKeyAndOrderFront(nil)
             NSApp.activate(ignoringOtherApps: true)
             return
@@ -777,9 +778,11 @@ private extension ViewController {
         panel.standardWindowButton(.zoomButton)?.isHidden = true
         panel.center()
         panel.contentViewController = controller
+        panel.alphaValue = 0
         panel.makeKeyAndOrderFront(nil)
         NSApp.activate(ignoringOtherApps: true)
         paywallWindow = panel
+        animatePaywallPresentation(panel)
 
         Task { [weak self] in
             guard let self else { return }
@@ -788,6 +791,28 @@ private extension ViewController {
         }
     }
 
+    private func animatePaywallPresentation(_ window: NSWindow) {
+        let finalFrame = window.frame
+        let targetScreen = window.screen ?? NSScreen.main
+        let startY: CGFloat
+        if let screen = targetScreen {
+            startY = screen.visibleFrame.maxY + 12
+        } else {
+            startY = finalFrame.origin.y + 120
+        }
+        let startFrame = NSRect(x: finalFrame.origin.x, y: startY, width: finalFrame.width, height: finalFrame.height)
+
+        window.setFrame(startFrame, display: false)
+        window.alphaValue = 0
+
+        NSAnimationContext.runAnimationGroup { context in
+            context.duration = 0.28
+            context.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
+            window.animator().alphaValue = 1
+            window.animator().setFrame(finalFrame, display: true)
+        }
+    }
+
     @objc private func closePaywallClicked(_ sender: Any?) {
         if let win = paywallWindow {
             win.performClose(nil)