ChWebsiteApp/CHDataManagement/Views/Pages/PageDetailView.swift
2025-02-05 12:24:33 +01:00

151 lines
5.1 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 showFileSelectionSheet = false
private var transferImage: (language: ContentLanguage, image: FileResource)? {
page.localized(in: language.next).linkPreview.image.map { (language.next, $0) }
}
init(page: Page) {
self.page = page
}
private var requiredFilesText: String {
switch page.requiredFiles.count {
case 0: return "No files"
case 1: return "1 file"
default: return "\(page.requiredFiles.count) files"
}
}
#warning("Show info on page generation")
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)
.onChange(of: page.externalLink) { _, newValue in
// Ensure that external pages are not drafts
if newValue != nil && page.isDraft {
page.isDraft = false
}
}
BoolPropertyView(
title: "Hide date",
value: $page.hideDate,
footer: "Do not show the date string on the page")
.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.potentialEndDate,
footer: "The date when the page content ended")
.disabled(page.isExternalUrl)
GenericPropertyView(
title: "Required files",
footer: "The additional files required by the page") {
HStack {
Image(systemSymbol: .squareAndPencilCircleFill)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 20)
Text(requiredFilesText)
Spacer()
}
.padding(.vertical, 8)
.contentShape(Rectangle())
.onTapGesture {
showFileSelectionSheet = true
}
}
LocalizedPageDetailView(
isExternalPage: page.isExternalUrl,
page: page.localized(in: language),
transferImage: transferImage)
.id(page.id + language.rawValue)
}
.padding()
}
.sheet(isPresented: $showFileSelectionSheet) {
MultiFileSelectionView(selectedFiles: $page.requiredFiles, insertSorted: true)
}
}
private func generate() {
DispatchQueue.global(qos: .userInitiated).async {
content.generatePage(page)
}
}
}
extension PageDetailView: MainContentView {
init(item: Page) {
self.init(page: item)
}
static let itemDescription = "a page"
}
#Preview {
PageDetailView(page: Page.Mock.empty)
}