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