Files
thefeed/ios/Thefeed/WebView.swift
T

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