ios_app/Shared/ViewModels/NewHomeTabViewModel.swift
2025-08-14 02:09:38 +03:00

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