import AppKit import WebKit @MainActor 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() {} func containerIfNeeded() -> RedditWebViewContainer { if let container { return container } 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() { isWindowMinimized = true updateMediaPlaybackSuspension() } func resumeMediaPlaybackAfterWindowDeminiaturize() { 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) } } }