ChWebsiteApp/CHDataManagement/Views/Pages/PageDetailView.swift
2024-12-16 09:54:21 +01:00

129 lines
3.9 KiB
Swift

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 isGeneratingWebsite = false
@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 {
Button(action: generate) {
Text("Generate")
}
.disabled(isGeneratingWebsite)
if let didGenerateWebsite {
if didGenerateWebsite {
Image(systemSymbol: .checkmarkCircleFill)
.foregroundStyle(.green)
} else {
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 content.settings.paths.outputDirectoryPath != "" else {
print("Invalid output path")
return
}
let url = content.settings.outputDirectory
guard FileManager.default.fileExists(atPath: url.path) else {
print("Missing output folder")
return
}
isGeneratingWebsite = true
DispatchQueue.global(qos: .userInitiated).async {
var success = true
for language in ContentLanguage.allCases {
let generator = LocalizedWebsiteGenerator(
content: content,
language: language)
if !generator.generate(page: page) {
print("Generation failed")
success = false
}
}
DispatchQueue.main.async {
isGeneratingWebsite = false
didGenerateWebsite = success
}
}
}
}
extension PageDetailView: MainContentView {
init(item: Page) {
self.init(page: item)
}
static let itemDescription = "a page"
}
#Preview {
PageDetailView(page: .empty)
}