Improve the load more fetching

This commit is contained in:
Jackson Harper 2023-12-21 12:12:19 +08:00
parent 7e7c9e344c
commit fbb39bcd91
3 changed files with 28 additions and 25 deletions

View file

@ -46,7 +46,7 @@ import Views
} }
} }
func loadSearchQuery(dataService: DataService, filterState: FetcherFilterState, isRefresh: Bool) async { func loadSearchQuery(dataService: DataService, filterState: FetcherFilterState, isRefresh: Bool, loadCursor: String? = nil) async {
let thisSearchIdx = searchIdx let thisSearchIdx = searchIdx
searchIdx += 1 searchIdx += 1
@ -57,7 +57,7 @@ import Views
let queryResult = try? await dataService.loadLinkedItems( let queryResult = try? await dataService.loadLinkedItems(
limit: 10, limit: 10,
searchQuery: searchQuery(filterState), searchQuery: searchQuery(filterState),
cursor: isRefresh ? nil : cursor cursor: isRefresh ? nil : loadCursor ?? cursor
) )
if let appliedFilter = filterState.appliedFilter, let queryResult = queryResult { if let appliedFilter = filterState.appliedFilter, let queryResult = queryResult {
@ -112,9 +112,10 @@ import Views
BadgeCountHandler.updateBadgeCount(dataService: dataService) BadgeCountHandler.updateBadgeCount(dataService: dataService)
} }
func loadMoreItems(dataService: DataService, filterState: FetcherFilterState, isRefresh: Bool) async { func loadMoreItems(dataService: DataService, filterState: FetcherFilterState) async {
if let appliedFilter = filterState.appliedFilter, appliedFilter.shouldRemoteSearch { if let appliedFilter = filterState.appliedFilter, appliedFilter.shouldRemoteSearch {
await loadSearchQuery(dataService: dataService, filterState: filterState, isRefresh: isRefresh) let idx = max(items.count - 1, 0)
await loadSearchQuery(dataService: dataService, filterState: filterState, isRefresh: false, loadCursor: idx.description)
} }
} }

View file

@ -1041,18 +1041,27 @@ struct BottomView: View {
@ObservedObject var viewModel: HomeFeedViewModel @ObservedObject var viewModel: HomeFeedViewModel
@EnvironmentObject var dataService: DataService @EnvironmentObject var dataService: DataService
@State var autoLoading = false
var body: some View { var body: some View {
if viewModel.fetcher.items.count < 5 { innerBody
Color.clear .onAppear {
.onAppear { Task {
Task { autoLoading = true
await viewModel.loadMore(dataService: dataService) await viewModel.loadMore(dataService: dataService)
} autoLoading = false
print("BOTTOM APPEARED")
} }
}
}
var innerBody: some View {
if viewModel.fetcher.items.count < 5 {
AnyView(Color.clear)
} else { } else {
HStack { AnyView(HStack {
Text("You are all caught up.") if !autoLoading {
Text("You are all caught up.")
}
Spacer() Spacer()
if viewModel.isLoading { if viewModel.isLoading {
ProgressView() ProgressView()
@ -1066,7 +1075,7 @@ struct BottomView: View {
}) })
.foregroundColor(Color.blue) .foregroundColor(Color.blue)
} }
}.padding(10) }.padding(10))
} }
} }
} }

View file

@ -92,7 +92,10 @@ import Views
return return
} }
await loadMoreItems(dataService: dataService, filterState: filterState, isRefresh: false) isLoading = true
await fetcher.loadMoreItems(dataService: dataService, filterState: filterState)
isLoading = false
lastMoreFetched = start lastMoreFetched = start
} }
@ -140,22 +143,12 @@ import Views
showLoadingBar = false showLoadingBar = false
} }
func loadMoreItems(dataService: DataService, filterState: FetcherFilterState, isRefresh: Bool) async {
isLoading = true
await fetcher.loadMoreItems(dataService: dataService, filterState: filterState, isRefresh: isRefresh)
isLoading = false
}
func loadFeatureItems(context: NSManagedObjectContext, predicate: NSPredicate, sort: NSSortDescriptor) async -> [Models.LibraryItem] { func loadFeatureItems(context: NSManagedObjectContext, predicate: NSPredicate, sort: NSSortDescriptor) async -> [Models.LibraryItem] {
let fetchRequest: NSFetchRequest<Models.LibraryItem> = LibraryItem.fetchRequest() let fetchRequest: NSFetchRequest<Models.LibraryItem> = LibraryItem.fetchRequest()
fetchRequest.fetchLimit = 25 fetchRequest.fetchLimit = 25
fetchRequest.predicate = predicate fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = [sort] fetchRequest.sortDescriptors = [sort]
print("using predicate to load feature items: ", predicate)
do { do {
let fetched = try context.fetch(fetchRequest) let fetched = try context.fetch(fetchRequest)
return fetched return fetched