import SwiftUI import HighlightedTextEditor struct PageContentView: View { @ObservedObject var page: Page @ObservedObject private var localized: LocalizedPage let language: ContentLanguage @EnvironmentObject private var content: Content @State private var isGeneratingWebsite = false @State private var pageContent: String = "" init(page: Page, language: ContentLanguage) { self.page = page self.localized = page.localized(in: language) self.language = language } var body: some View { VStack(alignment: .leading) { TextField("", text: $localized.title) .font(.title) .textFieldStyle(.plain) HStack(alignment: .firstTextBaseline) { Button(action: loadContent) { Text("Load") } Button(action: saveContent) { Text("Save") } Button(action: generate) { Text("Generate") } .disabled(isGeneratingWebsite) Spacer() } HighlightedTextEditor( text: $pageContent, highlightRules: .markdown) } .padding() .onAppear(perform: loadContent) .onDisappear(perform: saveContent) } private func loadContent() { let content = content.storage.pageContent(for: page.id, language: language) guard content != "" else { pageContent = "New file" return } pageContent = content } private func saveContent() { guard pageContent != "", pageContent != "New file" else { return } content.storage.save(pageContent: pageContent, for: page.id, language: language) } private func generate() { guard content.settings.outputDirectoryPath != "" else { print("Invalid output path") return } let url = URL(fileURLWithPath: content.settings.outputDirectoryPath) guard FileManager.default.fileExists(atPath: url.path) else { print("Missing output folder") return } isGeneratingWebsite = true print("Generating page") DispatchQueue.global(qos: .userInitiated).async { let generator = WebsiteGenerator( content: content, language: language) if !generator.generate(page: page) { print("Generation failed") } DispatchQueue.main.async { isGeneratingWebsite = false print("Done") } } } } #Preview { PageContentView(page: .empty, language: .english) }