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] {
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,18 +131,41 @@ private extension PurchasedView {
var featuresSection: some View {
Group {
ForEach(allFeatures, id: \.self) { feature in
HStack {
Text(feature.localizedDescription)
Spacer()
ThemeImage(iapManager.isEligible(for: feature) ? .marked : .close)
}
.scrollableOnTV()
FeatureView(text: feature.localizedDescription, isEligible: iapManager.isEligible(for: feature))
.scrollableOnTV()
}
}
.themeSection(header: Strings.Views.Purchased.Sections.Features.header)
}
}
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 {
PurchasedView()
.withMockEnvironment()