карточки в ленте
This commit is contained in:
		
							parent
							
								
									d089276b39
								
							
						
					
					
						commit
						b0d5429ae6
					
				@ -45,7 +45,16 @@ struct TopBarView: View {
 | 
				
			|||||||
                    Spacer()
 | 
					                    Spacer()
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                if isProfileTab {
 | 
					                if isHomeTab{
 | 
				
			||||||
 | 
					                    // Заглушка кнопки
 | 
				
			||||||
 | 
					                    Button(action: {
 | 
				
			||||||
 | 
					                        // пока ничего не делаем
 | 
				
			||||||
 | 
					                    }) {
 | 
				
			||||||
 | 
					                        Image(systemName: "magnifyingglass")
 | 
				
			||||||
 | 
					                            .imageScale(.large)
 | 
				
			||||||
 | 
					                            .foregroundColor(.primary)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else if isProfileTab {
 | 
				
			||||||
                    NavigationLink(destination: SettingsView(viewModel: viewModel)) {
 | 
					                    NavigationLink(destination: SettingsView(viewModel: viewModel)) {
 | 
				
			||||||
                        Image(systemName: "wrench")
 | 
					                        Image(systemName: "wrench")
 | 
				
			||||||
                            .imageScale(.large)
 | 
					                            .imageScale(.large)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								Shared/Media/placeholderPhoto.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Shared/Media/placeholderPhoto.jpg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 3.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Media/placeholderPhotoSquare.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Shared/Media/placeholderPhotoSquare.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 173 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								Shared/Media/placeholderVideo.mp4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Shared/Media/placeholderVideo.mp4
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										27
									
								
								Shared/ViewModels/NewHomeTabViewModel.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								Shared/ViewModels/NewHomeTabViewModel.swift
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					import Foundation
 | 
				
			||||||
 | 
					import Combine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NewHomeTabViewModel: ObservableObject {
 | 
				
			||||||
 | 
					    @Published var posts: [Post] = []
 | 
				
			||||||
 | 
					    @Published var isLoading = true
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private var hasLoadedData = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    func fetchDataIfNeeded() {
 | 
				
			||||||
 | 
					        // Загружаем данные только если они еще не были загружены
 | 
				
			||||||
 | 
					        guard !hasLoadedData else { return }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        isLoading = true
 | 
				
			||||||
 | 
					        PostService.shared.fetchAllPosts { [weak self] fetchedPosts in
 | 
				
			||||||
 | 
					            // Используем weak self чтобы избежать циклов сильных ссылок
 | 
				
			||||||
 | 
					            guard let self = self else { return }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            // Обновляем UI в основном потоке
 | 
				
			||||||
 | 
					            DispatchQueue.main.async {
 | 
				
			||||||
 | 
					                self.posts = fetchedPosts
 | 
				
			||||||
 | 
					                self.isLoading = false
 | 
				
			||||||
 | 
					                self.hasLoadedData = true
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -10,6 +10,7 @@ import SwiftUI
 | 
				
			|||||||
struct MainView: View {
 | 
					struct MainView: View {
 | 
				
			||||||
    @ObservedObject var viewModel: LoginViewModel
 | 
					    @ObservedObject var viewModel: LoginViewModel
 | 
				
			||||||
    @State private var selectedTab: Int = 0
 | 
					    @State private var selectedTab: Int = 0
 | 
				
			||||||
 | 
					    @StateObject private var newHomeTabViewModel = NewHomeTabViewModel()
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // Состояния для TopBarView
 | 
					    // Состояния для TopBarView
 | 
				
			||||||
    @State private var selectedAccount = "@user1"
 | 
					    @State private var selectedAccount = "@user1"
 | 
				
			||||||
@ -52,7 +53,8 @@ struct MainView: View {
 | 
				
			|||||||
                ZStack {
 | 
					                ZStack {
 | 
				
			||||||
                    switch selectedTab {
 | 
					                    switch selectedTab {
 | 
				
			||||||
                    case 0:
 | 
					                    case 0:
 | 
				
			||||||
                        HomeTab(onScroll: handleScroll)
 | 
					//                        HomeTab(onScroll: handleScroll)
 | 
				
			||||||
 | 
					                        NewHomeTab(viewModel: newHomeTabViewModel)
 | 
				
			||||||
                    case 1:
 | 
					                    case 1:
 | 
				
			||||||
                        SearchTab() // SearchTab не имеет скролла, поэтому onScroll не нужен
 | 
					                        SearchTab() // SearchTab не имеет скролла, поэтому onScroll не нужен
 | 
				
			||||||
                    case 2:
 | 
					                    case 2:
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,99 @@
 | 
				
			|||||||
//
 | 
					import SwiftUI
 | 
				
			||||||
//  NewHomeTab.swift
 | 
					 | 
				
			||||||
//  yobble (iOS)
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
//  Created by cheykrym on 13/08/2025.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Foundation
 | 
					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)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -29,6 +29,12 @@
 | 
				
			|||||||
		1A7940E72DF7B5E5002569DA /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7940E62DF7B5E5002569DA /* SplashScreenView.swift */; };
 | 
							1A7940E72DF7B5E5002569DA /* SplashScreenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A7940E62DF7B5E5002569DA /* SplashScreenView.swift */; };
 | 
				
			||||||
		1A7940F02DF7B7A3002569DA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1A7940F22DF7B7A3002569DA /* Localizable.strings */; };
 | 
							1A7940F02DF7B7A3002569DA /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1A7940F22DF7B7A3002569DA /* Localizable.strings */; };
 | 
				
			||||||
		1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A79410B2DF7C81D002569DA /* RegistrationView.swift */; };
 | 
							1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A79410B2DF7C81D002569DA /* RegistrationView.swift */; };
 | 
				
			||||||
 | 
							1A9B014B2E4BF3CD00887E0B /* NewHomeTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9B014A2E4BF3CD00887E0B /* NewHomeTab.swift */; };
 | 
				
			||||||
 | 
							1A9B01582E4BF50D00887E0B /* placeholderVideo.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B01572E4BF50D00887E0B /* placeholderVideo.mp4 */; };
 | 
				
			||||||
 | 
							1A9B015F2E4BF9C000887E0B /* placeholderPhotoSquare.png in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B015D2E4BF9C000887E0B /* placeholderPhotoSquare.png */; };
 | 
				
			||||||
 | 
							1A9B01602E4BF9C000887E0B /* placeholderPhoto.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B015E2E4BF9C000887E0B /* placeholderPhoto.jpg */; };
 | 
				
			||||||
 | 
							1A9B01662E4BFA3600887E0B /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A9B01652E4BFA3600887E0B /* Media.xcassets */; };
 | 
				
			||||||
 | 
							1A9B016E2E4BFB9000887E0B /* NewHomeTabViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A9B016D2E4BFB9000887E0B /* NewHomeTabViewModel.swift */; };
 | 
				
			||||||
		1AB4F8CD2E22E341002B6E40 /* AccountShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8CC2E22E341002B6E40 /* AccountShareSheet.swift */; };
 | 
							1AB4F8CD2E22E341002B6E40 /* AccountShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8CC2E22E341002B6E40 /* AccountShareSheet.swift */; };
 | 
				
			||||||
		1AB4F8F32E22EC9F002B6E40 /* FollowersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8F22E22EC9F002B6E40 /* FollowersView.swift */; };
 | 
							1AB4F8F32E22EC9F002B6E40 /* FollowersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8F22E22EC9F002B6E40 /* FollowersView.swift */; };
 | 
				
			||||||
		1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8F62E22ECAC002B6E40 /* FollowingView.swift */; };
 | 
							1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB4F8F62E22ECAC002B6E40 /* FollowingView.swift */; };
 | 
				
			||||||
@ -76,6 +82,12 @@
 | 
				
			|||||||
		1A7940F12DF7B7A3002569DA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 | 
							1A7940F12DF7B7A3002569DA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 | 
				
			||||||
		1A7940F72DF7B7EC002569DA /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
 | 
							1A7940F72DF7B7EC002569DA /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
 | 
				
			||||||
		1A79410B2DF7C81D002569DA /* RegistrationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationView.swift; sourceTree = "<group>"; };
 | 
							1A79410B2DF7C81D002569DA /* RegistrationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationView.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							1A9B014A2E4BF3CD00887E0B /* NewHomeTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewHomeTab.swift; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							1A9B01572E4BF50D00887E0B /* placeholderVideo.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; name = placeholderVideo.mp4; path = ../../../../Volumes/Untitled/xcode/volnahub/Shared/Media/placeholderVideo.mp4; sourceTree = DEVELOPER_DIR; };
 | 
				
			||||||
 | 
							1A9B015D2E4BF9C000887E0B /* placeholderPhotoSquare.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = placeholderPhotoSquare.png; path = ../../../../Volumes/Untitled/xcode/volnahub/Shared/Media/placeholderPhotoSquare.png; sourceTree = DEVELOPER_DIR; };
 | 
				
			||||||
 | 
							1A9B015E2E4BF9C000887E0B /* placeholderPhoto.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = placeholderPhoto.jpg; path = ../../../../Volumes/Untitled/xcode/volnahub/Shared/Media/placeholderPhoto.jpg; sourceTree = DEVELOPER_DIR; };
 | 
				
			||||||
 | 
							1A9B01652E4BFA3600887E0B /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = "<group>"; };
 | 
				
			||||||
 | 
							1A9B016D2E4BFB9000887E0B /* NewHomeTabViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewHomeTabViewModel.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		1AB4F8CC2E22E341002B6E40 /* AccountShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountShareSheet.swift; sourceTree = "<group>"; };
 | 
							1AB4F8CC2E22E341002B6E40 /* AccountShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountShareSheet.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		1AB4F8F22E22EC9F002B6E40 /* FollowersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowersView.swift; sourceTree = "<group>"; };
 | 
							1AB4F8F22E22EC9F002B6E40 /* FollowersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowersView.swift; sourceTree = "<group>"; };
 | 
				
			||||||
		1AB4F8F62E22ECAC002B6E40 /* FollowingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingView.swift; sourceTree = "<group>"; };
 | 
							1AB4F8F62E22ECAC002B6E40 /* FollowingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowingView.swift; sourceTree = "<group>"; };
 | 
				
			||||||
@ -127,6 +139,7 @@
 | 
				
			|||||||
		1A7940792DF77BC2002569DA /* Shared */ = {
 | 
							1A7940792DF77BC2002569DA /* Shared */ = {
 | 
				
			||||||
			isa = PBXGroup;
 | 
								isa = PBXGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
 | 
									1A9B01502E4BF49200887E0B /* Media */,
 | 
				
			||||||
				1AB7F5132E32EBF1003756F3 /* Components */,
 | 
									1AB7F5132E32EBF1003756F3 /* Components */,
 | 
				
			||||||
				1A7940FA2DF7B898002569DA /* Resources */,
 | 
									1A7940FA2DF7B898002569DA /* Resources */,
 | 
				
			||||||
				1A7940E52DF7B341002569DA /* Services */,
 | 
									1A7940E52DF7B341002569DA /* Services */,
 | 
				
			||||||
@ -183,6 +196,7 @@
 | 
				
			|||||||
		1A79409E2DF77DBD002569DA /* ViewModels */ = {
 | 
							1A79409E2DF77DBD002569DA /* ViewModels */ = {
 | 
				
			||||||
			isa = PBXGroup;
 | 
								isa = PBXGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
 | 
									1A9B016D2E4BFB9000887E0B /* NewHomeTabViewModel.swift */,
 | 
				
			||||||
				1A2302102E3050C60067BF4F /* SearchViewModel.swift */,
 | 
									1A2302102E3050C60067BF4F /* SearchViewModel.swift */,
 | 
				
			||||||
				1A7940A92DF77E05002569DA /* LoginViewModel.swift */,
 | 
									1A7940A92DF77E05002569DA /* LoginViewModel.swift */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
@ -224,6 +238,17 @@
 | 
				
			|||||||
			path = Resources;
 | 
								path = Resources;
 | 
				
			||||||
			sourceTree = "<group>";
 | 
								sourceTree = "<group>";
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
							1A9B01502E4BF49200887E0B /* Media */ = {
 | 
				
			||||||
 | 
								isa = PBXGroup;
 | 
				
			||||||
 | 
								children = (
 | 
				
			||||||
 | 
									1A9B01652E4BFA3600887E0B /* Media.xcassets */,
 | 
				
			||||||
 | 
									1A9B015E2E4BF9C000887E0B /* placeholderPhoto.jpg */,
 | 
				
			||||||
 | 
									1A9B015D2E4BF9C000887E0B /* placeholderPhotoSquare.png */,
 | 
				
			||||||
 | 
									1A9B01572E4BF50D00887E0B /* placeholderVideo.mp4 */,
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
								path = Media;
 | 
				
			||||||
 | 
								sourceTree = "<group>";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
		1AB7F5132E32EBF1003756F3 /* Components */ = {
 | 
							1AB7F5132E32EBF1003756F3 /* Components */ = {
 | 
				
			||||||
			isa = PBXGroup;
 | 
								isa = PBXGroup;
 | 
				
			||||||
			children = (
 | 
								children = (
 | 
				
			||||||
@ -265,6 +290,7 @@
 | 
				
			|||||||
			children = (
 | 
								children = (
 | 
				
			||||||
				1A6FB9542E32D2B200E89EBE /* CustomTabBar.swift */,
 | 
									1A6FB9542E32D2B200E89EBE /* CustomTabBar.swift */,
 | 
				
			||||||
				1A7940B52DF77F21002569DA /* MainView.swift */,
 | 
									1A7940B52DF77F21002569DA /* MainView.swift */,
 | 
				
			||||||
 | 
									1A9B014A2E4BF3CD00887E0B /* NewHomeTab.swift */,
 | 
				
			||||||
				1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */,
 | 
									1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */,
 | 
				
			||||||
				1AEE5EB22E21A85800A3DCA3 /* SearchTab.swift */,
 | 
									1AEE5EB22E21A85800A3DCA3 /* SearchTab.swift */,
 | 
				
			||||||
				1A7940C92DF7A99B002569DA /* ChatsTab.swift */,
 | 
									1A7940C92DF7A99B002569DA /* ChatsTab.swift */,
 | 
				
			||||||
@ -370,8 +396,12 @@
 | 
				
			|||||||
			isa = PBXResourcesBuildPhase;
 | 
								isa = PBXResourcesBuildPhase;
 | 
				
			||||||
			buildActionMask = 2147483647;
 | 
								buildActionMask = 2147483647;
 | 
				
			||||||
			files = (
 | 
								files = (
 | 
				
			||||||
 | 
									1A9B01582E4BF50D00887E0B /* placeholderVideo.mp4 in Resources */,
 | 
				
			||||||
				1A7940912DF77BC3002569DA /* Assets.xcassets in Resources */,
 | 
									1A7940912DF77BC3002569DA /* Assets.xcassets in Resources */,
 | 
				
			||||||
				1A7940F02DF7B7A3002569DA /* Localizable.strings in Resources */,
 | 
									1A7940F02DF7B7A3002569DA /* Localizable.strings in Resources */,
 | 
				
			||||||
 | 
									1A9B01602E4BF9C000887E0B /* placeholderPhoto.jpg in Resources */,
 | 
				
			||||||
 | 
									1A9B01662E4BFA3600887E0B /* Media.xcassets in Resources */,
 | 
				
			||||||
 | 
									1A9B015F2E4BF9C000887E0B /* placeholderPhotoSquare.png in Resources */,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			runOnlyForDeploymentPostprocessing = 0;
 | 
								runOnlyForDeploymentPostprocessing = 0;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
@ -396,6 +426,7 @@
 | 
				
			|||||||
				1A7940C62DF7A98E002569DA /* ContactsTab.swift in Sources */,
 | 
									1A7940C62DF7A98E002569DA /* ContactsTab.swift in Sources */,
 | 
				
			||||||
				1ACE61092E22F57100B37AC5 /* AppPreferencesView.swift in Sources */,
 | 
									1ACE61092E22F57100B37AC5 /* AppPreferencesView.swift in Sources */,
 | 
				
			||||||
				1ACE61052E22F56800B37AC5 /* SecuritySettingsView.swift in Sources */,
 | 
									1ACE61052E22F56800B37AC5 /* SecuritySettingsView.swift in Sources */,
 | 
				
			||||||
 | 
									1A9B016E2E4BFB9000887E0B /* NewHomeTabViewModel.swift in Sources */,
 | 
				
			||||||
				1A7940E72DF7B5E5002569DA /* SplashScreenView.swift in Sources */,
 | 
									1A7940E72DF7B5E5002569DA /* SplashScreenView.swift in Sources */,
 | 
				
			||||||
				1A7940B02DF77E26002569DA /* LoginView.swift in Sources */,
 | 
									1A7940B02DF77E26002569DA /* LoginView.swift in Sources */,
 | 
				
			||||||
				1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */,
 | 
									1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */,
 | 
				
			||||||
@ -405,6 +436,7 @@
 | 
				
			|||||||
				1ACE61212E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift in Sources */,
 | 
									1ACE61212E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift in Sources */,
 | 
				
			||||||
				1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */,
 | 
									1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */,
 | 
				
			||||||
				1A7940DE2DF7B0D7002569DA /* config.swift in Sources */,
 | 
									1A7940DE2DF7B0D7002569DA /* config.swift in Sources */,
 | 
				
			||||||
 | 
									1A9B014B2E4BF3CD00887E0B /* NewHomeTab.swift in Sources */,
 | 
				
			||||||
				1A2302112E3050C60067BF4F /* SearchViewModel.swift in Sources */,
 | 
									1A2302112E3050C60067BF4F /* SearchViewModel.swift in Sources */,
 | 
				
			||||||
				1AE587252E23337000254F06 /* ProfileContentGrid.swift in Sources */,
 | 
									1AE587252E23337000254F06 /* ProfileContentGrid.swift in Sources */,
 | 
				
			||||||
				1A6FB9552E32D2B200E89EBE /* CustomTabBar.swift in Sources */,
 | 
									1A6FB9552E32D2B200E89EBE /* CustomTabBar.swift in Sources */,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user