import SwiftUI import SFSafeSymbols struct PostView: View { @ObservedObject var post: Post @Environment(\.language) private var language var body: some View { LocalizedPostView(post: post, localized: post.localized(in: language)) } } struct LocalizedPostView: View { @ObservedObject var post: Post @ObservedObject var localized: LocalizedPost @State private var showDatePicker = false @State private var showPagePicker = false @State private var showImagePicker = false @State private var showTagPicker = false @Environment(\.language) private var language @EnvironmentObject private var content: Content private var linkedPageText: String { if let page = post.linkedPage { return page.localized(in: language).title } return "Add linked page" } var body: some View { VStack(alignment: .center) { if localized.images.isEmpty { Button(action: { showImagePicker = true }) { Text("Add image") } .buttonStyle(.plain) .foregroundStyle(.blue) .padding(.top) } else { PostImageGalleryView(post: localized) .aspectRatio(1.33, contentMode: .fill) } VStack(alignment: .leading) { HStack(alignment: .center, spacing: 0) { Text(post.dateText(in: language)) .font(.system(size: 19, weight: .semibold)) .onTapGesture { showDatePicker = true } Spacer() Toggle("Draft", isOn: $post.isDraft) } .foregroundStyle(.secondary) TextField("", text: $localized.title) .font(.system(size: 24, weight: .bold)) .foregroundStyle(Color.primary) .textFieldStyle(.plain) .lineLimit(2) 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.blue) .background(Circle() .fill(Color.white) .padding(1)) } .buttonStyle(.plain) } TextEditor(text: $localized.content) .font(.body) .foregroundStyle(.secondary) .textEditorStyle(.plain) .padding(.leading, -5) .scrollDisabled(true) HorizontalCenter { Button(action: { showPagePicker = true }) { Text(linkedPageText) } .buttonStyle(.plain) .foregroundStyle(ColorPalette.link) } } .padding() } .background(Color(NSColor.windowBackgroundColor)) .cornerRadius(8) .sheet(isPresented: $showDatePicker) { DatePickerView( post: post, showDatePicker: $showDatePicker) } .sheet(isPresented: $showPagePicker) { PagePickerView( showPagePicker: $showPagePicker, selectedPage: $post.linkedPage) } .sheet(isPresented: $showImagePicker) { ImagePickerView( showImagePicker: $showImagePicker, post: localized) } .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 { PostView(post: .fullMock) .listRowSeparator(.hidden) .environment(\.language, ContentLanguage.german) PostView(post: .mock) .listRowSeparator(.hidden) } .environmentObject(Content.mock) //.listStyle(.plain) }