Improve post entry views, add post link data
This commit is contained in:
123
CHDataManagement/Views/Posts/PostContentView.swift
Normal file
123
CHDataManagement/Views/Posts/PostContentView.swift
Normal file
@@ -0,0 +1,123 @@
|
||||
import SwiftUI
|
||||
import HighlightedTextEditor
|
||||
import SFSafeSymbols
|
||||
|
||||
struct PostContentView: View {
|
||||
|
||||
@ObservedObject
|
||||
var post: Post
|
||||
|
||||
@Environment(\.language)
|
||||
private var language
|
||||
|
||||
var body: some View {
|
||||
LocalizedPostContentView(post: post)
|
||||
}
|
||||
}
|
||||
|
||||
private struct LocalizedTitle: View {
|
||||
|
||||
@ObservedObject
|
||||
private var post: LocalizedPost
|
||||
|
||||
init(post: LocalizedPost) {
|
||||
self.post = post
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
TextField("", text: $post.title)
|
||||
.font(.system(size: 24, weight: .bold))
|
||||
.foregroundStyle(Color.primary)
|
||||
.textFieldStyle(.plain)
|
||||
.lineLimit(2)
|
||||
}
|
||||
}
|
||||
|
||||
private struct LocalizedContentEditor: View {
|
||||
|
||||
@ObservedObject
|
||||
private var post: LocalizedPost
|
||||
|
||||
init(post: LocalizedPost) {
|
||||
self.post = post
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
TextEditor(text: $post.content)
|
||||
// HighlightedTextEditor(
|
||||
// text: $post.content,
|
||||
// highlightRules: .markdown)
|
||||
}
|
||||
}
|
||||
|
||||
struct LocalizedPostContentView: View {
|
||||
|
||||
@ObservedObject
|
||||
var post: Post
|
||||
|
||||
@State
|
||||
private var showTagPicker = false
|
||||
|
||||
@Environment(\.language)
|
||||
private var language
|
||||
|
||||
@EnvironmentObject
|
||||
private var content: Content
|
||||
|
||||
init(post: Post) {
|
||||
self.post = post
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading) {
|
||||
Text("Images")
|
||||
.font(.headline)
|
||||
PostImagesView(post: post.localized(in: language))
|
||||
LocalizedTitle(post: post.localized(in: language))
|
||||
FlowHStack {
|
||||
ForEach(post.tags, id: \.id) { tag in
|
||||
TagView(tag: .init(
|
||||
en: tag.english.name,
|
||||
de: tag.german.name)
|
||||
)
|
||||
.foregroundStyle(.white)
|
||||
}
|
||||
Button(action: { showTagPicker = true }) {
|
||||
Image(systemSymbol: .squareAndPencilCircleFill)
|
||||
.resizable()
|
||||
.aspectRatio(1, contentMode: .fit)
|
||||
.frame(height: 22)
|
||||
.foregroundColor(Color.gray)
|
||||
.background(Circle()
|
||||
.fill(Color.white)
|
||||
.padding(1))
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
LocalizedContentEditor(post: post.localized(in: language))
|
||||
}
|
||||
.padding()
|
||||
.sheet(isPresented: $showTagPicker) {
|
||||
TagSelectionView(
|
||||
presented: $showTagPicker,
|
||||
selected: $post.tags,
|
||||
tags: $content.tags)
|
||||
}
|
||||
}
|
||||
|
||||
private func remove(tag: Tag) {
|
||||
post.tags = post.tags.filter {$0.id != tag.id }
|
||||
}
|
||||
}
|
||||
|
||||
#Preview(traits: .fixedLayout(width: 450, height: 600)) {
|
||||
List {
|
||||
PostContentView(post: .fullMock)
|
||||
.listRowSeparator(.hidden)
|
||||
.environment(\.language, ContentLanguage.german)
|
||||
PostContentView(post: .mock)
|
||||
.listRowSeparator(.hidden)
|
||||
}
|
||||
.environmentObject(Content.mock)
|
||||
//.listStyle(.plain)
|
||||
}
|
Reference in New Issue
Block a user