Răsfoiți Sursa

Pause Reddit media when leaving the feed, opening paywall, or managing subscriptions.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 2 săptămâni în urmă
părinte
comite
207ec3b48e

+ 1 - 0
App AI for Reddit/App/AppDelegate.swift

@@ -26,6 +26,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
     func applicationDidBecomeActive(_ notification: Notification) {
         configureMainWindows()
         showMainWindowIfNeeded()
+        RedditWebViewStore.shared.handleApplicationDidBecomeActive()
     }
 
     func windowShouldClose(_ sender: NSWindow) -> Bool {

+ 46 - 6
App AI for Reddit/Managers/RedditWebViewStore.swift

@@ -6,6 +6,10 @@ final class RedditWebViewStore {
     static let shared = RedditWebViewStore()
 
     private(set) var container: RedditWebViewContainer?
+    private var isWindowMinimized = false
+    private var isRedditPageActive = false
+    private var isPaywallPresented = false
+    private var isAwaitingReturnFromSubscriptionManagement = false
     private var isMediaPlaybackSuspended = false
 
     private init() {}
@@ -18,18 +22,54 @@ final class RedditWebViewStore {
         let webView = RedditWebViewManager.makeWebView()
         let newContainer = RedditWebViewContainer(webView: webView)
         container = newContainer
+        updateMediaPlaybackSuspension()
         return newContainer
     }
 
+    func setRedditPageActive(_ active: Bool) {
+        isRedditPageActive = active
+        updateMediaPlaybackSuspension()
+    }
+
+    func setPaywallPresented(_ presented: Bool) {
+        isPaywallPresented = presented
+        updateMediaPlaybackSuspension()
+    }
+
+    func suspendForSubscriptionManagement() {
+        isAwaitingReturnFromSubscriptionManagement = true
+        updateMediaPlaybackSuspension()
+    }
+
+    func handleApplicationDidBecomeActive() {
+        guard isAwaitingReturnFromSubscriptionManagement else { return }
+        isAwaitingReturnFromSubscriptionManagement = false
+        updateMediaPlaybackSuspension()
+    }
+
     func suspendMediaPlaybackForWindowMinimize() {
-        guard let webView = container?.webView, !isMediaPlaybackSuspended else { return }
-        isMediaPlaybackSuspended = true
-        webView.setAllMediaPlaybackSuspended(true, completionHandler: nil)
+        isWindowMinimized = true
+        updateMediaPlaybackSuspension()
     }
 
     func resumeMediaPlaybackAfterWindowDeminiaturize() {
-        guard let webView = container?.webView, isMediaPlaybackSuspended else { return }
-        isMediaPlaybackSuspended = false
-        webView.setAllMediaPlaybackSuspended(false, completionHandler: nil)
+        isWindowMinimized = false
+        updateMediaPlaybackSuspension()
+    }
+
+    private func updateMediaPlaybackSuspension() {
+        let shouldSuspend = isWindowMinimized
+            || !isRedditPageActive
+            || isPaywallPresented
+            || isAwaitingReturnFromSubscriptionManagement
+        guard let webView = container?.webView else { return }
+
+        if shouldSuspend, !isMediaPlaybackSuspended {
+            isMediaPlaybackSuspended = true
+            webView.setAllMediaPlaybackSuspended(true, completionHandler: nil)
+        } else if !shouldSuspend, isMediaPlaybackSuspended {
+            isMediaPlaybackSuspended = false
+            webView.setAllMediaPlaybackSuspended(false, completionHandler: nil)
+        }
     }
 }

+ 1 - 0
App AI for Reddit/Managers/SubscriptionManager.swift

@@ -253,6 +253,7 @@ final class SubscriptionManager: ObservableObject {
     func openSubscriptionManagement() {
         let urlString = PaywallConfigService.shared.config.urls.manageSubscriptions
         guard let url = URL(string: urlString) else { return }
+        RedditWebViewStore.shared.suspendForSubscriptionManagement()
         NSWorkspace.shared.open(url)
     }
 

+ 15 - 4
App AI for Reddit/ViewModels/FrontPageViewModel.swift

@@ -37,9 +37,9 @@ final class FrontPageViewModel {
     func openReddit(at url: URL? = nil) {
         hasOpenedReddit = true
         selectedNavItem = nil
-        isRedditActive = true
         isSettingsActive = false
         isHistoryActive = false
+        setRedditActive(true)
 
         guard let url else { return }
 
@@ -69,31 +69,42 @@ final class FrontPageViewModel {
 
     func openSettings() {
         selectedNavItem = nil
-        isRedditActive = false
+        setRedditActive(false)
         isSettingsActive = true
         isHistoryActive = false
     }
 
     func openHistory() {
         selectedNavItem = nil
-        isRedditActive = false
+        setRedditActive(false)
         isSettingsActive = false
         isHistoryActive = true
     }
 
     func selectNavItem(_ item: SidebarNavItem) {
         selectedNavItem = item
-        isRedditActive = false
+        setRedditActive(false)
         isSettingsActive = false
         isHistoryActive = false
     }
 
+    func deactivateRedditForPremiumGate() {
+        setRedditActive(false)
+    }
+
+    private func setRedditActive(_ active: Bool) {
+        isRedditActive = active
+        RedditWebViewStore.shared.setRedditPageActive(active)
+    }
+
     func showPaywall() {
         isPaywallPresented = true
+        RedditWebViewStore.shared.setPaywallPresented(true)
     }
 
     func dismissPaywall() {
         isPaywallPresented = false
+        RedditWebViewStore.shared.setPaywallPresented(false)
     }
 
     let createItems: [SidebarNavItem] = [

+ 1 - 1
App AI for Reddit/Views/FrontPageView.swift

@@ -195,7 +195,7 @@ struct FrontPageView: View {
     private func configureRedditAccessForPremiumStatus() {
         guard subscriptions.hasResolvedPremiumStatus else { return }
         if !subscriptions.hasPremiumAccess, viewModel.isRedditActive {
-            viewModel.isRedditActive = false
+            viewModel.deactivateRedditForPremiumGate()
             viewModel.selectNavItem(FrontPageViewModel.postGeneratorItem)
         }
     }