From 1bff4cbd184a25f795d088fe74ce57da10dd0757 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Thu, 30 Nov 2023 17:58:13 +0800 Subject: [PATCH] post rebase fix-ups --- ...Fetcher.swift => LibraryItemFetcher.swift} | 27 +++--------- .../App/Views/Home/FetcherFilterState.swift | 29 +++++++++++++ .../App/Views/Home/HomeFeedViewIOS.swift | 18 +++----- .../App/Views/Home/HomeFeedViewModel.swift | 9 ---- .../Sources/App/Views/Home/HomeView.swift | 6 ++- .../App/Views/Home/LibraryItemFetcher.swift | 43 ------------------- .../App/Views/Home/LibraryListView.swift | 2 +- .../Sources/App/Views/LibraryTabView.swift | 42 ++++++++---------- .../Sources/Utils/UserDefaultKeys.swift | 4 +- 9 files changed, 65 insertions(+), 115 deletions(-) rename apple/OmnivoreKit/Sources/App/Views/Home/Components/{InboxFetcher.swift => LibraryItemFetcher.swift} (93%) create mode 100644 apple/OmnivoreKit/Sources/App/Views/Home/FetcherFilterState.swift delete mode 100644 apple/OmnivoreKit/Sources/App/Views/Home/LibraryItemFetcher.swift diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/InboxFetcher.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift similarity index 93% rename from apple/OmnivoreKit/Sources/App/Views/Home/Components/InboxFetcher.swift rename to apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift index 5394b2a8d..5b1471abc 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/InboxFetcher.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/LibraryItemFetcher.swift @@ -1,9 +1,3 @@ -// -// InboxFetcher.swift -// -// -// Created by Jackson Harper on 11/16/23. -// import Foundation @@ -14,8 +8,8 @@ import SwiftUI import Utils import Views -@MainActor final class InboxFetcher: NSObject, ObservableObject, LibraryItemFetcher { - var folder = "inbox" +@MainActor final class LibraryItemFetcher: NSObject, ObservableObject { + let folder = "inbox" @Published var items = [Models.LibraryItem]() var itemsPublisher: Published<[Models.LibraryItem]>.Publisher { $items } @@ -165,7 +159,7 @@ import Views var subPredicates = [NSPredicate]() let folderPredicate = NSPredicate( - format: "%K == %@", #keyPath(Models.LibraryItem.folder), folder + format: "%K == %@", #keyPath(Models.LibraryItem.folder), filterState.folder ) subPredicates.append(folderPredicate) @@ -220,22 +214,11 @@ import Views setItems(dataService.viewContext, fetchedResultsController.fetchedObjects ?? []) } - private func queryContainsFilter(_ filterState: FetcherFilterState) -> Bool { - if filterState.searchTerm.contains("in:inbox") || - filterState.searchTerm.contains("in:all") || - filterState.searchTerm.contains("in:archive") - { - return true - } - - return false - } - private func searchQuery(_ filterState: FetcherFilterState) -> String { let sort = LinkedItemSort(rawValue: filterState.appliedSort) ?? .newest var query = sort.queryString - if !queryContainsFilter(filterState), let queryString = filterState.appliedFilter?.filter { + if let queryString = filterState.appliedFilter?.filter { query = "\(queryString) \(sort.queryString)" } @@ -269,7 +252,7 @@ import Views } } -extension InboxFetcher: NSFetchedResultsControllerDelegate { +extension LibraryItemFetcher: NSFetchedResultsControllerDelegate { func controllerDidChangeContent(_ controller: NSFetchedResultsController) { setItems(controller.managedObjectContext, controller.fetchedObjects as? [Models.LibraryItem] ?? []) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/FetcherFilterState.swift b/apple/OmnivoreKit/Sources/App/Views/Home/FetcherFilterState.swift new file mode 100644 index 000000000..15c1d8d0c --- /dev/null +++ b/apple/OmnivoreKit/Sources/App/Views/Home/FetcherFilterState.swift @@ -0,0 +1,29 @@ +import Foundation +import Models +import Services +import SwiftUI +import Utils + +@MainActor +class FetcherFilterState: ObservableObject { + let folder: String + + @Published var searchTerm = "" + @Published var selectedLabels = [LinkedItemLabel]() + @Published var negatedLabels = [LinkedItemLabel]() + + @Published var appliedSort = LinkedItemSort.newest.rawValue + + @Published var appliedFilter: InternalFilter? { + didSet { + let newValue = appliedFilter?.name.lowercased() + UserDefaults.standard.setValue(newValue, forKey: "lastSelected-\(folder)-filter") + } + } + + init(folder: String) { + self.folder = folder + let newValue = appliedFilter?.name.lowercased() + let appliedFilterKey = UserDefaults.standard.string(forKey: "lastSelected-\(folder)-filter") + } +} diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index 86f294e6f..599322e89 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -43,10 +43,7 @@ struct AnimatingCellHeight: AnimatableModifier { @ObservedObject var viewModel: HomeFeedViewModel @State private var selection = Set() - @ObservedObject var filterState = FetcherFilterState( - appliedFilterName: UserDefaults.standard.string(forKey: UserDefaultKey.lastSelectedLinkedItemFilter.rawValue) ?? - LinkedItemFilter.inbox.rawValue - ) + @ObservedObject var filterState: FetcherFilterState func loadItems(isRefresh: Bool) { Task { await viewModel.loadItems(dataService: dataService, filterState: filterState, isRefresh: isRefresh) } @@ -58,10 +55,8 @@ struct AnimatingCellHeight: AnimatableModifier { viewModel.fetcher.items.count > 0 && filterState.searchTerm.isEmpty && filterState.selectedLabels.isEmpty && - filterState.negatedLabels.isEmpty - // MERGE TODO - // && -// viewModel.appliedFilterName == "inbox" + filterState.negatedLabels.isEmpty && + filterState.appliedFilter?.name == "inbox" } var body: some View { @@ -95,11 +90,8 @@ struct AnimatingCellHeight: AnimatableModifier { .onChange(of: filterState.appliedSort) { _ in loadItems(isRefresh: true) } - .sheet(item: $viewModel.itemUnderLabelEdit) { _ in - NavigationView { - BriefingView() - } - // ApplyLabelsView(mode: .item(item), onSave: nil) + .sheet(item: $viewModel.itemUnderLabelEdit) { item in + ApplyLabelsView(mode: .item(item), onSave: nil) } .sheet(item: $viewModel.itemUnderTitleEdit) { item in LinkedItemMetadataEditView(item: item) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index a0dd184b2..576e90994 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -37,15 +37,6 @@ import Views @Published var filters = [InternalFilter]() - var cursor: String? - - // These are used to make sure we handle search result - // responses in the right order - var searchIdx = 0 - var receivedIdx = 0 - - var syncCursor: String? - @AppStorage(UserDefaultKey.hideFeatureSection.rawValue) var hideFeatureSection = false @AppStorage(UserDefaultKey.lastSelectedFeaturedItemFilter.rawValue) var featureFilter = FeaturedItemFilter.continueReading.rawValue diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeView.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeView.swift index 5fa1372c1..f3eb86b1c 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeView.swift @@ -6,13 +6,17 @@ import Views struct HomeView: View { @State private var viewModel: HomeFeedViewModel + let inboxFilterState = FetcherFilterState( + folder: "inbox" + ) + init(viewModel: HomeFeedViewModel) { self.viewModel = viewModel } var body: some View { #if os(iOS) - HomeFeedContainerView(viewModel: viewModel) + HomeFeedContainerView(viewModel: viewModel, filterState: inboxFilterState) #elseif os(macOS) HomeFeedView(viewModel: viewModel) .frame(minWidth: 320) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/LibraryItemFetcher.swift b/apple/OmnivoreKit/Sources/App/Views/Home/LibraryItemFetcher.swift deleted file mode 100644 index 44ea54c1e..000000000 --- a/apple/OmnivoreKit/Sources/App/Views/Home/LibraryItemFetcher.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// File.swift -// -// -// Created by Jackson Harper on 11/16/23. -// - -import Foundation -import Models -import Services -import SwiftUI -import Utils - -@MainActor -class FetcherFilterState: ObservableObject { - @Published var searchTerm = "" - @Published var selectedLabels = [LinkedItemLabel]() - @Published var negatedLabels = [LinkedItemLabel]() - - @Published var appliedSort = LinkedItemSort.newest.rawValue - - @AppStorage(UserDefaultKey.lastSelectedLinkedItemFilter.rawValue) var appliedFilterName = "inbox" - @Published var appliedFilter: InternalFilter? { - didSet { - appliedFilterName = appliedFilter?.name.lowercased() ?? "inbox" - } - } - - init(appliedFilterName: String) { - self.appliedFilterName = appliedFilterName - } -} - -@MainActor -protocol LibraryItemFetcher { - var folder: String { get } - - var items: [Models.LibraryItem] { get } - var itemsPublisher: Published<[Models.LibraryItem]>.Publisher { get } - - func loadItems(dataService: DataService, filterState: FetcherFilterState, isRefresh: Bool) async - func loadMoreItems(dataService: DataService, filterState: FetcherFilterState, isRefresh: Bool) async -} diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/LibraryListView.swift b/apple/OmnivoreKit/Sources/App/Views/Home/LibraryListView.swift index 43c9da2f8..c28104145 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/LibraryListView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/LibraryListView.swift @@ -11,7 +11,7 @@ import SwiftUI struct LibraryListView: View { @StateObject private var libraryViewModel = HomeFeedViewModel( - fetcher: InboxFetcher(), + fetcher: LibraryItemFetcher(), listConfig: LibraryListConfig( hasFeatureCards: true, leadingSwipeActions: [.pin], diff --git a/apple/OmnivoreKit/Sources/App/Views/LibraryTabView.swift b/apple/OmnivoreKit/Sources/App/Views/LibraryTabView.swift index 6af409c87..b2e8ce2e1 100644 --- a/apple/OmnivoreKit/Sources/App/Views/LibraryTabView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/LibraryTabView.swift @@ -10,20 +10,21 @@ import Models import PopupView import Services import SwiftUI +import Utils import Views @MainActor struct LibraryTabView: View { @EnvironmentObject var dataService: DataService + @AppStorage(UserDefaultKey.lastSelectedTabItem.rawValue) var selectedTab = "inbox" @MainActor public init() { UITabBar.appearance().isHidden = true - UITabBar.appearance().backgroundColor = UIColor(Color.themeTabBarColor) } @StateObject private var followingViewModel = HomeFeedViewModel( - fetcher: InboxFetcher(), + fetcher: LibraryItemFetcher(), listConfig: LibraryListConfig( hasFeatureCards: false, leadingSwipeActions: [.moveToInbox], @@ -33,7 +34,7 @@ struct LibraryTabView: View { ) @StateObject private var libraryViewModel = HomeFeedViewModel( - fetcher: InboxFetcher(), + fetcher: LibraryItemFetcher(), listConfig: LibraryListConfig( hasFeatureCards: true, leadingSwipeActions: [.pin], @@ -42,38 +43,29 @@ struct LibraryTabView: View { ) ) - @StateObject private var highlightsViewModel = HomeFeedViewModel( - fetcher: InboxFetcher(), - listConfig: LibraryListConfig( - hasFeatureCards: true, - leadingSwipeActions: [.pin], - trailingSwipeActions: [.archive, .delete], - cardStyle: .highlights - ) - ) - - @State var selectedTab = "following" - var body: some View { VStack(spacing: 0) { TabView(selection: $selectedTab) { NavigationView { - HomeView(viewModel: followingViewModel) - .navigationViewStyle(.stack) - } - .tag("following") + HomeFeedContainerView( + viewModel: followingViewModel, + filterState: FetcherFilterState(folder: "following") + ) + .navigationViewStyle(.stack) + }.tag("following") NavigationView { - HomeView(viewModel: libraryViewModel) - .navigationViewStyle(.stack) - } - .tag("inbox") + HomeFeedContainerView( + viewModel: libraryViewModel, + filterState: FetcherFilterState(folder: "inbox") + ) + .navigationViewStyle(.stack) + }.tag("inbox") NavigationView { ProfileView() .navigationViewStyle(.stack) - } - .tag("profile") + }.tag("profile") } CustomTabBar(selectedTab: $selectedTab) } diff --git a/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift b/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift index cc5734cc6..25959090d 100644 --- a/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift +++ b/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift @@ -11,7 +11,9 @@ public enum UserDefaultKey: String { case userHasDeniedPushPrimer case firebasePushToken case homeFeedlayoutPreference - case lastSelectedLinkedItemFilter + case lastSelectedTabItem + case lastSelectedInboxFilter + case lastSelectedFollowingFilter case lastSelectedFeaturedItemFilter case lastUsedAppVersion case lastUsedAppBuildNumber