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