mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
post rebase fix-ups
This commit is contained in:
parent
b6c8b1ba73
commit
1bff4cbd18
9 changed files with 65 additions and 115 deletions
|
|
@ -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] ?? [])
|
||||
}
|
||||
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ import SwiftUI
|
|||
|
||||
struct LibraryListView: View {
|
||||
@StateObject private var libraryViewModel = HomeFeedViewModel(
|
||||
fetcher: InboxFetcher(),
|
||||
fetcher: LibraryItemFetcher(),
|
||||
listConfig: LibraryListConfig(
|
||||
hasFeatureCards: true,
|
||||
leadingSwipeActions: [.pin],
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue