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