108 lines
3.1 KiB
Swift
108 lines
3.1 KiB
Swift
import SwiftUI
|
|
|
|
struct PostDetailView: View {
|
|
|
|
@Environment(\.language)
|
|
private var language
|
|
|
|
@EnvironmentObject
|
|
private var content: Content
|
|
|
|
@EnvironmentObject
|
|
private var selection: SelectedContent
|
|
|
|
@ObservedObject
|
|
private var post: Post
|
|
|
|
@State
|
|
private var showLinkedPagePicker = false
|
|
|
|
init(post: Post) {
|
|
self.post = post
|
|
}
|
|
|
|
private var transferImage: (language: ContentLanguage, image: FileResource)? {
|
|
post.localized(in: language.next).linkPreview.image.map { (language.next, $0) }
|
|
}
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(alignment: .leading) {
|
|
DetailTitle(
|
|
title: "Post",
|
|
text: "Posts capture quick updates and can link to pages")
|
|
|
|
if post.linkedPage == nil {
|
|
Button("Create page", action: createPageFromPost)
|
|
}
|
|
|
|
IdPropertyView(
|
|
id: $post.id,
|
|
footer: "The id is used to link to post and store them",
|
|
validation: post.isValid,
|
|
update: { post.update(id: $0) })
|
|
|
|
BoolPropertyView(
|
|
title: "Draft",
|
|
value: $post.isDraft,
|
|
footer: "Indicate a post as a draft to hide it from the website")
|
|
|
|
DatePropertyView(
|
|
title: "Start date",
|
|
value: $post.startDate,
|
|
footer: "The date when the post content started")
|
|
|
|
OptionalDatePropertyView(
|
|
title: "End date",
|
|
isEnabled: $post.hasEndDate,
|
|
date: $post.potentialEndDate,
|
|
footer: "The date when the post content ended")
|
|
|
|
PagePropertyView(
|
|
title: "Linked page",
|
|
selectedPage: $post.linkedPage,
|
|
footer: "The page to open when clicking on the post")
|
|
.onChange(of: post.linkedPage) { oldValue, newValue in
|
|
if newValue != nil {
|
|
post.tags = []
|
|
} else {
|
|
// Link removed, so copy tags from previous link
|
|
if let oldValue {
|
|
post.tags = oldValue.tags
|
|
}
|
|
}
|
|
}
|
|
|
|
LocalizedPostDetailView(
|
|
post: post.localized(in: language),
|
|
transferImage: transferImage)
|
|
}
|
|
.padding()
|
|
}
|
|
}
|
|
|
|
private func createPageFromPost() {
|
|
let page = post.makePage()
|
|
DispatchQueue.main.async {
|
|
content.pages.insert(page, at: 0)
|
|
post.linkedPage = page
|
|
selection.page = page
|
|
selection.tab = .pages
|
|
}
|
|
}
|
|
}
|
|
|
|
extension PostDetailView: MainContentView {
|
|
|
|
init(item: Post) {
|
|
self.init(post: item)
|
|
}
|
|
|
|
static let itemDescription = "a post"
|
|
}
|
|
|
|
|
|
#Preview(traits: .fixedLayout(width: 270, height: 500)) {
|
|
PostDetailView(post: .Mock.hike2)
|
|
}
|