diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift index 9db48b14a..1c19b5398 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift @@ -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) diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index a45f7daad..1991ede19 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -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) } } } diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index f5e304094..18ef3b6e7 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -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(