import SwiftUI import SFSafeSymbols struct PageDetailView: View { @Environment(\.language) private var language @EnvironmentObject private var content: Content @ObservedObject private var page: Page @State private var didGenerateWebsite: Bool? init(page: Page) { self.page = page } var body: some View { ScrollView { VStack(alignment: .leading) { DetailTitle( title: "Page", text: "A page contains longer content") HStack(alignment: .firstTextBaseline) { Button(action: generate) { Text("Generate") } .disabled(content.isGeneratingWebsite) switch didGenerateWebsite { case .none: Image(systemSymbol: .questionmarkCircleFill) .foregroundStyle(.gray) case .some(true): Image(systemSymbol: .checkmarkCircleFill) .foregroundStyle(.green) case .some(false): Image(systemSymbol: .xmarkCircleFill) .foregroundStyle(.red) } } IdPropertyView( id: $page.id, footer: "The page id is used to link to it internally.", validation: page.isValid, update: { page.update(id: $0) }) OptionalStringPropertyView( title: "External url", text: $page.externalLink, footer: "Set an external url to mark this page as external. It will not be generated, and links will be created using the provided url") BoolPropertyView( title: "Draft", value: $page.isDraft, footer: "Indicate a page as a draft to hide it from the website") .disabled(page.isExternalUrl) DatePropertyView( title: "Start date", value: $page.startDate, footer: "The date when the page content started") .disabled(page.isExternalUrl) OptionalDatePropertyView( title: "End date", isEnabled: $page.hasEndDate, date: $page.endDate, footer: "The date when the page content ended") .disabled(page.isExternalUrl) LocalizedPageDetailView( isExternalPage: page.isExternalUrl, page: page.localized(in: language)) .id(page.id + language.rawValue) } .padding() } } private func generate() { guard let url = content.storage.outputPath else { print("Invalid output path") return } guard FileManager.default.fileExists(atPath: url.path) else { print("Missing output folder") return } DispatchQueue.global(qos: .userInitiated).async { let success = content.generatePage(page) DispatchQueue.main.async { didGenerateWebsite = success } } } } extension PageDetailView: MainContentView { init(item: Page) { self.init(page: item) } static let itemDescription = "a page" } #Preview { PageDetailView(page: .empty) }