129 lines
4.1 KiB
Swift
129 lines
4.1 KiB
Swift
//
|
||
// MainView.swift
|
||
// VolnahubApp
|
||
//
|
||
// Created by cheykrym on 09/06/2025.
|
||
//
|
||
|
||
import SwiftUI
|
||
|
||
struct MainView: View {
|
||
@ObservedObject var viewModel: LoginViewModel
|
||
@State private var selectedTab: Int = 0
|
||
|
||
// Состояния для TopBarView
|
||
@State private var selectedAccount = "@user1"
|
||
@State private var accounts = ["@user1", "@user2", "@user3"]
|
||
@State private var sheetType: ProfileTab.SheetType? = nil
|
||
|
||
// Состояния для скрытия TopBar
|
||
@State private var topBarVisible = true
|
||
@State private var lastScrollY: CGFloat = 0
|
||
|
||
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 {
|
||
NavigationView {
|
||
VStack(spacing: 0) {
|
||
if topBarVisible {
|
||
TopBarView(
|
||
title: tabTitle,
|
||
selectedAccount: $selectedAccount,
|
||
sheetType: $sheetType,
|
||
accounts: accounts,
|
||
viewModel: viewModel
|
||
)
|
||
.transition(AnyTransition.move(edge: .top).combined(with: .opacity))
|
||
}
|
||
|
||
ZStack {
|
||
switch selectedTab {
|
||
case 0:
|
||
HomeTab(onScroll: handleScroll)
|
||
case 1:
|
||
SearchTab() // SearchTab не имеет скролла, поэтому onScroll не нужен
|
||
case 2:
|
||
ChatsTab() // ChatsTab тоже
|
||
case 3:
|
||
ProfileTab(
|
||
viewModel: viewModel,
|
||
sheetType: $sheetType,
|
||
selectedAccount: $selectedAccount,
|
||
accounts: $accounts,
|
||
onScroll: handleScroll
|
||
)
|
||
default:
|
||
HomeTab(onScroll: handleScroll)
|
||
}
|
||
}
|
||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||
|
||
if topBarVisible {
|
||
CustomTabBar(selectedTab: $selectedTab) {
|
||
print("Create button tapped")
|
||
}
|
||
}
|
||
}
|
||
.ignoresSafeArea(edges: .bottom)
|
||
.navigationBarHidden(true)
|
||
.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())
|
||
}
|
||
|
||
private func handleScroll(offset: CGPoint) {
|
||
let currentY = offset.y
|
||
|
||
// Показываем бар, если скроллим вверх или дошли до верха
|
||
// if currentY < lastScrollY || currentY <= 0 {
|
||
// if !topBarVisible {
|
||
// withAnimation(.default) {
|
||
// topBarVisible = true
|
||
// }
|
||
// }
|
||
// }
|
||
// // Скрываем, если скроллим вниз и отступили от верха
|
||
// else if currentY > lastScrollY && currentY > 50 {
|
||
// if topBarVisible {
|
||
// withAnimation(.default) {
|
||
// topBarVisible = false
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
lastScrollY = currentY
|
||
}
|
||
}
|
||
|
||
struct MainView_Previews: PreviewProvider {
|
||
static var previews: some View {
|
||
let mockViewModel = LoginViewModel()
|
||
MainView(viewModel: mockViewModel)
|
||
}
|
||
}
|