ChWebsiteApp/CHDataManagement/Views/Pages/LocalizedPageContentView.swift
2025-02-05 15:40:09 +01:00

129 lines
3.6 KiB
Swift

import SwiftUI
import SFSafeSymbols
import HighlightedTextEditor
struct LocalizedPageContentView: View {
@EnvironmentObject
var content: Content
@ObservedObject
var page: Page
let language: ContentLanguage
@State
private var pageContent: String = ""
@State
private var pageContentUsedForGeneration: String = ""
@State
private var generationResults: PageGenerationResults?
@State
private var didChangeContent = false
var body: some View {
VStack(alignment: .leading) {
HStack(alignment: .firstTextBaseline) {
Button(action: loadContent) {
Text("Load")
}
Button(action: saveContent) {
Text("Save")
}
Button(action: checkContent) {
Text("Check")
}.disabled(content.isGeneratingWebsite)
if content.isGeneratingWebsite {
ProgressView()
.scaleEffect(0.6)
.frame(height: 15)
}
Spacer()
}
HStack {
if let generationResults {
PageContentResultsView(results: generationResults)
}
let linkingPosts = content.posts.filter { $0.linkedPage == page }
TextWithPopup(
symbol: .ipadAndArrowForward,
text: "\(linkingPosts.count) linking posts",
items: linkingPosts.map { $0.title(in: language) })
}.foregroundStyle(.secondary)
InsertableItemsView()
HighlightedTextEditor(
text: $pageContent,
highlightRules: .markdown)
.onChange(of: pageContent) {
didChangeContent = true
}
}
.onAppear(perform: loadContent)
.onDisappear(perform: saveContent)
}
private func loadContent() {
let language = language
guard page.localized(in: language).hasContent else {
pageContent = "New file"
DispatchQueue.main.async {
didChangeContent = false
}
return
}
guard let content = page.pageContent(in: language) else {
print("Failed to load page content")
pageContent = "Failed to load"
DispatchQueue.main.async {
didChangeContent = false
}
return
}
guard content != "" else {
pageContent = "New file"
DispatchQueue.main.async {
didChangeContent = false
}
return
}
pageContent = content
checkContent()
DispatchQueue.main.async {
didChangeContent = false
}
}
private func saveContent() {
guard pageContent != "New file", pageContent != "" else {
// TODO: Delete file?
return
}
guard didChangeContent else {
return
}
guard page.save(pageContent: pageContent, in: language) else {
print("Failed to save content")
return
}
didChangeContent = false
}
private func checkContent() {
let content = self.pageContent
guard content != pageContentUsedForGeneration else {
return
}
guard !self.content.isGeneratingWebsite else {
return
}
self.content.check(content: content, of: page, for: language) {
self.generationResults = $0
}
}
}