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