mirror of
https://github.com/sartoopjj/thefeed.git
synced 2026-05-18 06:44:34 +03:00
76 lines
2.5 KiB
Swift
76 lines
2.5 KiB
Swift
import SwiftUI
|
|
import WebKit
|
|
|
|
struct WebView: UIViewRepresentable {
|
|
let url: URL
|
|
|
|
func makeCoordinator() -> Bridge { Bridge() }
|
|
|
|
func makeUIView(context: Context) -> WKWebView {
|
|
let cfg = WKWebViewConfiguration()
|
|
cfg.websiteDataStore = .default()
|
|
cfg.allowsInlineMediaPlayback = true
|
|
cfg.mediaTypesRequiringUserActionForPlayback = []
|
|
|
|
let userContent = WKUserContentController()
|
|
userContent.add(context.coordinator, name: "thefeed")
|
|
cfg.userContentController = userContent
|
|
|
|
let view = WKWebView(frame: .zero, configuration: cfg)
|
|
view.allowsBackForwardNavigationGestures = true
|
|
view.scrollView.bounces = true
|
|
view.navigationDelegate = context.coordinator
|
|
context.coordinator.webView = view
|
|
|
|
userContent.addUserScript(WKUserScript(
|
|
source: shimSource(),
|
|
injectionTime: .atDocumentStart,
|
|
forMainFrameOnly: true
|
|
))
|
|
|
|
view.load(URLRequest(url: url))
|
|
return view
|
|
}
|
|
|
|
private func shimSource() -> String {
|
|
let lang = resolveLang()
|
|
let langJS = lang.replacingOccurrences(of: "\"", with: "\\\"")
|
|
return """
|
|
window.IOS = {
|
|
isIOS: true,
|
|
_lang: "\(langJS)",
|
|
getLang: function() { return this._lang; },
|
|
setLang: function(l) {
|
|
this._lang = l;
|
|
window.webkit.messageHandlers.thefeed.postMessage(
|
|
{ action: 'setLang', lang: l });
|
|
},
|
|
saveMedia: function(b64, mime, name) {
|
|
window.webkit.messageHandlers.thefeed.postMessage(
|
|
{ action: 'saveMedia', body: b64, mime: mime, name: name });
|
|
},
|
|
shareMedia: function(b64, mime, name) {
|
|
window.webkit.messageHandlers.thefeed.postMessage(
|
|
{ action: 'shareMedia', body: b64, mime: mime, name: name });
|
|
},
|
|
openMedia: function(b64, mime, name) {
|
|
window.webkit.messageHandlers.thefeed.postMessage(
|
|
{ action: 'openMedia', body: b64, mime: mime, name: name });
|
|
}
|
|
};
|
|
"""
|
|
}
|
|
|
|
/// Returns the saved language ("" on first launch) so the WebView's
|
|
/// own language picker can detect first-launch and show its modal.
|
|
private func resolveLang() -> String {
|
|
return UserDefaults.standard.string(forKey: "tf.lang") ?? ""
|
|
}
|
|
|
|
func updateUIView(_ view: WKWebView, context: Context) {
|
|
if view.url != url {
|
|
view.load(URLRequest(url: url))
|
|
}
|
|
}
|
|
}
|