move searchQuery state to homeViewModel

This commit is contained in:
Satindar Dhillon 2022-04-08 08:30:55 -07:00
parent 0ba8b85953
commit 90a0d7c1c7
3 changed files with 19 additions and 29 deletions

View file

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

View file

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

View file

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