import AppKit import WebKit @MainActor final class RedditShareScriptBridge: NSObject, WKScriptMessageHandler { static let shared = RedditShareScriptBridge() weak var webView: WKWebView? private override init() { super.init() } nonisolated func userContentController( _ userContentController: WKUserContentController, didReceive message: WKScriptMessage ) { guard message.name == RedditShareBridgeStyle.messageHandlerName else { return } Task { @MainActor in handleShareMessage(message) } } private func handleShareMessage(_ message: WKScriptMessage) { let targetWebView = webView ?? message.webView guard let targetWebView else { return } var items: [Any] = [] if let payload = message.body as? [String: Any] { if let urlString = payload["url"] as? String, !urlString.isEmpty, let url = URL(string: urlString) { items.append(url) } if let text = payload["text"] as? String, !text.isEmpty { items.append(text) } if let title = payload["title"] as? String, !title.isEmpty { items.append(title) } } else if let urlString = message.body as? String, let url = URL(string: urlString) { items.append(url) } guard !items.isEmpty else { resolveShare(on: targetWebView, success: false) return } let picker = NSSharingServicePicker(items: items) let anchor = NSRect( x: targetWebView.bounds.midX, y: targetWebView.bounds.midY, width: 1, height: 1 ) picker.show(relativeTo: anchor, of: targetWebView, preferredEdge: .minY) resolveShare(on: targetWebView, success: true) } private func resolveShare(on webView: WKWebView, success: Bool) { webView.evaluateJavaScript( "window.__reddoraShareCallback && window.__reddoraShareCallback(\(success));", completionHandler: nil ) } }