Add infinite scroll for comments

This commit is contained in:
Arkadiusz Fal
2022-01-05 17:12:32 +01:00
parent ac755d0ee6
commit 1db4a3197d
5 changed files with 84 additions and 47 deletions

View File

@@ -8,7 +8,6 @@ final class CommentsModel: ObservableObject {
@Published var nextPage: String?
@Published var firstPage = true
@Published var loading = false
@Published var loaded = false
@Published var disabled = false
@@ -41,37 +40,43 @@ final class CommentsModel: ObservableObject {
}
func load(page: String? = nil) {
guard Self.enabled, !loading else {
guard Self.enabled else {
return
}
reset()
loading = true
guard !Self.instance.isNil,
!(player?.currentVideo.isNil ?? true)
else {
return
}
if !firstPage && !nextPageAvailable {
return
}
firstPage = page.isNil || page!.isEmpty
api?.comments(player.currentVideo!.videoID, page: page)?
.load()
.onSuccess { [weak self] response in
if let page: CommentsPage = response.typedContent() {
self?.all = page.comments
self?.all += page.comments
self?.nextPage = page.nextPage
self?.disabled = page.disabled
}
}
.onCompletion { [weak self] _ in
self?.loading = false
self?.loaded = true
}
}
func loadNextPageIfNeeded(current comment: Comment) {
let thresholdIndex = all.index(all.endIndex, offsetBy: -5)
if all.firstIndex(where: { $0 == comment }) == thresholdIndex {
loadNextPage()
}
}
func loadNextPage() {
load(page: nextPage)
}
@@ -108,7 +113,6 @@ final class CommentsModel: ObservableObject {
firstPage = true
nextPage = nil
loaded = false
loading = false
replies = []
repliesLoaded = false
}