77 lines
2.1 KiB
Swift
77 lines
2.1 KiB
Swift
import Foundation
|
|
import Combine
|
|
|
|
class NewHomeTabViewModel: ObservableObject {
|
|
@Published var posts: [Post] = []
|
|
@Published var isLoading = true
|
|
@Published var isRefreshing = false
|
|
@Published var isLoadingPage = false
|
|
|
|
@Published var canLoadMorePages = true
|
|
|
|
private var currentPage = 0
|
|
private let postsPerPage = 10
|
|
|
|
func fetchDataIfNeeded() {
|
|
guard posts.isEmpty else { return }
|
|
fetchPosts()
|
|
}
|
|
|
|
func refreshData() {
|
|
guard !isRefreshing else { return }
|
|
|
|
isRefreshing = true
|
|
currentPage = 0
|
|
canLoadMorePages = true
|
|
|
|
fetchPosts(isRefresh: true)
|
|
}
|
|
|
|
func loadMoreContentIfNeeded(currentItem item: Post?) {
|
|
guard let item = item else {
|
|
fetchPosts()
|
|
return
|
|
}
|
|
|
|
let thresholdIndex = posts.index(posts.endIndex, offsetBy: -5)
|
|
if posts.firstIndex(where: { $0.id == item.id }) == thresholdIndex {
|
|
fetchPosts()
|
|
}
|
|
}
|
|
|
|
private func fetchPosts(isRefresh: Bool = false) {
|
|
guard !isLoadingPage, canLoadMorePages else {
|
|
if isRefresh {
|
|
DispatchQueue.main.async {
|
|
self.isRefreshing = false
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
isLoadingPage = true
|
|
if isRefresh {
|
|
currentPage = 0
|
|
} else {
|
|
currentPage += 1
|
|
}
|
|
|
|
PostService.shared.fetchAllPosts(page: currentPage, limit: postsPerPage) { [weak self] fetchedPosts in
|
|
guard let self = self else { return }
|
|
|
|
DispatchQueue.main.async {
|
|
if isRefresh {
|
|
self.posts = fetchedPosts
|
|
} else {
|
|
self.posts.append(contentsOf: fetchedPosts)
|
|
}
|
|
|
|
self.canLoadMorePages = !fetchedPosts.isEmpty
|
|
self.isLoading = false
|
|
self.isLoadingPage = false
|
|
self.isRefreshing = false
|
|
}
|
|
}
|
|
}
|
|
}
|