Empty state handling for feature section
This commit is contained in:
@ -72,7 +72,7 @@ struct HighlightListItemParams: Identifiable {
|
||||
}
|
||||
|
||||
private func loadHighlights(item: LinkedItem) {
|
||||
let unsortedHighlights = item.highlights.asArray(of: Highlight.self)
|
||||
let unsortedHighlights = item.highlights.asArray(of: Highlight.self).filter { $0.type == "HIGHLIGHT" }
|
||||
|
||||
let highlights = unsortedHighlights.sorted { left, right in
|
||||
if left.positionPercent > 0, right.positionPercent > 0 {
|
||||
|
||||
@ -358,22 +358,24 @@ import Views
|
||||
VStack(alignment: .leading, spacing: 20) {
|
||||
Menu(content: {
|
||||
Button(action: {
|
||||
viewModel.featureFilter = .continueReading
|
||||
viewModel.updateFeatureFilter(.continueReading)
|
||||
}, label: {
|
||||
Text("Continue Reading")
|
||||
})
|
||||
Button(action: {
|
||||
viewModel.featureFilter = .recommended
|
||||
viewModel.updateFeatureFilter(.recommended)
|
||||
}, label: {
|
||||
Text("Recommended")
|
||||
// Label("Recommended", systemImage: "x.circle")
|
||||
})
|
||||
Button(action: {
|
||||
viewModel.featureFilter = .newsletters
|
||||
viewModel.updateFeatureFilter(.newsletters)
|
||||
}, label: {
|
||||
Text("Newsletters")
|
||||
|
||||
// Label("Newsletters", systemImage: "x.circle")
|
||||
})
|
||||
Button(action: {
|
||||
// viewModel.updateFeatureFilter(.newsletters)
|
||||
}, label: {
|
||||
Text("Hide Feature Section")
|
||||
})
|
||||
}, label: {
|
||||
HStack(alignment: .center) {
|
||||
@ -385,14 +387,18 @@ import Views
|
||||
.padding(.top, 20)
|
||||
.padding(.bottom, 0)
|
||||
|
||||
ScrollView(.horizontal, showsIndicators: false) {
|
||||
LazyHStack(alignment: .top, spacing: 20) {
|
||||
ForEach(viewModel.featureItems) { item in
|
||||
LibraryFeatureCardNavigationLink(item: item, viewModel: viewModel)
|
||||
}
|
||||
}.padding(0)
|
||||
if viewModel.featureItems.count > 0 {
|
||||
ScrollView(.horizontal, showsIndicators: false) {
|
||||
LazyHStack(alignment: .top, spacing: 20) {
|
||||
ForEach(viewModel.featureItems) { item in
|
||||
LibraryFeatureCardNavigationLink(item: item, viewModel: viewModel)
|
||||
}
|
||||
}.padding(0)
|
||||
}
|
||||
.padding(.top, 0)
|
||||
} else {
|
||||
Text(viewModel.featureFilter.emptyMessage)
|
||||
}
|
||||
.padding(.top, 0)
|
||||
|
||||
Text((LinkedItemFilter(rawValue: viewModel.appliedFilter)?.displayName ?? "Inbox").uppercased())
|
||||
.font(Font.system(size: 14, weight: .medium))
|
||||
@ -419,7 +425,8 @@ import Views
|
||||
filtersHeader
|
||||
.listRowInsets(.init(top: 0, leading: 10, bottom: 10, trailing: 10))
|
||||
|
||||
if viewModel.featureItems.count > 0 {
|
||||
// Only show the feature card section if we have items loaded
|
||||
if viewModel.items.count > 0 {
|
||||
featureCard
|
||||
.listRowInsets(.init(top: 0, leading: 10, bottom: 10, trailing: 10))
|
||||
}
|
||||
|
||||
@ -45,17 +45,22 @@ import Views
|
||||
|
||||
var syncCursor: String?
|
||||
|
||||
@AppStorage(UserDefaultKey.hideFeatureSection.rawValue) var hideFeatureSection = false
|
||||
@AppStorage(UserDefaultKey.lastSelectedLinkedItemFilter.rawValue) var appliedFilter = LinkedItemFilter.inbox.rawValue
|
||||
|
||||
func setItems(_ items: [LinkedItem]) {
|
||||
self.items = items
|
||||
updateFeatureFilter(featureFilter)
|
||||
}
|
||||
|
||||
func updateFeatureFilter(_ filter: FeaturedItemFilter) {
|
||||
// now try to update the continue reading items:
|
||||
featureItems = (items.filter { item in
|
||||
featureFilter.predicate.evaluate(with: item)
|
||||
filter.predicate.evaluate(with: item)
|
||||
} as NSArray)
|
||||
.sortedArray(using: [featureFilter.sortDescriptor])
|
||||
.sortedArray(using: [filter.sortDescriptor])
|
||||
.compactMap { $0 as? LinkedItem }
|
||||
featureFilter = filter
|
||||
}
|
||||
|
||||
func handleReaderItemNotification(objectID: NSManagedObjectID, dataService: DataService) {
|
||||
|
||||
@ -106,6 +106,17 @@ public extension FeaturedItemFilter {
|
||||
}
|
||||
}
|
||||
|
||||
var emptyMessage: String {
|
||||
switch self {
|
||||
case .continueReading:
|
||||
return "Your recently read items will appear here."
|
||||
case .recommended:
|
||||
return "Reads recommended in your Clubs will appear here."
|
||||
case .newsletters:
|
||||
return "All your Newsletters will appear here."
|
||||
}
|
||||
}
|
||||
|
||||
var predicate: NSPredicate {
|
||||
let undeletedPredicate = NSPredicate(
|
||||
format: "%K != %i", #keyPath(LinkedItem.serverSyncStatus), Int64(ServerSyncStatus.needsDeletion.rawValue)
|
||||
|
||||
@ -30,4 +30,5 @@ public enum UserDefaultKey: String {
|
||||
case deviceTokenID
|
||||
case shouldPromptCommunityModal
|
||||
case userWordsPerMinute
|
||||
case hideFeatureSection
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user