mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
move searchQuery state to homeViewModel
This commit is contained in:
parent
0ba8b85953
commit
90a0d7c1c7
3 changed files with 19 additions and 29 deletions
|
|
@ -7,7 +7,6 @@ struct FeedCardNavigationLink: View {
|
|||
@EnvironmentObject var dataService: DataService
|
||||
|
||||
let item: FeedItem
|
||||
let searchQuery: String
|
||||
|
||||
@Binding var selectedLinkItem: FeedItem?
|
||||
|
||||
|
|
@ -25,7 +24,7 @@ struct FeedCardNavigationLink: View {
|
|||
.opacity(0)
|
||||
.buttonStyle(PlainButtonStyle())
|
||||
.onAppear {
|
||||
viewModel.itemAppeared(item: item, searchQuery: searchQuery, dataService: dataService)
|
||||
viewModel.itemAppeared(item: item, dataService: dataService)
|
||||
}
|
||||
FeedCard(item: item)
|
||||
}
|
||||
|
|
@ -38,7 +37,6 @@ struct GridCardNavigationLink: View {
|
|||
@State private var scale = 1.0
|
||||
|
||||
let item: FeedItem
|
||||
let searchQuery: String
|
||||
let actionHandler: (GridCardAction) -> Void
|
||||
|
||||
@Binding var selectedLinkItem: FeedItem?
|
||||
|
|
@ -65,7 +63,7 @@ struct GridCardNavigationLink: View {
|
|||
}
|
||||
})
|
||||
.onAppear {
|
||||
viewModel.itemAppeared(item: item, searchQuery: searchQuery, dataService: dataService)
|
||||
viewModel.itemAppeared(item: item, dataService: dataService)
|
||||
}
|
||||
}
|
||||
.aspectRatio(1.8, contentMode: .fill)
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ import Views
|
|||
struct HomeFeedContainerView: View {
|
||||
@EnvironmentObject var dataService: DataService
|
||||
@AppStorage(UserDefaultKey.homeFeedlayoutPreference.rawValue) var prefersListLayout = UIDevice.isIPhone
|
||||
@State private var searchQuery = ""
|
||||
@State private var snoozePresented = false
|
||||
@State private var itemToSnooze: FeedItem?
|
||||
@State private var selectedLinkItem: FeedItem?
|
||||
|
|
@ -21,33 +20,32 @@ import Views
|
|||
if #available(iOS 15.0, *) {
|
||||
HomeFeedView(
|
||||
prefersListLayout: $prefersListLayout,
|
||||
searchQuery: $searchQuery,
|
||||
selectedLinkItem: $selectedLinkItem,
|
||||
snoozePresented: $snoozePresented,
|
||||
itemToSnooze: $itemToSnooze,
|
||||
viewModel: viewModel
|
||||
)
|
||||
.refreshable {
|
||||
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
|
||||
viewModel.loadItems(dataService: dataService, isRefresh: true)
|
||||
}
|
||||
.searchable(
|
||||
text: $searchQuery,
|
||||
text: $viewModel.searchQuery,
|
||||
placement: .sidebar
|
||||
) {
|
||||
if searchQuery.isEmpty {
|
||||
if viewModel.searchQuery.isEmpty {
|
||||
Text("Inbox").searchCompletion("in:inbox ")
|
||||
Text("All").searchCompletion("in:all ")
|
||||
Text("Archived").searchCompletion("in:archive ")
|
||||
Text("Files").searchCompletion("type:file ")
|
||||
}
|
||||
}
|
||||
.onChange(of: searchQuery) { _ in
|
||||
.onChange(of: viewModel.searchQuery) { _ in
|
||||
// Maybe we should debounce this, but
|
||||
// it feels like it works ok without
|
||||
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
|
||||
viewModel.loadItems(dataService: dataService, isRefresh: true)
|
||||
}
|
||||
.onSubmit(of: .search) {
|
||||
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
|
||||
viewModel.loadItems(dataService: dataService, isRefresh: true)
|
||||
}
|
||||
.sheet(item: $viewModel.itemUnderLabelEdit) { item in
|
||||
ApplyLabelsView(item: item) { labels in
|
||||
|
|
@ -57,7 +55,6 @@ import Views
|
|||
} else {
|
||||
HomeFeedView(
|
||||
prefersListLayout: $prefersListLayout,
|
||||
searchQuery: $searchQuery,
|
||||
selectedLinkItem: $selectedLinkItem,
|
||||
snoozePresented: $snoozePresented,
|
||||
itemToSnooze: $itemToSnooze,
|
||||
|
|
@ -74,7 +71,7 @@ import Views
|
|||
Button(action: {}, label: { ProgressView() })
|
||||
} else {
|
||||
Button(
|
||||
action: { viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true) },
|
||||
action: { viewModel.loadItems(dataService: dataService, isRefresh: true) },
|
||||
label: { Label("Refresh Feed", systemImage: "arrow.clockwise") }
|
||||
)
|
||||
}
|
||||
|
|
@ -86,7 +83,7 @@ import Views
|
|||
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
||||
// Don't refresh the list if the user is currently reading an article
|
||||
if selectedLinkItem == nil {
|
||||
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
|
||||
viewModel.loadItems(dataService: dataService, isRefresh: true)
|
||||
}
|
||||
}
|
||||
.onReceive(NotificationCenter.default.publisher(for: Notification.Name("PushFeedItem"))) { notification in
|
||||
|
|
@ -107,7 +104,7 @@ import Views
|
|||
}
|
||||
.onAppear {
|
||||
if viewModel.items.isEmpty {
|
||||
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
|
||||
viewModel.loadItems(dataService: dataService, isRefresh: true)
|
||||
}
|
||||
}
|
||||
.onChange(of: selectedLinkItem) { _ in
|
||||
|
|
@ -120,7 +117,6 @@ import Views
|
|||
@EnvironmentObject var dataService: DataService
|
||||
|
||||
@Binding var prefersListLayout: Bool
|
||||
@Binding var searchQuery: String
|
||||
@Binding var selectedLinkItem: FeedItem?
|
||||
@Binding var snoozePresented: Bool
|
||||
@Binding var itemToSnooze: FeedItem?
|
||||
|
|
@ -131,7 +127,6 @@ import Views
|
|||
if prefersListLayout {
|
||||
HomeFeedListView(
|
||||
prefersListLayout: $prefersListLayout,
|
||||
searchQuery: $searchQuery,
|
||||
selectedLinkItem: $selectedLinkItem,
|
||||
snoozePresented: $snoozePresented,
|
||||
itemToSnooze: $itemToSnooze,
|
||||
|
|
@ -139,7 +134,6 @@ import Views
|
|||
)
|
||||
} else {
|
||||
HomeFeedGridView(
|
||||
searchQuery: $searchQuery,
|
||||
selectedLinkItem: $selectedLinkItem,
|
||||
snoozePresented: $snoozePresented,
|
||||
itemToSnooze: $itemToSnooze,
|
||||
|
|
@ -160,7 +154,7 @@ import Views
|
|||
Button(action: {}, label: { ProgressView() })
|
||||
} else {
|
||||
Button(
|
||||
action: { viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true) },
|
||||
action: { viewModel.loadItems(dataService: dataService, isRefresh: true) },
|
||||
label: { Label("Refresh Feed", systemImage: "arrow.clockwise") }
|
||||
)
|
||||
}
|
||||
|
|
@ -184,7 +178,6 @@ import Views
|
|||
struct HomeFeedListView: View {
|
||||
@EnvironmentObject var dataService: DataService
|
||||
@Binding var prefersListLayout: Bool
|
||||
@Binding var searchQuery: String
|
||||
@Binding var selectedLinkItem: FeedItem?
|
||||
@Binding var snoozePresented: Bool
|
||||
@Binding var itemToSnooze: FeedItem?
|
||||
|
|
@ -200,7 +193,6 @@ import Views
|
|||
ForEach(viewModel.items) { item in
|
||||
let link = FeedCardNavigationLink(
|
||||
item: item,
|
||||
searchQuery: searchQuery,
|
||||
selectedLinkItem: $selectedLinkItem,
|
||||
viewModel: viewModel
|
||||
)
|
||||
|
|
@ -315,7 +307,6 @@ import Views
|
|||
|
||||
struct HomeFeedGridView: View {
|
||||
@EnvironmentObject var dataService: DataService
|
||||
@Binding var searchQuery: String
|
||||
@Binding var selectedLinkItem: FeedItem?
|
||||
@Binding var snoozePresented: Bool
|
||||
@Binding var itemToSnooze: FeedItem?
|
||||
|
|
@ -344,7 +335,6 @@ import Views
|
|||
ForEach(viewModel.items) { item in
|
||||
let link = GridCardNavigationLink(
|
||||
item: item,
|
||||
searchQuery: searchQuery,
|
||||
actionHandler: { contextMenuActionHandler(item: item, action: $0) },
|
||||
selectedLinkItem: $selectedLinkItem,
|
||||
isContextMenuOpen: $isContextMenuOpen,
|
||||
|
|
@ -380,7 +370,7 @@ import Views
|
|||
.onPreferenceChange(ScrollViewOffsetPreferenceKey.self) { offset in
|
||||
DispatchQueue.main.async {
|
||||
if !viewModel.isLoading, offset > 240 {
|
||||
viewModel.loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: true)
|
||||
viewModel.loadItems(dataService: dataService, isRefresh: true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ final class HomeFeedViewModel: ObservableObject {
|
|||
@Published var isLoading = false
|
||||
@Published var showPushNotificationPrimer = false
|
||||
@Published var itemUnderLabelEdit: FeedItem?
|
||||
@Published var searchQuery = ""
|
||||
|
||||
var cursor: String?
|
||||
var sendProgressUpdates = false
|
||||
|
||||
|
|
@ -27,14 +29,14 @@ final class HomeFeedViewModel: ObservableObject {
|
|||
|
||||
init() {}
|
||||
|
||||
func itemAppeared(item: FeedItem, searchQuery: String, dataService: DataService) {
|
||||
func itemAppeared(item: FeedItem, dataService: DataService) {
|
||||
if isLoading { return }
|
||||
let itemIndex = items.firstIndex(where: { $0.id == item.id })
|
||||
let thresholdIndex = items.index(items.endIndex, offsetBy: -5)
|
||||
|
||||
// Check if user has scrolled to the last five items in the list
|
||||
if let itemIndex = itemIndex, itemIndex > thresholdIndex, items.count < thresholdIndex + 10 {
|
||||
loadItems(dataService: dataService, searchQuery: searchQuery, isRefresh: false)
|
||||
loadItems(dataService: dataService, isRefresh: false)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -42,7 +44,7 @@ final class HomeFeedViewModel: ObservableObject {
|
|||
items.insert(item, at: 0)
|
||||
}
|
||||
|
||||
func loadItems(dataService: DataService, searchQuery: String?, isRefresh: Bool) {
|
||||
func loadItems(dataService: DataService, isRefresh: Bool) {
|
||||
// Clear offline highlights since we'll be populating new FeedItems with the correct highlights set
|
||||
dataService.clearHighlights()
|
||||
|
||||
|
|
@ -63,7 +65,7 @@ final class HomeFeedViewModel: ObservableObject {
|
|||
dataService.libraryItemsPublisher(
|
||||
limit: 10,
|
||||
sortDescending: true,
|
||||
searchQuery: searchQuery,
|
||||
searchQuery: searchQuery.isEmpty ? nil : searchQuery,
|
||||
cursor: isRefresh ? nil : cursor
|
||||
)
|
||||
.sink(
|
||||
|
|
|
|||
Loading…
Reference in a new issue