1
Fork 0
This repository has been archived on 2025-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
mobilefort/MobileFort/Common/ProfileView.swift

129 lines
4 KiB
Swift
Raw Permalink Normal View History

2020-06-03 22:33:04 -04:00
import SwiftUI
2020-06-04 10:28:32 -04:00
import WebKit
2020-11-18 08:18:26 -05:00
2020-06-04 10:00:14 -04:00
struct DescriptionView: View {
2020-06-04 10:28:32 -04:00
let username: String
private func replaceDOM(selector: String) -> String {
return
"""
var selectedElement = document.querySelector('\(selector)');
document.body.innerHTML = selectedElement.innerHTML;
"""
}
var webView: WKWebView {
let configuration = WKWebViewConfiguration()
let blockRules = """
[{
"trigger": {
"url-filter": ".*",
"resource-type": ["script"]
},
"action": {
"type": "block"
}
}]
"""
WKContentRuleListStore.default().compileContentRuleList(
forIdentifier: "ContentBlockingRules",
encodedContentRuleList: blockRules) { (contentRuleList, error) in
configuration.userContentController.add(contentRuleList!)
}
let userScript = WKUserScript(source: replaceDOM(selector: "#description"),
injectionTime: WKUserScriptInjectionTime.atDocumentEnd,
forMainFrameOnly: true)
configuration.userContentController.addUserScript(userScript)
let view = WKWebView(frame: .zero, configuration: configuration)
view.load(URLRequest(url: URL(string: "https://www.pillowfort.social/" + self.username)!))
return view
}
#if !os(macOS)
2020-06-04 10:00:14 -04:00
var body: some View {
2020-06-04 19:02:22 -04:00
VStack {
WebView(webView: webView)
}.navigationBarTitle("Sidebar", displayMode: .inline)
2020-06-04 10:00:14 -04:00
}
#else
var body: some View {
WebView(webView: webView)
}
#endif
2020-06-04 10:00:14 -04:00
}
2020-06-03 22:33:04 -04:00
struct ProfileView: View {
let username: String
@State var posts: [ParsedPostContainer] = []
2020-06-03 22:33:04 -04:00
2020-11-18 08:18:26 -05:00
#if os(iOS)
2020-06-03 22:33:04 -04:00
var body: some View {
2020-06-04 19:02:22 -04:00
List(posts, id: \.post.id) { post in
PostView(post: post)
2020-06-04 10:00:14 -04:00
}
2020-06-04 19:02:22 -04:00
.navigationBarTitle(username)
2020-06-04 10:28:32 -04:00
.navigationBarItems(trailing: NavigationLink(destination: DescriptionView(username: username)) {
2020-06-04 19:02:22 -04:00
Text("Sidebar")
2020-06-04 10:00:14 -04:00
})
2020-11-18 08:32:37 -05:00
.onAppear(perform: load)
2020-06-03 22:33:04 -04:00
}
2020-11-18 08:18:26 -05:00
#else
var body: some View {
2020-11-18 08:32:37 -05:00
HStack {
List(posts, id: \.post.id) { post in
PostView(post: post)
}
.onAppear(perform: load)
2020-11-18 08:18:26 -05:00
2020-11-18 08:32:37 -05:00
DescriptionView(username: username)
2020-11-18 08:18:26 -05:00
}
}
#endif
2020-11-18 08:32:37 -05:00
private func load() {
let url = URL(string: "https://www.pillowfort.social/" + self.username + "/json")!
URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
if let jsonData = data {
struct Posts : Decodable {
let posts: [Post]
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let decodedPosts = try decoder.decode(Posts.self, from: jsonData)
var postArray = [ParsedPostContainer]()
for post in decodedPosts.posts {
let container = ParsedPostContainer(post: post, contentAttributed: (try? NSMutableAttributedString(data: post.getContent().data(using: .utf8)!, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil))!)
postArray.append(container)
}
DispatchQueue.main.sync {
self.posts = postArray
}
}
} catch {
print("\(error)")
}
}.resume()
}
2020-06-03 22:33:04 -04:00
}
struct ProfileView_Previews: PreviewProvider {
static var previews: some View {
//return ProfileView(username: "foobar", posts: [fooPost, fooPostReblog])
Text("hello, world!")
2020-06-03 22:33:04 -04:00
}
}