diff --git a/Shared/Post/PostCell.swift b/Shared/Post/PostCell.swift index 19d49e6..298d5c9 100644 --- a/Shared/Post/PostCell.swift +++ b/Shared/Post/PostCell.swift @@ -1,38 +1,39 @@ import SwiftUI struct PostCell: View { - var post: Post + @ObservedObject var post: Post + var body: some View { NavigationLink( destination: PostEditor(post: post) ) { HStack { VStack(alignment: .leading) { Text(post.title) .font(.headline) .lineLimit(1) Text(buildDateString(from: post.createdDate)) .font(.caption) .foregroundColor(.secondary) .lineLimit(1) } Spacer() - PostStatusBadge(postStatus: post.status) + PostStatusBadge(post: post) } } } func buildDateString(from date: Date) -> String { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .long dateFormatter.timeStyle = .short return dateFormatter.string(from: date) } } struct PostCell_Previews: PreviewProvider { static var previews: some View { PostCell(post: testPost) } } diff --git a/Shared/Post/PostEditor.swift b/Shared/Post/PostEditor.swift index 777bfb4..61a7236 100644 --- a/Shared/Post/PostEditor.swift +++ b/Shared/Post/PostEditor.swift @@ -1,40 +1,35 @@ import SwiftUI struct PostEditor: View { @ObservedObject var post: Post - @State private var hasUnpublishedChanges: Bool = false var body: some View { VStack { TextEditor(text: $post.title) .font(.title) .frame(height: 100) .onChange(of: post.title) { _ in if post.status == .published { - hasUnpublishedChanges = true + post.status = .edited } } TextEditor(text: $post.body) .font(.body) .onChange(of: post.body) { _ in if post.status == .published { - hasUnpublishedChanges = true + post.status = .edited } } } .padding() .toolbar { - if hasUnpublishedChanges { - PostStatusBadge(postStatus: .edited) - } else { - PostStatusBadge(postStatus: post.status) - } + PostStatusBadge(post: post) } } } struct PostEditor_Previews: PreviewProvider { static var previews: some View { PostEditor(post: testPost) } } diff --git a/Shared/Post/PostList.swift b/Shared/Post/PostList.swift index 8c2e81e..03d2b1c 100644 --- a/Shared/Post/PostList.swift +++ b/Shared/Post/PostList.swift @@ -1,21 +1,21 @@ import SwiftUI struct PostList: View { - var postStore: PostStore + @ObservedObject var postStore: PostStore var body: some View { List { Text("\(postStore.posts.count) Posts") .foregroundColor(.secondary) ForEach(postStore.posts) { post in PostCell(post: post) } } } } struct PostList_Previews: PreviewProvider { static var previews: some View { PostList(postStore: testPostStore) } } diff --git a/Shared/Post/PostStatusBadge.swift b/Shared/Post/PostStatusBadge.swift index 212f097..718ebe8 100644 --- a/Shared/Post/PostStatusBadge.swift +++ b/Shared/Post/PostStatusBadge.swift @@ -1,57 +1,57 @@ import SwiftUI struct PostStatusBadge: View { - @State var postStatus: PostStatus + @ObservedObject var post: Post var body: some View { - let (badgeLabel, badgeColor) = setupBadgeProperties(for: postStatus) + let (badgeLabel, badgeColor) = setupBadgeProperties(for: post.status) Text(badgeLabel) .font(.caption) .fontWeight(.bold) .foregroundColor(.white) .textCase(.uppercase) .lineLimit(1) .padding(EdgeInsets(top: 2.5, leading: 7.5, bottom: 2.5, trailing: 7.5)) .background(badgeColor) .clipShape(RoundedRectangle(cornerRadius: 5.0, style: .circular)) } func setupBadgeProperties(for status: PostStatus) -> (String, Color) { var badgeLabel: String var badgeColor: Color switch status { case .draft: badgeLabel = "draft" badgeColor = Color(red: 0.75, green: 0.5, blue: 0.85, opacity: 1.0) case .edited: badgeLabel = "edited" badgeColor = Color(red: 0.75, green: 0.7, blue: 0.1, opacity: 1.0) case .published: badgeLabel = "published" badgeColor = .gray } return (badgeLabel, badgeColor) } } struct PostStatusBadge_DraftPreviews: PreviewProvider { static var previews: some View { - PostStatusBadge(postStatus: .draft) + PostStatusBadge(post: testPostData[0]) } } struct PostStatusBadge_EditedPreviews: PreviewProvider { static var previews: some View { Group { - PostStatusBadge(postStatus: .edited) + PostStatusBadge(post: testPostData[1]) } } } struct PostStatusBadge_PublishedPreviews: PreviewProvider { static var previews: some View { - PostStatusBadge(postStatus: .published) + PostStatusBadge(post: testPostData[2]) } }