post rebase fix-ups

This commit is contained in:
Jackson Harper 2023-11-30 17:58:13 +08:00
parent b6c8b1ba73
commit 1bff4cbd18
9 changed files with 65 additions and 115 deletions

View file

@ -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<NSFetchRequestResult>) {
setItems(controller.managedObjectContext, controller.fetchedObjects as? [Models.LibraryItem] ?? [])
}

View file

@ -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")
}
}

View file

@ -43,10 +43,7 @@ struct AnimatingCellHeight: AnimatableModifier {
@ObservedObject var viewModel: HomeFeedViewModel
@State private var selection = Set<String>()
@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)

View file

@ -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

View file

@ -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)

View file

@ -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
}

View file

@ -11,7 +11,7 @@ import SwiftUI
struct LibraryListView: View {
@StateObject private var libraryViewModel = HomeFeedViewModel(
fetcher: InboxFetcher(),
fetcher: LibraryItemFetcher(),
listConfig: LibraryListConfig(
hasFeatureCards: true,
leadingSwipeActions: [.pin],

View file

@ -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)
}

View file

@ -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