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