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