ios_app/Shared/ViewModels/NewHomeTabViewModel.swift
2025-08-14 20:07:12 +03:00

87 lines
3.0 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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