import SwiftUI struct NewHomeTab: View { @ObservedObject var viewModel: NewHomeTabViewModel private var column1Posts: [Post] { viewModel.posts.enumerated().filter { $0.offset % 2 == 0 }.map { $0.element } } private var column2Posts: [Post] { viewModel.posts.enumerated().filter { $0.offset % 2 != 0 }.map { $0.element } } var body: some View { VStack { if viewModel.isLoading { ProgressView("Загрузка ленты...") } else { ScrollView { HStack(alignment: .top, spacing: 2) { LazyVStack(spacing: 8) { ForEach(column1Posts) { post in PostGridItem(post: post) } } LazyVStack(spacing: 8) { ForEach(column2Posts) { post in PostGridItem(post: post) } } } .padding(.horizontal, 2) } } } .onAppear { viewModel.fetchDataIfNeeded() } } } struct PostGridItem: View { let post: Post private var randomHeight: CGFloat { // Мы можем сделать высоту зависимой от типа контента, если нужно // пока оставим случайной для визуального разнообразия CGFloat.random(in: 150...300) } var body: some View { VStack(alignment: .leading, spacing: 8) { // 1. Медиа контент if let _ = post.media.first { Image("placeholderPhoto") // Используем локальный плейсхолдер .resizable() .aspectRatio(contentMode: .fill) .frame(height: randomHeight) .clipped() .cornerRadius(10) } // 2. Название поста if let title = post.title, !title.isEmpty { Text(title) .font(.headline) .lineLimit(2) } // 3. Информация об авторе и лайки HStack { // Аватар и имя пользователя HStack(spacing: 4) { Image(systemName: "person.circle.fill") .resizable() .frame(width: 24, height: 24) .foregroundColor(.gray) Text(post.authorUsername) .font(.subheadline) .lineLimit(1) } Spacer() // Лайки HStack(spacing: 4) { Image(systemName: post.isLikedByCurrentUser ? "heart.fill" : "heart") .foregroundColor(post.isLikedByCurrentUser ? .red : .primary) Text("\(post.likes)") .font(.subheadline) } } } .padding(8) .background(Color(UIColor.systemBackground)) // Для поддержки темной/светлой темы .cornerRadius(12) .shadow(color: Color.black.opacity(0.1), radius: 5, x: 0, y: 2) } }