From 04e2d3ec92fe685d353b94bd38eb453084773236 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Thu, 2 Jun 2022 11:30:06 -0700 Subject: [PATCH 1/2] add chip to change sort order of linked items --- .../App/Views/Home/HomeFeedViewIOS.swift | 17 +++++- .../App/Views/Home/HomeFeedViewModel.swift | 9 ++- .../Sources/Models/LinkedItemSort.swift | 57 +++++++++++++++++++ .../OmnivoreKit/Sources/Views/TextChip.swift | 2 +- 4 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index b65ab143f..b2dabb0e6 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -49,6 +49,9 @@ import Views .onChange(of: viewModel.appliedFilter) { _ in loadItems(isRefresh: true) } + .onChange(of: viewModel.appliedSort) { _ in + loadItems(isRefresh: true) + } .sheet(item: $viewModel.itemUnderLabelEdit) { item in ApplyLabelsView(mode: .item(item), onSave: nil) } @@ -156,11 +159,23 @@ import Views } }, label: { - TextChipButton.makeFilterButton( + TextChipButton.makeMenuButton( title: LinkedItemFilter(rawValue: viewModel.appliedFilter)?.displayName ?? "Filter" ) } ) + Menu( + content: { + ForEach(LinkedItemSort.allCases, id: \.self) { sort in + Button(sort.displayName, action: { viewModel.appliedSort = sort.rawValue }) + } + }, + label: { + TextChipButton.makeMenuButton( + title: LinkedItemSort(rawValue: viewModel.appliedSort)?.displayName ?? "Sort" + ) + } + ) TextChipButton.makeAddLabelButton { showLabelsSheet = true } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index 8b2db340f..247ccf7db 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -22,9 +22,10 @@ import Views @Published var selectedLinkItem: NSManagedObjectID? @Published var linkRequest: LinkRequest? @Published var showLoadingBar = false + @Published var appliedFilter = LinkedItemFilter.inbox.rawValue + @Published var appliedSort = LinkedItemSort.newest.rawValue @AppStorage(UserDefaultKey.lastSelectedLinkedItemFilter.rawValue) - var appliedFilter = LinkedItemFilter.inbox.rawValue var cursor: String? @@ -111,7 +112,6 @@ import Views private var fetchRequest: NSFetchRequest { let fetchRequest: NSFetchRequest = LinkedItem.fetchRequest() - fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false)] var subPredicates = [NSPredicate]() @@ -142,6 +142,8 @@ import Views } fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: subPredicates) + fetchRequest.sortDescriptors = (LinkedItemSort(rawValue: appliedSort) ?? .newest).sortDescriptors + return fetchRequest } @@ -197,7 +199,8 @@ import Views private var searchQuery: String { let filter = LinkedItemFilter(rawValue: appliedFilter) ?? .inbox - var query = "\(filter.queryString)" + let sort = LinkedItemSort(rawValue: appliedSort) ?? .newest + var query = "\(filter.queryString) \(sort.queryString)" if !searchTerm.isEmpty { query.append(" \(searchTerm)") diff --git a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift new file mode 100644 index 000000000..40057681c --- /dev/null +++ b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift @@ -0,0 +1,57 @@ +import Foundation + +public enum LinkedItemSort: String, CaseIterable { + case newest + case oldest + case recentlyRead + case recentlyPublished + case relevance +} + +public extension LinkedItemSort { + var displayName: String { + switch self { + case .newest: + return "Newest" + case .oldest: + return "Oldest" + case .recentlyRead: + return "Recently Read" + case .recentlyPublished: + return "Recently Published" + case .relevance: + return "Relevance" + } + } + + var queryString: String { + switch self { + case .newest: + return "sort:saved" + case .oldest: + return "sort:saved-ASC" + case .recentlyRead: + return "sort:updated" + case .recentlyPublished: + return "sort:published" + case .relevance: + return "relevance" + } + } + + var sortDescriptors: [NSSortDescriptor] { + switch self { + case .newest, .relevance: + return [NSSortDescriptor(keyPath: \LinkedItem.createdAt, ascending: false)] + case .oldest: + return [NSSortDescriptor(keyPath: \LinkedItem.createdAt, ascending: true)] + case .recentlyRead: + return [ + NSSortDescriptor(keyPath: \LinkedItem.readingProgress, ascending: false), + NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false) + ] + case .recentlyPublished: + return [NSSortDescriptor(keyPath: \LinkedItem.publishDate, ascending: false)] + } + } +} diff --git a/apple/OmnivoreKit/Sources/Views/TextChip.swift b/apple/OmnivoreKit/Sources/Views/TextChip.swift index cd0a339fa..0c97765db 100644 --- a/apple/OmnivoreKit/Sources/Views/TextChip.swift +++ b/apple/OmnivoreKit/Sources/Views/TextChip.swift @@ -42,7 +42,7 @@ public struct TextChipButton: View { TextChipButton(title: "Labels", color: .systemGray6, actionType: .show, negated: false, onTap: onTap) } - public static func makeFilterButton(title: String) -> TextChipButton { + public static func makeMenuButton(title: String) -> TextChipButton { TextChipButton(title: title, color: .systemGray6, actionType: .show, negated: false, onTap: {}) } From 44fc0e63bd3759f758f08d9d34df8078319a3f70 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Thu, 2 Jun 2022 11:34:29 -0700 Subject: [PATCH 2/2] use savedAt to sort by recently read --- apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift index 40057681c..d03f3e380 100644 --- a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift +++ b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift @@ -46,10 +46,7 @@ public extension LinkedItemSort { case .oldest: return [NSSortDescriptor(keyPath: \LinkedItem.createdAt, ascending: true)] case .recentlyRead: - return [ - NSSortDescriptor(keyPath: \LinkedItem.readingProgress, ascending: false), - NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false) - ] + return [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false)] case .recentlyPublished: return [NSSortDescriptor(keyPath: \LinkedItem.publishDate, ascending: false)] }