diff --git a/Frameworks/Feed/Bundle/Sources/UI/Components/FeedItem.swift b/Frameworks/Feed/Bundle/Sources/UI/Components/FeedItem.swift new file mode 100644 index 0000000..a472ed0 --- /dev/null +++ b/Frameworks/Feed/Bundle/Sources/UI/Components/FeedItem.swift @@ -0,0 +1,90 @@ +// +// FeedItem.swift +// ReviewsFeed +// +// Created by Javier Cicchelli on 19/03/2024. +// Copyright © 2024 Röck+Cöde. All rights reserved. +// + +import SwiftUI + +struct FeedItem: View { + + // MARK: Constants + private let item: Review + + // MARK: Initialisers + init(_ item: Review) { + self.item = item + } + + // MARK: Body + var body: some View { + VStack( + alignment: .leading, + spacing: 16 + ) { + HStack( + alignment: .bottom, + spacing: 8 + ) { + Image(systemName: "person.crop.circle") + + Text(item.author) + .font(.subheadline) + } + + VStack(spacing: 8) { + Text(item.title) + .font(.headline) + .lineLimit(2) + .fullWidth() + + Text(item.comment) + .font(.body) + .lineLimit(4) + .fullWidth() + } + .multilineTextAlignment(.leading) + + HStack(alignment: .bottom) { + ForEach(1...5, id: \.self) { index in + if #available(iOS 15.0, *) { + Image(systemName: "star") + .symbolVariant(index <= item.rating.stars ? .fill : .none) + } else { + Image(systemName: index <= item.rating.stars ? "star.fill" : "star") + } + } + + Spacer() + + HStack( + alignment: .bottom, + spacing: 4 + ) { + Text(item.rating.appVersion) + + Image(systemName: "iphone.gen3.circle") + } + } + .font(.subheadline) + } + .padding(.vertical, 8) + } + +} + +// MARK: - Previews +#Preview("Feed Item") { + FeedItem(.init( + author: "Some author name here...", + comment: "Some review comment here...", + id: 0, + rating: .init( + stars: 1, + appVersion: "v1.2.3" + ), + title: "Some review title here..." + )) +} diff --git a/Reviews.xcodeproj/project.pbxproj b/Reviews.xcodeproj/project.pbxproj index 71b89fa..7ff6150 100644 --- a/Reviews.xcodeproj/project.pbxproj +++ b/Reviews.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 0220ADA32BA90646001E6A9F /* FeedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0220ADA22BA90646001E6A9F /* FeedItem.swift */; }; 02620B8C2BA89C9A00DE7137 /* FeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02620B8B2BA89C9A00DE7137 /* FeedViewModel.swift */; }; 02DC7F9F2BA51793000EEEBE /* ReviewsFeed.h in Headers */ = {isa = PBXBuildFile; fileRef = 02DC7F912BA51793000EEEBE /* ReviewsFeed.h */; settings = {ATTRIBUTES = (Public, ); }; }; 02DC7FA22BA51793000EEEBE /* ReviewsFeed.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 02DC7F8F2BA51793000EEEBE /* ReviewsFeed.framework */; }; @@ -47,6 +48,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0220ADA22BA90646001E6A9F /* FeedItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedItem.swift; sourceTree = ""; }; 02620B8B2BA89C9A00DE7137 /* FeedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedViewModel.swift; sourceTree = ""; }; 02DC7F8F2BA51793000EEEBE /* ReviewsFeed.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReviewsFeed.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 02DC7F912BA51793000EEEBE /* ReviewsFeed.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReviewsFeed.h; sourceTree = ""; }; @@ -122,6 +124,7 @@ isa = PBXGroup; children = ( 345AD13024C6EE64004E2EE1 /* ReviewCell.swift */, + 0220ADA22BA90646001E6A9F /* FeedItem.swift */, ); path = Components; sourceTree = ""; @@ -367,6 +370,7 @@ files = ( 02620B8C2BA89C9A00DE7137 /* FeedViewModel.swift in Sources */, 02DC7FAC2BA51B4C000EEEBE /* DetailsViewController.swift in Sources */, + 0220ADA32BA90646001E6A9F /* FeedItem.swift in Sources */, 02DC7FAF2BA51B4C000EEEBE /* Review.swift in Sources */, 02DC7FAE2BA51B4C000EEEBE /* FeedViewController.swift in Sources */, 02DC7FAD2BA51B4C000EEEBE /* ReviewCell.swift in Sources */,