Add Pinned filter, improve animation

This commit is contained in:
Jackson Harper
2023-04-05 14:44:29 +08:00
parent 8c02168710
commit 1c72007bf6
2 changed files with 48 additions and 35 deletions

View File

@ -372,23 +372,17 @@ struct AnimatingCellHeight: AnimatableModifier {
VStack(alignment: .leading, spacing: 20) {
Menu(content: {
Button(action: {
withoutAnimation {
viewModel.updateFeatureFilter(.continueReading)
}
viewModel.updateFeatureFilter(.continueReading)
}, label: {
Text("Continue Reading")
})
// Button(action: {
// withoutAnimation {
// viewModel.updateFeatureFilter(.recommended)
// }
// }, label: {
// Text("Recommended")
// })
Button(action: {
withoutAnimation {
viewModel.updateFeatureFilter(.newsletters)
}
viewModel.updateFeatureFilter(.pinned)
}, label: {
Text("Pinned")
})
Button(action: {
viewModel.updateFeatureFilter(.newsletters)
}, label: {
Text("Newsletters")
})
@ -402,31 +396,34 @@ struct AnimatingCellHeight: AnimatableModifier {
Text(viewModel.featureFilter.title.uppercased())
.font(Font.system(size: 14, weight: .regular))
Image(systemName: "chevron.down")
}
}.frame(maxWidth: .infinity, alignment: .leading)
})
.padding(.top, 20)
.padding(.bottom, 0)
ScrollView(.horizontal, showsIndicators: false) {
if viewModel.featureItems.count > 0 {
LazyHStack(alignment: .top, spacing: 20) {
ForEach(viewModel.featureItems) { item in
LibraryFeatureCardNavigationLink(item: item, viewModel: viewModel)
.background(
RoundedRectangle(cornerRadius: 12) // << tune as needed
.fill(Color(UIColor.systemBackground)) // << fill with system color
)
GeometryReader { geo in
ScrollView(.horizontal, showsIndicators: false) {
if viewModel.featureItems.count > 0 {
LazyHStack(alignment: .top, spacing: 20) {
ForEach(viewModel.featureItems) { item in
LibraryFeatureCardNavigationLink(item: item, viewModel: viewModel)
.background(
RoundedRectangle(cornerRadius: 12) // << tune as needed
.fill(Color(UIColor.systemBackground)) // << fill with system color
)
}
}
}.padding(0)
} else {
Text(viewModel.featureFilter.emptyMessage)
.font(Font.system(size: 14, weight: .regular))
.foregroundColor(Color(hex: "#898989"))
.frame(height: 60, alignment: .topLeading)
} else {
Text(viewModel.featureFilter.emptyMessage)
.font(Font.system(size: 14, weight: .regular))
.foregroundColor(Color(hex: "#898989"))
.frame(maxWidth: geo.size.width)
.frame(height: 60, alignment: .topLeading)
.fixedSize(horizontal: false, vertical: true)
}
}
}
// .frame(height: viewModel.featureItems.count > 0 ? 160 : 60, alignment: .topLeading)
.padding(.top, 0)
Text((LinkedItemFilter(rawValue: viewModel.appliedFilter)?.displayName ?? "Inbox").uppercased())
.font(Font.system(size: 14, weight: .regular))
@ -457,7 +454,7 @@ struct AnimatingCellHeight: AnimatableModifier {
if !viewModel.hideFeatureSection, viewModel.items.count > 0 {
featureCard
.listRowInsets(.init(top: 0, leading: 10, bottom: 10, trailing: 10))
.modifier(AnimatingCellHeight(height: viewModel.featureItems.count > 0 ? 260 : 80))
.modifier(AnimatingCellHeight(height: viewModel.featureItems.count > 0 ? 260 : 130))
}
ForEach(viewModel.items) { item in

View File

@ -94,6 +94,7 @@ public enum FeaturedItemFilter: String, CaseIterable {
case continueReading
case recommended
case newsletters
case pinned
}
public extension FeaturedItemFilter {
@ -110,6 +111,8 @@ public extension FeaturedItemFilter {
switch self {
case .continueReading:
return "Your recently read items will appear here."
case .pinned:
return "Create a label named Pinned and add it to items you'd like to appear here"
case .recommended:
return "Reads recommended in your Clubs will appear here."
case .newsletters:
@ -131,19 +134,32 @@ public extension FeaturedItemFilter {
let continueReadingPredicate = NSPredicate(
format: "readingProgress > 1 AND readingProgress < 100 AND readAt != nil"
)
return NSCompoundPredicate(andPredicateWithSubpredicates: [continueReadingPredicate, undeletedPredicate, notInArchivePredicate])
return NSCompoundPredicate(andPredicateWithSubpredicates: [
continueReadingPredicate, undeletedPredicate, notInArchivePredicate
])
case .pinned:
let newsletterLabelPredicate = NSPredicate(
format: "SUBQUERY(labels, $label, $label.name == \"Pinned\").@count > 0"
)
return NSCompoundPredicate(andPredicateWithSubpredicates: [
notInArchivePredicate, undeletedPredicate, newsletterLabelPredicate
])
case .newsletters:
// non-archived or deleted items with the Newsletter label
let newsletterLabelPredicate = NSPredicate(
format: "SUBQUERY(labels, $label, $label.name == \"Newsletter\").@count > 0"
)
return NSCompoundPredicate(andPredicateWithSubpredicates: [notInArchivePredicate, undeletedPredicate, newsletterLabelPredicate])
return NSCompoundPredicate(andPredicateWithSubpredicates: [
notInArchivePredicate, undeletedPredicate, newsletterLabelPredicate
])
case .recommended:
// non-archived or deleted items with the Newsletter label
let recommendedPredicate = NSPredicate(
format: "recommendations.@count > 0"
)
return NSCompoundPredicate(andPredicateWithSubpredicates: [notInArchivePredicate, undeletedPredicate, recommendedPredicate])
return NSCompoundPredicate(andPredicateWithSubpredicates: [
notInArchivePredicate, undeletedPredicate, recommendedPredicate
])
}
}