From de524736e2e25fd093f785bd3495cff8ec8e65f3 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Wed, 5 Apr 2023 10:40:08 +0800 Subject: [PATCH] Empty state handling for feature section --- .../Highlights/HighlightsListViewModel.swift | 2 +- .../App/Views/Home/HomeFeedViewIOS.swift | 35 +++++++++++-------- .../App/Views/Home/HomeFeedViewModel.swift | 9 +++-- .../Sources/Models/LinkedItemFilter.swift | 11 ++++++ .../Sources/Utils/UserDefaultKeys.swift | 1 + 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListViewModel.swift index 29580ffb2..77e8c6320 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Highlights/HighlightsListViewModel.swift @@ -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 { diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index 44794951d..bc4179903 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -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)) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index 0198d9531..1cce837f2 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -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) { diff --git a/apple/OmnivoreKit/Sources/Models/LinkedItemFilter.swift b/apple/OmnivoreKit/Sources/Models/LinkedItemFilter.swift index 3fa38dca5..c6de81a24 100644 --- a/apple/OmnivoreKit/Sources/Models/LinkedItemFilter.swift +++ b/apple/OmnivoreKit/Sources/Models/LinkedItemFilter.swift @@ -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) diff --git a/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift b/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift index 0f3c956cf..5a6e62344 100644 --- a/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift +++ b/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift @@ -30,4 +30,5 @@ public enum UserDefaultKey: String { case deviceTokenID case shouldPromptCommunityModal case userWordsPerMinute + case hideFeatureSection }