Improve "Purchased" view (#979)

- Show eligible features first
- Render ineligible features as secondary
This commit is contained in:
Davide 2024-12-04 17:38:13 +01:00 committed by GitHub
parent 4ef47dfd77
commit d8f5caa2f7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 37 additions and 7 deletions

View File

@ -73,7 +73,14 @@ private extension PurchasedView {
} }
var allFeatures: [AppFeature] { var allFeatures: [AppFeature] {
AppFeature.allCases.sorted() AppFeature.allCases.sorted {
let lRank = $0.rank(with: iapManager)
let rRank = $1.rank(with: iapManager)
if lRank != rRank {
return lRank < rRank
}
return $0 < $1
}
} }
} }
@ -124,11 +131,7 @@ private extension PurchasedView {
var featuresSection: some View { var featuresSection: some View {
Group { Group {
ForEach(allFeatures, id: \.self) { feature in ForEach(allFeatures, id: \.self) { feature in
HStack { FeatureView(text: feature.localizedDescription, isEligible: iapManager.isEligible(for: feature))
Text(feature.localizedDescription)
Spacer()
ThemeImage(iapManager.isEligible(for: feature) ? .marked : .close)
}
.scrollableOnTV() .scrollableOnTV()
} }
} }
@ -136,6 +139,33 @@ private extension PurchasedView {
} }
} }
private struct FeatureView: View {
let text: String
let isEligible: Bool
var body: some View {
HStack {
Text(text)
Spacer()
ThemeImage(isEligible ? .marked : .close)
}
.foregroundStyle(isEligible ? .primary : .secondary)
}
}
// MARK: -
private extension AppFeature {
@MainActor
func rank(with iapManager: IAPManager) -> Int {
iapManager.isEligible(for: self) ? 0 : 1
}
}
// MARK: - Previews
#Preview { #Preview {
PurchasedView() PurchasedView()
.withMockEnvironment() .withMockEnvironment()