Files
omnivore/apple/OmnivoreKit/Sources/Views/Web/BasicWebAppView.swift

87 lines
2.5 KiB
Swift

import SwiftUI
import WebKit
#if os(iOS)
public struct BasicWebAppView: UIViewRepresentable {
let request: URLRequest
let webView = WKWebView()
public init(request: URLRequest) {
self.request = request
}
public func makeCoordinator() -> BasicWebAppViewCoordinator {
BasicWebAppViewCoordinator()
}
public func makeUIView(context _: Context) -> WKWebView {
webView.scrollView.isScrollEnabled = true
webView.isOpaque = false
webView.backgroundColor = UIColor.clear
if let url = request.url {
// let themeID = Color.isDarkMode ? "Gray" /* "Sepia" */ : "Charcoal"
let themeID = Color.isDarkMode ? "Gray" : "LightGray"
webView.injectCookie(cookieString: "theme=\(themeID); Max-Age=31536000;", url: url)
}
return webView
}
public func updateUIView(_ webView: WKWebView, context: Context) {
if context.coordinator.needsReload {
webView.load(request)
context.coordinator.needsReload = false
}
}
}
#endif
#if os(macOS)
public struct BasicWebAppView: NSViewRepresentable {
let request: URLRequest
public init(request: URLRequest) {
self.request = request
}
public func makeCoordinator() -> BasicWebAppViewCoordinator {
BasicWebAppViewCoordinator()
}
public func makeNSView(context _: Context) -> WKWebView {
let webView = OmnivoreWebView(frame: CGRect.zero)
if let url = request.url {
// Dark mode is still rendering a white background on mac for some reason.
// Forcing light mode for now until we figure out a fix
let themeID = "Charcoal" // NSApp.effectiveAppearance.name == NSAppearance.Name.darkAqua ? "Gray" : "LightGray"
webView.injectCookie(cookieString: "theme=\(themeID); Max-Age=31536000;", url: url)
}
return webView
}
public func updateNSView(_ webView: WKWebView, context: Context) {
if context.coordinator.needsReload {
webView.load(request)
context.coordinator.needsReload = false
}
}
}
#endif
public final class BasicWebAppViewCoordinator: NSObject {
var needsReload = true
override init() {
super.init()
}
}
extension WKWebView {
func injectCookie(cookieString: String?, url: URL) {
if let cookieString = cookieString {
for cookie in HTTPCookie.cookies(withResponseHeaderFields: ["Set-Cookie": cookieString], for: url) {
configuration.websiteDataStore.httpCookieStore.setCookie(cookie) {}
}
}
}
}