big update

This commit is contained in:
15lu.akari
2025-08-26 23:37:39 +03:00
parent 6b88875bee
commit a87a3d12ab
34 changed files with 803 additions and 282 deletions

View File

@ -3,10 +3,12 @@ import SwiftUI
struct ContentView: View {
@EnvironmentObject var appState: AppState
@State private var showMenu = false
@State private var isLoading = true // состояние загрузки
var body: some View {
NavigationStack {
ZStack {
// Основной контент
VStack(spacing: 10) {
HStack(spacing: 10) {
RouteView()
@ -22,8 +24,10 @@ struct ContentView: View {
}
}
.padding()
.blur(radius: isLoading ? 5 : 0) // слегка размываем, пока загрузка
.disabled(isLoading) // блокируем взаимодействие с контентом при загрузке
// Плавающая кнопка в правом нижнем углу
// Плавающая кнопка
VStack {
Spacer()
HStack {
@ -33,35 +37,60 @@ struct ContentView: View {
showMenu.toggle()
}
}) {
Image(systemName: "line.3.horizontal")
.font(.system(size: 24, weight: .bold))
.foregroundColor(.white)
.padding()
.background(Color.blue)
Image("open_menu_icon")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 24, height: 24)
.padding(10)
.background(Color(hex: 0x806C59))
.clipShape(Circle())
.shadow(radius: 5)
}
.padding(.trailing, 20)
// .padding(.bottom, -20) // Убираем отрицательный паддинг
.padding(.bottom, -20) // Добавляем паддинг, чтобы кнопка не перекрывалась
.padding(.bottom, -20)
}
}
// Используем кастомное BottomMenu
// BottomMenu
if showMenu {
// Используем Binding для двусторонней связи
BottomMenu(isPresented: $showMenu)
.transition(.move(edge: .bottom))
// Добавляем игнорирование safe area сверху, если BottomMenu
// должно полностью закрывать контент, но обычно для
// BottomSheet это не требуется, GeometryReader в BottomMenu
// уже делает нужное растяжение.
.animation(.spring(response: 0.35, dampingFraction: 0.9), value: showMenu)
}
// Экран загрузки
if isLoading {
ZStack {
Color(hex: 0x806C59)
.edgesIgnoringSafeArea(.all)
ProgressView()
.progressViewStyle(CircularProgressViewStyle(tint: .white))
.scaleEffect(1.5)
VStack {
Spacer()
HStack {
Spacer()
Image("waiting_screen_logo")
.resizable()
.scaledToFit()
.frame(width: 200)
.padding(20)
}
}
}
.transition(.opacity)
.zIndex(1)
}
}
}
.task {
await fetchRoutes()
// Убираем экран загрузки через 2 секунды
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
withAnimation(.easeOut(duration: 0.5)) {
isLoading = false
}
}
}
.preferredColorScheme(.light)
}