From 2919b7d7ce1f1fa09fa178a81f07ab5907447f58 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 9 Jan 2024 10:24:25 +0800 Subject: [PATCH] Improve the iOS filters when following tab is disabled --- .../Home/Components/LibraryItemFetcher.swift | 17 +++++++---- .../App/Views/Home/HomeFeedViewIOS.swift | 4 +-- .../InternalModels/InternalFilter.swift | 30 ++++++++----------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift index 23027e2b8..76189ca1b 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift @@ -164,10 +164,13 @@ import Views var subPredicates = [NSPredicate]() - let folderPredicate = NSPredicate( - format: "%K == %@", #keyPath(Models.LibraryItem.folder), filterState.folder - ) - subPredicates.append(folderPredicate) + // TODO: FOLLOWING MIGRATION: invert this once the following migration has completed + if !UserDefaults.standard.bool(forKey: "LibraryTabView::hideFollowingTab") { + let folderPredicate = NSPredicate( + format: "%K == %@", #keyPath(Models.LibraryItem.folder), filterState.folder + ) + subPredicates.append(folderPredicate) + } if let predicate = filterState.appliedFilter?.predicate { subPredicates.append(predicate) @@ -255,7 +258,11 @@ import Views }.joined(separator: ",")) } - query.append(" use:folders") + // TODO: FOLLOWING MIGRATION: invert this once the following migration has completed + if !UserDefaults.standard.bool(forKey: "LibraryTabView::hideFollowingTab") { + query.append(" use:folders") + } + print("QUERY: `\(query)`") return query diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index 991879fee..52995797c 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -19,10 +19,10 @@ struct FiltersHeader: View { viewModel.searchTerm = "" }.frame(maxWidth: reader.size.width * 0.66) } else { - // if UIDevice.isIPhone { + let hideFollowingTab = UserDefaults.standard.bool(forKey: "LibraryTabView::hideFollowingTab") Menu( content: { - ForEach(viewModel.filters.filter { $0.folder == viewModel.currentFolder }) { filter in + ForEach(viewModel.filters.filter { hideFollowingTab || $0.folder == viewModel.currentFolder }) { filter in Button(filter.name, action: { viewModel.appliedFilter = filter }) diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalFilter.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalFilter.swift index 0b3576e6d..a49d9d2d9 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalFilter.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalFilter.swift @@ -209,9 +209,6 @@ public struct InternalFilter: Encodable, Identifiable, Hashable, Equatable { } public var predicate: NSPredicate? { - let folderPredicate = NSPredicate( - format: "%K == %@", #keyPath(Models.LibraryItem.folder), folder - ) let undeletedPredicate = NSPredicate( format: "%K != %i AND %K != \"DELETED\"", #keyPath(Models.LibraryItem.serverSyncStatus), Int64(ServerSyncStatus.needsDeletion.rawValue), @@ -226,16 +223,16 @@ public struct InternalFilter: Encodable, Identifiable, Hashable, Equatable { let feedLabelPredicate = NSPredicate( format: "SUBQUERY(labels, $label, $label.name == \"RSS\").@count > 0" ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, notInArchivePredicate, undeletedPredicate, feedLabelPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [notInArchivePredicate, undeletedPredicate, feedLabelPredicate]) case "Following": - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, notInArchivePredicate, undeletedPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [notInArchivePredicate, undeletedPredicate]) case "Inbox": - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate, notInArchivePredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, notInArchivePredicate]) case "Unread": let isUnread = NSPredicate( format: "readAt == nil" ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate, notInArchivePredicate, isUnread]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, notInArchivePredicate, isUnread]) case "Non-Feed Items": // non-archived or deleted items without the Newsletter label let nonNewsletterLabelPredicate = NSPredicate( @@ -245,7 +242,7 @@ public struct InternalFilter: Encodable, Identifiable, Hashable, Equatable { format: "NOT SUBQUERY(labels, $label, $label.name == \"RSS\") .@count > 0" ) return NSCompoundPredicate(andPredicateWithSubpredicates: [ - folderPredicate, undeletedPredicate, notInArchivePredicate, nonNewsletterLabelPredicate, nonRSSPredicate + undeletedPredicate, notInArchivePredicate, nonNewsletterLabelPredicate, nonRSSPredicate ]) case "Downloaded": // include pdf only @@ -259,51 +256,50 @@ public struct InternalFilter: Encodable, Identifiable, Hashable, Equatable { format: "localPDF.length > 0" ) let downloadedPDF = NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, isPDFPredicate, localPDFURL]) - return NSCompoundPredicate(orPredicateWithSubpredicates: [folderPredicate, hasHTMLContent, downloadedPDF]) + return NSCompoundPredicate(orPredicateWithSubpredicates: [hasHTMLContent, downloadedPDF]) 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: [folderPredicate, undeletedPredicate, notInArchivePredicate, newsletterLabelPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, notInArchivePredicate, newsletterLabelPredicate]) case "Feeds": let feedLabelPredicate = NSPredicate( format: "SUBQUERY(labels, $label, $label.name == \"RSS\").@count > 0" ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate, notInArchivePredicate, feedLabelPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, notInArchivePredicate, feedLabelPredicate]) case "Recommended": // non-archived or deleted items with the Newsletter label let recommendedPredicate = NSPredicate( format: "recommendations.@count > 0" ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate, notInArchivePredicate, recommendedPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, notInArchivePredicate, recommendedPredicate]) case "All": // include everything undeleted - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate]) case "Archived": let inArchivePredicate = NSPredicate( format: "%K == %@", #keyPath(Models.LibraryItem.isArchived), Int(truncating: true) as NSNumber ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate, inArchivePredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, inArchivePredicate]) case "Deleted": let deletedPredicate = NSPredicate( format: "%K == %i OR %K == \"DELETED\"", #keyPath(Models.LibraryItem.serverSyncStatus), Int64(ServerSyncStatus.needsDeletion.rawValue), #keyPath(Models.LibraryItem.state) ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, deletedPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [deletedPredicate]) case "Files": // include pdf only let isPDFPredicate = NSPredicate( format: "%K == %@", #keyPath(Models.LibraryItem.contentReader), "PDF" ) - return NSCompoundPredicate(andPredicateWithSubpredicates: [folderPredicate, undeletedPredicate, isPDFPredicate]) + return NSCompoundPredicate(andPredicateWithSubpredicates: [undeletedPredicate, isPDFPredicate]) case "Highlights": let hasHighlightsPredicate = NSPredicate( format: "highlights.@count > 0" ) return NSCompoundPredicate(andPredicateWithSubpredicates: [ - folderPredicate, undeletedPredicate, hasHighlightsPredicate ])