// // ContentView.swift // Gemini // // Created by Shadowfacts on 7/12/20. // import SwiftUI import GeminiFormat import GeminiRenderer import GeminiProtocol struct ContentView: View { let navigator: NavigationManager @State var task: GeminiDataTask? @State var document: Document? @State var errorMessage: String? var body: some View { mainView .frame(minWidth: 480, maxWidth: .infinity, minHeight: 300, maxHeight: .infinity) .onReceive(navigator.$currentURL, perform: self.urlChanged) } @ViewBuilder private var mainView: some View { if let document = document { DocumentView(document: document, changeURL: navigator.changeURL) } else if let errorMessage = errorMessage { VStack { Text("An error occurred") .font(.headline) Text(errorMessage) } } else { loadingView .onAppear(perform: self.loadDocument) } } @ViewBuilder private var loadingView: some View { if #available(macOS 10.16, iOS 14.0, *) { ProgressView("Loading...") } else { Text("Loading...") } } private func loadDocument() { let url = navigator.currentURL task = try! GeminiDataTask(url: url, completion: { (response) in switch response { case let .failure(error): self.errorMessage = error.localizedDescription case let .success(response): guard let text = response.bodyText else { self.errorMessage = "Response had no body text" return } self.document = GeminiParser.parse(text: text, baseURL: url) } self.task = nil }) task!.resume() } private func urlChanged(_ newValue: URL) { self.task = nil self.document = nil self.errorMessage = nil } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView(navigator: NavigationManager(url: URL(string: "gemini://localhost/overview.gmi")!)) } }