Remove WebView package and support sidebar in macOS
This commit is contained in:
parent
145f635768
commit
1ab22880f6
4 changed files with 111 additions and 35 deletions
|
@ -1,10 +1,6 @@
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import WebKit
|
import WebKit
|
||||||
|
|
||||||
#if !os(macOS)
|
|
||||||
import WebView
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct DescriptionView: View {
|
struct DescriptionView: View {
|
||||||
let username: String
|
let username: String
|
||||||
|
|
||||||
|
@ -49,16 +45,17 @@ struct DescriptionView: View {
|
||||||
return view
|
return view
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
#if !os(macOS)
|
||||||
var body: some View {
|
var body: some View {
|
||||||
#if !os(macOS)
|
|
||||||
VStack {
|
VStack {
|
||||||
WebView(webView: webView)
|
WebView(webView: webView)
|
||||||
}.navigationBarTitle("Sidebar", displayMode: .inline)
|
}.navigationBarTitle("Sidebar", displayMode: .inline)
|
||||||
#else
|
|
||||||
Text("Not supported on macOS.")
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
var body: some View {
|
||||||
|
WebView(webView: webView)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ProfileView: View {
|
struct ProfileView: View {
|
||||||
|
|
99
MobileFort/Common/WebView.swift
Normal file
99
MobileFort/Common/WebView.swift
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
// From https://github.com/kaishin/Markoff/blob/markoff-2/Markoff/Sources/Views/WebView.swift
|
||||||
|
// Based on https://github.com/kylehickinson/SwiftUI-WebView
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import Combine
|
||||||
|
import WebKit
|
||||||
|
|
||||||
|
class WebViewStore: ObservableObject {
|
||||||
|
private var observers = Set<NSKeyValueObservation>()
|
||||||
|
|
||||||
|
@Published var webView: WKWebView {
|
||||||
|
didSet {
|
||||||
|
setupObservers()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init(webView: WKWebView = .init()) {
|
||||||
|
self.webView = webView
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
self.webView
|
||||||
|
.configuration
|
||||||
|
.preferences
|
||||||
|
.setValue(true, forKey: "developerExtrasEnabled")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
setupObservers()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupObservers() {
|
||||||
|
func subscriber<Value>(for keyPath: KeyPath<WKWebView, Value>) -> NSKeyValueObservation {
|
||||||
|
webView.observe(keyPath, options: [.prior]) { _, change in
|
||||||
|
if change.isPrior {
|
||||||
|
self.objectWillChange.send()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
observers = [
|
||||||
|
subscriber(for: \.title),
|
||||||
|
subscriber(for: \.url),
|
||||||
|
subscriber(for: \.isLoading),
|
||||||
|
subscriber(for: \.estimatedProgress),
|
||||||
|
subscriber(for: \.hasOnlySecureContent),
|
||||||
|
subscriber(for: \.serverTrust),
|
||||||
|
subscriber(for: \.canGoBack),
|
||||||
|
subscriber(for: \.canGoForward)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension WebViewStore {
|
||||||
|
func update(_ HTML: String, baseURL: URL? = nil) {
|
||||||
|
webView.evaluateJavaScript("window.pageYOffset") { [weak self] object, error in
|
||||||
|
self?.webView.loadHTMLString(HTML, baseURL: baseURL)
|
||||||
|
|
||||||
|
if let offset = object as? Int {
|
||||||
|
self?.scrollTo(offset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func scrollTo(_ YOffset: Int) {
|
||||||
|
let script = "window.scrollTo(0, \(YOffset));"
|
||||||
|
let scrollScript = WKUserScript(source: script, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
|
||||||
|
self.webView.configuration.userContentController.addUserScript(scrollScript)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if os(iOS)
|
||||||
|
struct WebView: View, UIViewRepresentable {
|
||||||
|
let webView: WKWebView
|
||||||
|
|
||||||
|
init(webView: WKWebView) {
|
||||||
|
self.webView = webView
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeUIView(context: Context) -> WKWebView {
|
||||||
|
return webView
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIView(_ view: WKWebView, context: Context) {}
|
||||||
|
}
|
||||||
|
#elseif os(macOS)
|
||||||
|
struct WebView: View, NSViewRepresentable {
|
||||||
|
let webView: WKWebView
|
||||||
|
|
||||||
|
init(webView: WKWebView) {
|
||||||
|
self.webView = webView
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeNSView(context: Context) -> WKWebView {
|
||||||
|
return webView
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateNSView(_ view: WKWebView, context: Context) {}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -24,10 +24,11 @@
|
||||||
03B2BA9F2565555500483FE3 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B2BA9E2565555500483FE3 /* MainView.swift */; };
|
03B2BA9F2565555500483FE3 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B2BA9E2565555500483FE3 /* MainView.swift */; };
|
||||||
03B2BAA4256556C800483FE3 /* URLImage in Frameworks */ = {isa = PBXBuildFile; productRef = 03B2BAA3256556C800483FE3 /* URLImage */; };
|
03B2BAA4256556C800483FE3 /* URLImage in Frameworks */ = {isa = PBXBuildFile; productRef = 03B2BAA3256556C800483FE3 /* URLImage */; };
|
||||||
03B2BAA8256556D100483FE3 /* URLImage in Frameworks */ = {isa = PBXBuildFile; productRef = 03B2BAA7256556D100483FE3 /* URLImage */; };
|
03B2BAA8256556D100483FE3 /* URLImage in Frameworks */ = {isa = PBXBuildFile; productRef = 03B2BAA7256556D100483FE3 /* URLImage */; };
|
||||||
|
03B2BAB225655A1100483FE3 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B2BAB125655A1100483FE3 /* WebView.swift */; };
|
||||||
|
03B2BAB325655A1100483FE3 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B2BAB125655A1100483FE3 /* WebView.swift */; };
|
||||||
03BCD7432488947200DA1F27 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BCD7422488947200DA1F27 /* ProfileView.swift */; };
|
03BCD7432488947200DA1F27 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BCD7422488947200DA1F27 /* ProfileView.swift */; };
|
||||||
03BCD7452488948200DA1F27 /* PostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BCD7442488948200DA1F27 /* PostView.swift */; };
|
03BCD7452488948200DA1F27 /* PostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BCD7442488948200DA1F27 /* PostView.swift */; };
|
||||||
03BCD74A2489322500DA1F27 /* AttributedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BCD7492489322500DA1F27 /* AttributedText.swift */; };
|
03BCD74A2489322500DA1F27 /* AttributedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BCD7492489322500DA1F27 /* AttributedText.swift */; };
|
||||||
03BCD74D2489365600DA1F27 /* WebView in Frameworks */ = {isa = PBXBuildFile; productRef = 03BCD74C2489365600DA1F27 /* WebView */; };
|
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
@ -48,6 +49,7 @@
|
||||||
03B2BA6825654E9800483FE3 /* MobileFort.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MobileFort.entitlements; sourceTree = "<group>"; };
|
03B2BA6825654E9800483FE3 /* MobileFort.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MobileFort.entitlements; sourceTree = "<group>"; };
|
||||||
03B2BA84256550FA00483FE3 /* AttributedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedText.swift; sourceTree = "<group>"; };
|
03B2BA84256550FA00483FE3 /* AttributedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedText.swift; sourceTree = "<group>"; };
|
||||||
03B2BA9E2565555500483FE3 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; };
|
03B2BA9E2565555500483FE3 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; };
|
||||||
|
03B2BAB125655A1100483FE3 /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = "<group>"; };
|
||||||
03BCD7422488947200DA1F27 /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = "<group>"; };
|
03BCD7422488947200DA1F27 /* ProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileView.swift; sourceTree = "<group>"; };
|
||||||
03BCD7442488948200DA1F27 /* PostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostView.swift; sourceTree = "<group>"; };
|
03BCD7442488948200DA1F27 /* PostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostView.swift; sourceTree = "<group>"; };
|
||||||
03BCD7492489322500DA1F27 /* AttributedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedText.swift; sourceTree = "<group>"; };
|
03BCD7492489322500DA1F27 /* AttributedText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedText.swift; sourceTree = "<group>"; };
|
||||||
|
@ -58,7 +60,6 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
03BCD74D2489365600DA1F27 /* WebView in Frameworks */,
|
|
||||||
03B2BAA8256556D100483FE3 /* URLImage in Frameworks */,
|
03B2BAA8256556D100483FE3 /* URLImage in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
@ -137,6 +138,7 @@
|
||||||
03427F6C248887D200A0073D /* Common.swift */,
|
03427F6C248887D200A0073D /* Common.swift */,
|
||||||
03BCD7422488947200DA1F27 /* ProfileView.swift */,
|
03BCD7422488947200DA1F27 /* ProfileView.swift */,
|
||||||
03BCD7442488948200DA1F27 /* PostView.swift */,
|
03BCD7442488948200DA1F27 /* PostView.swift */,
|
||||||
|
03B2BAB125655A1100483FE3 /* WebView.swift */,
|
||||||
);
|
);
|
||||||
path = Common;
|
path = Common;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -165,7 +167,6 @@
|
||||||
);
|
);
|
||||||
name = "MobileFort (iOS)";
|
name = "MobileFort (iOS)";
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
03BCD74C2489365600DA1F27 /* WebView */,
|
|
||||||
03B2BAA7256556D100483FE3 /* URLImage */,
|
03B2BAA7256556D100483FE3 /* URLImage */,
|
||||||
);
|
);
|
||||||
productName = MobileFort;
|
productName = MobileFort;
|
||||||
|
@ -219,7 +220,6 @@
|
||||||
);
|
);
|
||||||
mainGroup = 03427F4C2488856C00A0073D;
|
mainGroup = 03427F4C2488856C00A0073D;
|
||||||
packageReferences = (
|
packageReferences = (
|
||||||
03BCD74B2489365600DA1F27 /* XCRemoteSwiftPackageReference "SwiftUI-WebView" */,
|
|
||||||
03B2BAA2256556C800483FE3 /* XCRemoteSwiftPackageReference "url-image" */,
|
03B2BAA2256556C800483FE3 /* XCRemoteSwiftPackageReference "url-image" */,
|
||||||
);
|
);
|
||||||
productRefGroup = 03427F562488856C00A0073D /* Products */;
|
productRefGroup = 03427F562488856C00A0073D /* Products */;
|
||||||
|
@ -260,6 +260,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
03427F6D248887D200A0073D /* Common.swift in Sources */,
|
03427F6D248887D200A0073D /* Common.swift in Sources */,
|
||||||
|
03B2BAB225655A1100483FE3 /* WebView.swift in Sources */,
|
||||||
03427F592488856C00A0073D /* AppDelegate.swift in Sources */,
|
03427F592488856C00A0073D /* AppDelegate.swift in Sources */,
|
||||||
03BCD7432488947200DA1F27 /* ProfileView.swift in Sources */,
|
03BCD7432488947200DA1F27 /* ProfileView.swift in Sources */,
|
||||||
03427F5B2488856C00A0073D /* SceneDelegate.swift in Sources */,
|
03427F5B2488856C00A0073D /* SceneDelegate.swift in Sources */,
|
||||||
|
@ -279,6 +280,7 @@
|
||||||
03B2BA7125654F0500483FE3 /* ProfileView.swift in Sources */,
|
03B2BA7125654F0500483FE3 /* ProfileView.swift in Sources */,
|
||||||
03B2BA7225654F0500483FE3 /* PostView.swift in Sources */,
|
03B2BA7225654F0500483FE3 /* PostView.swift in Sources */,
|
||||||
03B2BA5C25654E9700483FE3 /* AppDelegate.swift in Sources */,
|
03B2BA5C25654E9700483FE3 /* AppDelegate.swift in Sources */,
|
||||||
|
03B2BAB325655A1100483FE3 /* WebView.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -559,14 +561,6 @@
|
||||||
minimumVersion = 2.1.9;
|
minimumVersion = 2.1.9;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
03BCD74B2489365600DA1F27 /* XCRemoteSwiftPackageReference "SwiftUI-WebView" */ = {
|
|
||||||
isa = XCRemoteSwiftPackageReference;
|
|
||||||
repositoryURL = "https://github.com/kylehickinson/SwiftUI-WebView";
|
|
||||||
requirement = {
|
|
||||||
kind = upToNextMajorVersion;
|
|
||||||
minimumVersion = 0.2.0;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
@ -580,11 +574,6 @@
|
||||||
package = 03B2BAA2256556C800483FE3 /* XCRemoteSwiftPackageReference "url-image" */;
|
package = 03B2BAA2256556C800483FE3 /* XCRemoteSwiftPackageReference "url-image" */;
|
||||||
productName = URLImage;
|
productName = URLImage;
|
||||||
};
|
};
|
||||||
03BCD74C2489365600DA1F27 /* WebView */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
package = 03BCD74B2489365600DA1F27 /* XCRemoteSwiftPackageReference "SwiftUI-WebView" */;
|
|
||||||
productName = WebView;
|
|
||||||
};
|
|
||||||
/* End XCSwiftPackageProductDependency section */
|
/* End XCSwiftPackageProductDependency section */
|
||||||
};
|
};
|
||||||
rootObject = 03427F4D2488856C00A0073D /* Project object */;
|
rootObject = 03427F4D2488856C00A0073D /* Project object */;
|
||||||
|
|
|
@ -1,15 +1,6 @@
|
||||||
{
|
{
|
||||||
"object": {
|
"object": {
|
||||||
"pins": [
|
"pins": [
|
||||||
{
|
|
||||||
"package": "WebView",
|
|
||||||
"repositoryURL": "https://github.com/kylehickinson/SwiftUI-WebView",
|
|
||||||
"state": {
|
|
||||||
"branch": null,
|
|
||||||
"revision": "ec4352095428a06423868b3b2a92fdaa3c6281f7",
|
|
||||||
"version": "0.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"package": "URLImage",
|
"package": "URLImage",
|
||||||
"repositoryURL": "https://github.com/dmytro-anokhin/url-image",
|
"repositoryURL": "https://github.com/dmytro-anokhin/url-image",
|
||||||
|
|
Reference in a new issue