top bar update

This commit is contained in:
cheykrym 2025-07-25 01:50:56 +03:00
parent 76642b89d5
commit 975802dc88
9 changed files with 263 additions and 120 deletions

View File

@ -0,0 +1,69 @@
import SwiftUI
import UIKit
struct RefreshableScrollView<Content: View>: UIViewRepresentable {
var content: Content
var onRefresh: () -> Void
var isRefreshing: Binding<Bool>
init(isRefreshing: Binding<Bool>, onRefresh: @escaping () -> Void, @ViewBuilder content: () -> Content) {
self.content = content()
self.onRefresh = onRefresh
self.isRefreshing = isRefreshing
}
func makeUIView(context: Context) -> UIScrollView {
let scrollView = UIScrollView()
scrollView.delaysContentTouches = false
let refreshControl = UIRefreshControl()
refreshControl.addTarget(context.coordinator, action: #selector(Coordinator.handleRefresh), for: .valueChanged)
scrollView.refreshControl = refreshControl
let hostingController = UIHostingController(rootView: content)
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(hostingController.view)
NSLayoutConstraint.activate([
hostingController.view.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
hostingController.view.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor),
hostingController.view.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor)
])
context.coordinator.hostingController = hostingController
return scrollView
}
func updateUIView(_ uiView: UIScrollView, context: Context) {
if isRefreshing.wrappedValue {
uiView.refreshControl?.beginRefreshing()
} else {
// Отложенное завершение, чтобы избежать цикла обновлений
DispatchQueue.main.async {
uiView.refreshControl?.endRefreshing()
}
}
context.coordinator.hostingController?.rootView = content
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject {
var parent: RefreshableScrollView
var hostingController: UIHostingController<Content>?
init(_ parent: RefreshableScrollView) {
self.parent = parent
}
@objc func handleRefresh() {
parent.onRefresh()
}
}
}

View File

@ -0,0 +1,63 @@
import SwiftUI
struct TopBarView: View {
var title: String
// Состояния для ProfileTab
@Binding var selectedAccount: String
@Binding var sheetType: ProfileTab.SheetType?
var accounts: [String]
var viewModel: LoginViewModel
var isHomeTab: Bool {
return title == "Home"
}
var isProfileTab: Bool {
return title == "Profile"
}
var body: some View {
VStack(spacing: 0) {
HStack {
if isHomeTab{
Text("Yobble")
.font(.largeTitle)
.fontWeight(.bold)
Spacer()
} else if isProfileTab {
Spacer()
Button(action: { sheetType = .accountShare }) {
HStack(spacing: 4) {
Text(selectedAccount)
.font(.headline)
.foregroundColor(.primary)
Image(systemName: "chevron.down")
.font(.subheadline)
.foregroundColor(.gray)
}
}
Spacer()
} else {
Text(title)
.font(.largeTitle)
.fontWeight(.bold)
Spacer()
}
if isProfileTab {
NavigationLink(destination: SettingsView(viewModel: viewModel)) {
Image(systemName: "wrench")
.imageScale(.large)
.foregroundColor(.primary)
}
}
}
.padding()
.frame(height: 50) // Стандартная высота для нав. бара
Divider()
}
.background(Color(UIColor.systemBackground))
}
}

View File

@ -9,16 +9,12 @@ import SwiftUI
struct ChatsTab: View { struct ChatsTab: View {
var body: some View { var body: some View {
NavigationView {
VStack { VStack {
Text("Чаты") Text("Здесь будут чаты")
.font(.largeTitle) .font(.title)
.bold() .foregroundColor(.gray)
.padding()
Spacer() Spacer()
} }
.navigationTitle("Чаты")
}
} }
} }

View File

@ -6,7 +6,6 @@ struct HomeTab: View {
@State private var isRefreshing = false @State private var isRefreshing = false
var body: some View { var body: some View {
NavigationView {
VStack { VStack {
if isLoading { if isLoading {
ProgressView("Загрузка ленты...") ProgressView("Загрузка ленты...")
@ -22,18 +21,12 @@ struct HomeTab: View {
} }
} }
} }
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .principal) {}
}
.onAppear { .onAppear {
if posts.isEmpty { if posts.isEmpty {
fetchData(isInitialLoad: true) fetchData(isInitialLoad: true)
} }
} }
} }
.navigationViewStyle(StackNavigationViewStyle())
}
private func fetchData(isInitialLoad: Bool = false) { private func fetchData(isInitialLoad: Bool = false) {
if isInitialLoad { if isInitialLoad {

View File

@ -11,8 +11,37 @@ struct MainView: View {
@ObservedObject var viewModel: LoginViewModel @ObservedObject var viewModel: LoginViewModel
@State private var selectedTab: Int = 0 @State private var selectedTab: Int = 0
// Состояния для TopBarView, когда активна вкладка Profile
@State private var selectedAccount = "@user1"
@State private var accounts = ["@user1", "@user2", "@user3"]
@State private var sheetType: ProfileTab.SheetType? = nil
private var tabTitle: String {
switch selectedTab {
case 0:
return "Home"
case 1:
return "Search"
case 2:
return "Chats"
case 3:
return "Profile"
default:
return "Home"
}
}
var body: some View { var body: some View {
NavigationView { // NavigationView нужен здесь для NavigationLink в TopBarView
VStack(spacing: 0) { VStack(spacing: 0) {
TopBarView(
title: tabTitle,
selectedAccount: $selectedAccount,
sheetType: $sheetType,
accounts: accounts,
viewModel: viewModel
)
ZStack { ZStack {
switch selectedTab { switch selectedTab {
case 0: case 0:
@ -22,7 +51,13 @@ struct MainView: View {
case 2: case 2:
ChatsTab() ChatsTab()
case 3: case 3:
ProfileTab(viewModel: viewModel) // Передаем состояния в ProfileTab
ProfileTab(
viewModel: viewModel,
sheetType: $sheetType,
selectedAccount: $selectedAccount,
accounts: $accounts
)
default: default:
HomeTab() HomeTab()
} }
@ -35,6 +70,23 @@ struct MainView: View {
} }
} }
.ignoresSafeArea(edges: .bottom) .ignoresSafeArea(edges: .bottom)
.navigationBarHidden(true) // Скрываем стандартный NavigationBar
.sheet(item: $sheetType) { type in
// Обработка sheet, перенесенная из ProfileTab
switch type {
case .accountShare:
AccountShareSheet(
isPresented: Binding(
get: { sheetType != nil },
set: { if !$0 { sheetType = nil } }
),
selectedAccount: $selectedAccount,
accounts: accounts
)
}
}
}
.navigationViewStyle(StackNavigationViewStyle()) // Важно для корректной работы
} }
} }

View File

@ -43,15 +43,6 @@ struct ProfileContentTabbedGrid: View {
.cornerRadius(8) .cornerRadius(8)
.font(.subheadline) .font(.subheadline)
Button {
// Создать пост
} label: {
Label("Создать", systemImage: "plus")
.font(.subheadline)
.padding(8)
.background(Color.blue.opacity(0.2))
.cornerRadius(8)
}
} else { } else {
TextField("Поиск", text: $searchQuery) TextField("Поиск", text: $searchQuery)
.padding(.horizontal, 10) .padding(.horizontal, 10)

View File

@ -4,13 +4,14 @@ struct ProfileTab: View {
@ObservedObject var viewModel: LoginViewModel @ObservedObject var viewModel: LoginViewModel
@State private var isContentLoaded = true @State private var isContentLoaded = true
@State private var accounts = ["@user1", "@user2", "@user3"] // Привязки к состояниям в MainView
@State private var selectedAccount = "@user1" @Binding var sheetType: SheetType?
@Binding var selectedAccount: String
@Binding var accounts: [String]
let followers = ["@alice", "@bob", "@charlie"] let followers = ["@alice", "@bob", "@charlie"]
let following = ["@dev", "@design", "@ios"] let following = ["@dev", "@design", "@ios"]
@State private var sheetType: SheetType? = nil
enum SheetType: Identifiable { enum SheetType: Identifiable {
case accountShare case accountShare
var id: Int { self.hashValue } var id: Int { self.hashValue }
@ -26,7 +27,7 @@ struct ProfileTab: View {
@State private var isShowingFollowing = false @State private var isShowingFollowing = false
var body: some View { var body: some View {
NavigationView { VStack {
if !isContentLoaded { if !isContentLoaded {
SplashScreenView() SplashScreenView()
} else { } else {
@ -51,7 +52,6 @@ struct ProfileTab: View {
}) { }) {
VStack(spacing: 12) { VStack(spacing: 12) {
header header
// .frame(minHeight: 300)
.frame(maxWidth: .infinity) .frame(maxWidth: .infinity)
.background(Color(.systemBackground)) .background(Color(.systemBackground))
@ -66,43 +66,8 @@ struct ProfileTab: View {
} }
} }
} }
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .principal) {
Button(action: { sheetType = .accountShare }) {
HStack(spacing: 4) {
Text(selectedAccount)
.font(.headline)
.foregroundColor(.primary)
Image(systemName: "chevron.down")
.font(.subheadline)
.foregroundColor(.gray)
} }
} }
}
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink(destination: SettingsView(viewModel: viewModel)) {
Image(systemName: "wrench")
.imageScale(.large)
}
}
}
.sheet(item: $sheetType) { type in
switch type {
case .accountShare:
AccountShareSheet(
isPresented: Binding(
get: { sheetType != nil },
set: { if !$0 { sheetType = nil } }
),
selectedAccount: $selectedAccount,
accounts: accounts
)
}
}
}
}
.navigationViewStyle(StackNavigationViewStyle())
.onAppear { .onAppear {
if allPosts.isEmpty { if allPosts.isEmpty {
fetchData(isInitialLoad: true) fetchData(isInitialLoad: true)

View File

@ -4,13 +4,17 @@ struct SearchTab: View {
@StateObject private var viewModel = SearchViewModel() @StateObject private var viewModel = SearchViewModel()
var body: some View { var body: some View {
NavigationView {
VStack { VStack {
SearchBar(text: $viewModel.searchText) SearchBar(text: $viewModel.searchText)
.padding(.top, 8) .padding(.top, 8)
List(viewModel.users) { user in List(viewModel.users) { user in
NavigationLink(destination: ProfileTab(viewModel: LoginViewModel())) { // Placeholder destination NavigationLink(destination: ProfileTab(
viewModel: LoginViewModel(),
sheetType: .constant(nil),
selectedAccount: .constant("@\(user.username)"),
accounts: .constant(["@\(user.username)"]))
) {
HStack { HStack {
Image(systemName: "person.crop.circle") Image(systemName: "person.crop.circle")
.resizable() .resizable()
@ -22,8 +26,6 @@ struct SearchTab: View {
} }
.listStyle(PlainListStyle()) .listStyle(PlainListStyle())
} }
.navigationTitle("Поиск")
}
} }
} }

View File

@ -32,6 +32,8 @@
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 */; };
1AB7F5162E32EC1C003756F3 /* RefreshableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB7F5142E32EC1C003756F3 /* RefreshableScrollView.swift */; };
1AB7F5172E32EC1C003756F3 /* TopBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AB7F5152E32EC1C003756F3 /* TopBarView.swift */; };
1ACE60F82E22F3DC00B37AC5 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE60F72E22F3DC00B37AC5 /* SettingsView.swift */; }; 1ACE60F82E22F3DC00B37AC5 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE60F72E22F3DC00B37AC5 /* SettingsView.swift */; };
1ACE61012E22F55C00B37AC5 /* EditProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61002E22F55C00B37AC5 /* EditProfileView.swift */; }; 1ACE61012E22F55C00B37AC5 /* EditProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61002E22F55C00B37AC5 /* EditProfileView.swift */; };
1ACE61052E22F56800B37AC5 /* SecuritySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61042E22F56800B37AC5 /* SecuritySettingsView.swift */; }; 1ACE61052E22F56800B37AC5 /* SecuritySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61042E22F56800B37AC5 /* SecuritySettingsView.swift */; };
@ -40,7 +42,6 @@
1ACE61192E22FF1400B37AC5 /* Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61182E22FF1400B37AC5 /* Post.swift */; }; 1ACE61192E22FF1400B37AC5 /* Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61182E22FF1400B37AC5 /* Post.swift */; };
1ACE61212E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61202E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift */; }; 1ACE61212E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ACE61202E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift */; };
1AD757CD2E27608C0069C1FD /* PostFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AD757CC2E27608C0069C1FD /* PostFeedView.swift */; }; 1AD757CD2E27608C0069C1FD /* PostFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AD757CC2E27608C0069C1FD /* PostFeedView.swift */; };
1AD757D12E27640F0069C1FD /* RefreshableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AD757D02E27640F0069C1FD /* RefreshableScrollView.swift */; };
1AE587052E23264800254F06 /* PostService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE587042E23264800254F06 /* PostService.swift */; }; 1AE587052E23264800254F06 /* PostService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE587042E23264800254F06 /* PostService.swift */; };
1AE587252E23337000254F06 /* ProfileContentGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE587242E23337000254F06 /* ProfileContentGrid.swift */; }; 1AE587252E23337000254F06 /* ProfileContentGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE587242E23337000254F06 /* ProfileContentGrid.swift */; };
1AEE5EAB2E21A83200A3DCA3 /* HomeTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */; }; 1AEE5EAB2E21A83200A3DCA3 /* HomeTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */; };
@ -78,6 +79,8 @@
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>"; };
1AB7F5142E32EC1C003756F3 /* RefreshableScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshableScrollView.swift; sourceTree = "<group>"; };
1AB7F5152E32EC1C003756F3 /* TopBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopBarView.swift; sourceTree = "<group>"; };
1ACE60F72E22F3DC00B37AC5 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; }; 1ACE60F72E22F3DC00B37AC5 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
1ACE61002E22F55C00B37AC5 /* EditProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileView.swift; sourceTree = "<group>"; }; 1ACE61002E22F55C00B37AC5 /* EditProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileView.swift; sourceTree = "<group>"; };
1ACE61042E22F56800B37AC5 /* SecuritySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecuritySettingsView.swift; sourceTree = "<group>"; }; 1ACE61042E22F56800B37AC5 /* SecuritySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecuritySettingsView.swift; sourceTree = "<group>"; };
@ -86,7 +89,6 @@
1ACE61182E22FF1400B37AC5 /* Post.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Post.swift; sourceTree = "<group>"; }; 1ACE61182E22FF1400B37AC5 /* Post.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Post.swift; sourceTree = "<group>"; };
1ACE61202E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileContentTabbedGrid.swift; sourceTree = "<group>"; }; 1ACE61202E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileContentTabbedGrid.swift; sourceTree = "<group>"; };
1AD757CC2E27608C0069C1FD /* PostFeedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostFeedView.swift; sourceTree = "<group>"; }; 1AD757CC2E27608C0069C1FD /* PostFeedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostFeedView.swift; sourceTree = "<group>"; };
1AD757D02E27640F0069C1FD /* RefreshableScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RefreshableScrollView.swift; path = Components/RefreshableScrollView.swift; sourceTree = "<group>"; };
1AE587042E23264800254F06 /* PostService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostService.swift; sourceTree = "<group>"; }; 1AE587042E23264800254F06 /* PostService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostService.swift; sourceTree = "<group>"; };
1AE587242E23337000254F06 /* ProfileContentGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileContentGrid.swift; sourceTree = "<group>"; }; 1AE587242E23337000254F06 /* ProfileContentGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileContentGrid.swift; sourceTree = "<group>"; };
1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTab.swift; sourceTree = "<group>"; }; 1AEE5EAA2E21A83200A3DCA3 /* HomeTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTab.swift; sourceTree = "<group>"; };
@ -125,7 +127,7 @@
1A7940792DF77BC2002569DA /* Shared */ = { 1A7940792DF77BC2002569DA /* Shared */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
1AD757D02E27640F0069C1FD /* RefreshableScrollView.swift */, 1AB7F5132E32EBF1003756F3 /* Components */,
1A7940FA2DF7B898002569DA /* Resources */, 1A7940FA2DF7B898002569DA /* Resources */,
1A7940E52DF7B341002569DA /* Services */, 1A7940E52DF7B341002569DA /* Services */,
1A7940A02DF77DCD002569DA /* Network */, 1A7940A02DF77DCD002569DA /* Network */,
@ -222,6 +224,15 @@
path = Resources; path = Resources;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
1AB7F5132E32EBF1003756F3 /* Components */ = {
isa = PBXGroup;
children = (
1AB7F5142E32EC1C003756F3 /* RefreshableScrollView.swift */,
1AB7F5152E32EC1C003756F3 /* TopBarView.swift */,
);
path = Components;
sourceTree = "<group>";
};
1ACE60FF2E22F54700B37AC5 /* Settings */ = { 1ACE60FF2E22F54700B37AC5 /* Settings */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -389,6 +400,7 @@
1A7940B02DF77E26002569DA /* LoginView.swift in Sources */, 1A7940B02DF77E26002569DA /* LoginView.swift in Sources */,
1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */, 1A79410C2DF7C81D002569DA /* RegistrationView.swift in Sources */,
1A0276112DF9247000D8BC53 /* CustomTextField.swift in Sources */, 1A0276112DF9247000D8BC53 /* CustomTextField.swift in Sources */,
1AB7F5172E32EC1C003756F3 /* TopBarView.swift in Sources */,
1A7940CE2DF7A9AA002569DA /* ProfileTab.swift in Sources */, 1A7940CE2DF7A9AA002569DA /* ProfileTab.swift in Sources */,
1ACE61212E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift in Sources */, 1ACE61212E22FFD000B37AC5 /* ProfileContentTabbedGrid.swift in Sources */,
1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */, 1AB4F8F72E22ECAC002B6E40 /* FollowingView.swift in Sources */,
@ -398,6 +410,7 @@
1A6FB9552E32D2B200E89EBE /* CustomTabBar.swift in Sources */, 1A6FB9552E32D2B200E89EBE /* CustomTabBar.swift in Sources */,
1A0276032DF909F900D8BC53 /* refreshtokenex.swift in Sources */, 1A0276032DF909F900D8BC53 /* refreshtokenex.swift in Sources */,
1A7940B62DF77F21002569DA /* MainView.swift in Sources */, 1A7940B62DF77F21002569DA /* MainView.swift in Sources */,
1AB7F5162E32EC1C003756F3 /* RefreshableScrollView.swift in Sources */,
1A7940E22DF7B1C5002569DA /* KeychainService.swift in Sources */, 1A7940E22DF7B1C5002569DA /* KeychainService.swift in Sources */,
1A7940A62DF77DF5002569DA /* User.swift in Sources */, 1A7940A62DF77DF5002569DA /* User.swift in Sources */,
1A7940A22DF77DE9002569DA /* AuthService.swift in Sources */, 1A7940A22DF77DE9002569DA /* AuthService.swift in Sources */,
@ -413,7 +426,6 @@
1A7940AA2DF77E05002569DA /* LoginViewModel.swift in Sources */, 1A7940AA2DF77E05002569DA /* LoginViewModel.swift in Sources */,
1AB4F8F32E22EC9F002B6E40 /* FollowersView.swift in Sources */, 1AB4F8F32E22EC9F002B6E40 /* FollowersView.swift in Sources */,
1A79408D2DF77BC3002569DA /* yobbleApp.swift in Sources */, 1A79408D2DF77BC3002569DA /* yobbleApp.swift in Sources */,
1AD757D12E27640F0069C1FD /* RefreshableScrollView.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };