133 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
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 {
 | 
						||
                RefreshableScrollView(isRefreshing: $viewModel.isRefreshing, onRefresh: {
 | 
						||
                    viewModel.refreshData()
 | 
						||
                }) {
 | 
						||
                    VStack {
 | 
						||
                        HStack(alignment: .top, spacing: 6) {
 | 
						||
                            LazyVStack(spacing: 6) {
 | 
						||
                                ForEach(column1Posts) { post in
 | 
						||
                                    PostGridItem(post: post)
 | 
						||
                                        .onAppear {
 | 
						||
                                            viewModel.loadMoreContentIfNeeded(currentItem: post)
 | 
						||
                                        }
 | 
						||
                                }
 | 
						||
                            }
 | 
						||
                            LazyVStack(spacing: 6) {
 | 
						||
                                ForEach(column2Posts) { post in
 | 
						||
                                    PostGridItem(post: post)
 | 
						||
                                        .onAppear {
 | 
						||
                                            viewModel.loadMoreContentIfNeeded(currentItem: post)
 | 
						||
                                        }
 | 
						||
                                }
 | 
						||
                            }
 | 
						||
                        }
 | 
						||
                        .padding(.horizontal, 4)
 | 
						||
                        
 | 
						||
                        if viewModel.isLoadingPage {
 | 
						||
                            ProgressView()
 | 
						||
                        } else if !viewModel.canLoadMorePages {
 | 
						||
                            Text(":(")
 | 
						||
                                .foregroundColor(.secondary)
 | 
						||
                                .padding()
 | 
						||
                        }
 | 
						||
                        
 | 
						||
                        Spacer()
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
        .onAppear {
 | 
						||
            viewModel.fetchDataIfNeeded()
 | 
						||
        }
 | 
						||
        .background(Color(.secondarySystemBackground)) // Фон для всей вкладки
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
struct PostGridItem: View {
 | 
						||
    let post: Post
 | 
						||
    
 | 
						||
    private var randomHeight: CGFloat {
 | 
						||
        CGFloat.random(in: 150...300)
 | 
						||
    }
 | 
						||
 | 
						||
    var body: some View {
 | 
						||
        VStack(alignment: .leading, spacing: 0) { // Убираем отступ между картинкой и текстом
 | 
						||
            // 1. Медиа контент
 | 
						||
            if let _ = post.media.first {
 | 
						||
                Image("placeholderPhoto")
 | 
						||
                    .resizable()
 | 
						||
                    .aspectRatio(contentMode: .fill)
 | 
						||
                    .frame(height: randomHeight)
 | 
						||
            }
 | 
						||
            
 | 
						||
            // Контейнер для текста, который создает эффект "расширения"
 | 
						||
            VStack(alignment: .leading, spacing: 8) {
 | 
						||
                // 2. Название поста
 | 
						||
                if let title = post.title, !title.isEmpty {
 | 
						||
                    Text(title)
 | 
						||
                        .font(.subheadline)
 | 
						||
                        .lineLimit(2)
 | 
						||
                }
 | 
						||
                
 | 
						||
                // 3. Информация об авторе и лайки
 | 
						||
                HStack {
 | 
						||
                    
 | 
						||
                    Button(action: {
 | 
						||
                        // пока ничего не делаем
 | 
						||
                    }) {
 | 
						||
                        HStack(spacing: 4) {
 | 
						||
                        Image(systemName: "person.circle.fill")
 | 
						||
                            .resizable()
 | 
						||
                            .frame(width: 20, height: 20)
 | 
						||
                            .foregroundColor(.gray)
 | 
						||
                        Text(post.authorUsername)
 | 
						||
                            .font(.footnote)
 | 
						||
                            .lineLimit(1)
 | 
						||
                            .foregroundColor(.primary)
 | 
						||
                    }
 | 
						||
                    }
 | 
						||
                    .contentShape(Rectangle())
 | 
						||
 | 
						||
                    Spacer()
 | 
						||
 | 
						||
                    Button(action: {
 | 
						||
                        // пока ничего не делаем
 | 
						||
                    }) {
 | 
						||
                        HStack(spacing: 4) {
 | 
						||
                        Image(systemName: post.isLikedByCurrentUser ? "heart.fill" : "heart")
 | 
						||
                            .foregroundColor(post.isLikedByCurrentUser ? .red : .primary)
 | 
						||
                        Text("\(post.likes)")
 | 
						||
                            .font(.subheadline)
 | 
						||
                            .foregroundColor(.primary)
 | 
						||
                    }
 | 
						||
                    }
 | 
						||
                    .contentShape(Rectangle())
 | 
						||
                    
 | 
						||
                }
 | 
						||
            }
 | 
						||
            .padding(8)
 | 
						||
            .background(Color(UIColor.systemBackground)) // Фон только для текстовой части
 | 
						||
        }
 | 
						||
        .cornerRadius(6) // Закругляем всю карточку
 | 
						||
        .clipped() // Обрезаем дочерние вью по закругленной форме родителя
 | 
						||
        .shadow(color: Color.black.opacity(0.1), radius: 5, x: 0, y: 2)
 | 
						||
    }
 | 
						||
}
 |