87 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
import Foundation
 | 
						||
import Combine
 | 
						||
import UIKit // Для доступа к UIScreen
 | 
						||
 | 
						||
class NewHomeTabViewModel: ObservableObject {
 | 
						||
    @Published var column1Posts: [Post] = []
 | 
						||
    @Published var column2Posts: [Post] = []
 | 
						||
    @Published var isLoading: Bool = false
 | 
						||
    @Published var isRefreshing: Bool = false
 | 
						||
    
 | 
						||
    private var allPosts: [Post] = []
 | 
						||
    private let postService = PostService.shared
 | 
						||
    
 | 
						||
    // Рассчитываем ширину колонки один раз
 | 
						||
    private let columnWidth = (UIScreen.main.bounds.width - 14) / 2
 | 
						||
    
 | 
						||
    func fetchDataIfNeeded() {
 | 
						||
        guard allPosts.isEmpty else { return }
 | 
						||
        fetchData()
 | 
						||
    }
 | 
						||
    
 | 
						||
    func refreshData() {
 | 
						||
        isRefreshing = true
 | 
						||
        fetchData()
 | 
						||
    }
 | 
						||
    
 | 
						||
    private func fetchData() {
 | 
						||
        if !isRefreshing {
 | 
						||
            isLoading = true
 | 
						||
        }
 | 
						||
        
 | 
						||
        postService.fetchAllPosts { [weak self] posts in
 | 
						||
            guard let self = self else { return }
 | 
						||
            
 | 
						||
            DispatchQueue.main.async {
 | 
						||
                self.allPosts = posts
 | 
						||
                self.distributePosts()
 | 
						||
                self.isLoading = false
 | 
						||
                self.isRefreshing = false
 | 
						||
            }
 | 
						||
        }
 | 
						||
    }
 | 
						||
    
 | 
						||
    private func distributePosts() {
 | 
						||
        var tempColumn1Posts: [Post] = []
 | 
						||
        var tempColumn2Posts: [Post] = []
 | 
						||
        var column1Height: CGFloat = 0
 | 
						||
        var column2Height: CGFloat = 0
 | 
						||
        
 | 
						||
        for post in allPosts {
 | 
						||
            let postHeight = calculatePostHeight(for: post)
 | 
						||
            
 | 
						||
            // Добавляем пост в более короткую колонку
 | 
						||
            if column1Height <= column2Height {
 | 
						||
                tempColumn1Posts.append(post)
 | 
						||
                column1Height += postHeight
 | 
						||
            } else {
 | 
						||
                tempColumn2Posts.append(post)
 | 
						||
                column2Height += postHeight
 | 
						||
            }
 | 
						||
        }
 | 
						||
        
 | 
						||
        self.column1Posts = tempColumn1Posts
 | 
						||
        self.column2Posts = tempColumn2Posts
 | 
						||
    }
 | 
						||
    
 | 
						||
    private func calculatePostHeight(for post: Post) -> CGFloat {
 | 
						||
        guard let media = post.media.first,
 | 
						||
              let width = media.width,
 | 
						||
              let height = media.height,
 | 
						||
              width > 0 else {
 | 
						||
            // Возвращаем стандартную высоту для постов без медиа или с неверными данными
 | 
						||
            return columnWidth
 | 
						||
        }
 | 
						||
        
 | 
						||
        // Рассчитываем высоту изображения на основе его пропорций
 | 
						||
        let aspectRatio = CGFloat(height) / CGFloat(width)
 | 
						||
        let imageHeight = columnWidth * aspectRatio
 | 
						||
        
 | 
						||
        // Здесь можно добавить примерную высоту для текста, если нужно
 | 
						||
        // Например, + 50-70 поинтов для заголовка, автора и кнопок
 | 
						||
        // Для простоты пока будем ориентироваться только на высоту картинки
 | 
						||
        return imageHeight
 | 
						||
    }
 | 
						||
}
 | 
						||
 |