114 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Swift
		
	
	
	
	
	
import SwiftUI
 | 
						||
 | 
						||
 | 
						||
struct ProfileContentGrid: View {
 | 
						||
    let isContentLoaded: Bool
 | 
						||
    let selectedTabIndex: Int
 | 
						||
    let searchQuery: String
 | 
						||
    let selectedCategory: String
 | 
						||
    let allPosts: [Post]
 | 
						||
    let isLoading: Bool
 | 
						||
    let onPostTapped: (Post, [Post]) -> Void
 | 
						||
    
 | 
						||
    var body: some View {
 | 
						||
        VStack(alignment: .leading, spacing: 0) {
 | 
						||
            if isLoading {
 | 
						||
                VStack {
 | 
						||
                    ProgressView("Загрузка...")
 | 
						||
                        .padding()
 | 
						||
                    Spacer()
 | 
						||
                }
 | 
						||
                .frame(maxWidth: .infinity, minHeight: 300) // 👈 гарантированная высота
 | 
						||
            } else if filteredPosts.isEmpty {
 | 
						||
                VStack {
 | 
						||
                Text("Нет постов")
 | 
						||
                    .foregroundColor(.secondary)
 | 
						||
                    .padding()
 | 
						||
                }
 | 
						||
                .frame(maxWidth: .infinity, minHeight: 300)
 | 
						||
            } else {
 | 
						||
                LazyVGrid(columns: Array(repeating: .init(.flexible()), count: 3), spacing: 2) {
 | 
						||
                    ForEach(filteredPosts) { post in
 | 
						||
                        Button(action: { onPostTapped(post, filteredPosts) }) {
 | 
						||
                            Rectangle()
 | 
						||
                                .fill(Color.gray.opacity(0.2))
 | 
						||
                                .aspectRatio(1, contentMode: .fit)
 | 
						||
                                .overlay(
 | 
						||
                                    ZStack {
 | 
						||
                                        VStack {
 | 
						||
                                            HStack {
 | 
						||
                                                Text("3 года назад") // Можно заменить на `post.createdAt`
 | 
						||
                                                    .font(.caption2)
 | 
						||
                                                    .foregroundColor(.white)
 | 
						||
                                                    .padding(4)
 | 
						||
                                                    .background(Color.black.opacity(0.6))
 | 
						||
                                                    .cornerRadius(4)
 | 
						||
                                                Spacer()
 | 
						||
                                            }
 | 
						||
                                            Spacer()
 | 
						||
                                        }
 | 
						||
                                        .padding(4)
 | 
						||
 | 
						||
                                        VStack {
 | 
						||
                                            Spacer()
 | 
						||
                                            HStack {
 | 
						||
                                                HStack(spacing: 4) {
 | 
						||
                                                    Image(systemName: "play.fill")
 | 
						||
                                                        .font(.caption2)
 | 
						||
                                                    Text("\(post.views)")
 | 
						||
                                                        .font(.caption2)
 | 
						||
                                                }
 | 
						||
                                                .foregroundColor(.white)
 | 
						||
                                                .padding(4)
 | 
						||
                                                .background(Color.black.opacity(0.6))
 | 
						||
                                                .cornerRadius(4)
 | 
						||
                                                Spacer()
 | 
						||
                                            }
 | 
						||
                                            .padding(4)
 | 
						||
                                        }
 | 
						||
                                    }
 | 
						||
                                )
 | 
						||
                        }
 | 
						||
                        .buttonStyle(PlainButtonStyle())
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                .padding(.horizontal)
 | 
						||
            }
 | 
						||
        }
 | 
						||
        .frame(maxWidth: .infinity, alignment: .topLeading)
 | 
						||
    }
 | 
						||
 | 
						||
    private var filteredPosts: [Post] {
 | 
						||
        var result: [Post]
 | 
						||
 | 
						||
        switch selectedTabIndex {
 | 
						||
        case 1:
 | 
						||
            result = allPosts.filter { $0.accessLevel == .archive }
 | 
						||
        case 2:
 | 
						||
            result = allPosts.filter { $0.isSavedByCurrentUser }
 | 
						||
        case 3:
 | 
						||
            result = allPosts.filter { $0.isLikedByCurrentUser }
 | 
						||
        default:
 | 
						||
            result = allPosts
 | 
						||
        }
 | 
						||
 | 
						||
        // 🔍 Поиск по названию или описанию
 | 
						||
        if !searchQuery.isEmpty {
 | 
						||
            result = result.filter {
 | 
						||
                ($0.title?.localizedCaseInsensitiveContains(searchQuery) ?? false) ||
 | 
						||
                ($0.description?.localizedCaseInsensitiveContains(searchQuery) ?? false)
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        // 🏷️ Фильтрация по категории (если не "#все")
 | 
						||
        if selectedCategory != "#все" {
 | 
						||
            result = result.filter {
 | 
						||
                $0.hashtags?.contains(where: { $0 == selectedCategory }) ?? false
 | 
						||
            }
 | 
						||
        }
 | 
						||
 | 
						||
        return result
 | 
						||
    }
 | 
						||
 | 
						||
}
 |