214 lines
7.5 KiB
Swift
214 lines
7.5 KiB
Swift
import SwiftUI
|
|
|
|
// --- HELPER STRUCTS & EXTENSIONS ---
|
|
|
|
// Dummy data for the account list
|
|
struct Account: Identifiable {
|
|
let id = UUID()
|
|
let name: String
|
|
let username: String
|
|
let isCurrent: Bool
|
|
}
|
|
|
|
// Custom Transition for older Xcode versions
|
|
extension AnyTransition {
|
|
static var slideAndFade: AnyTransition {
|
|
let insertion = AnyTransition.move(edge: .top).combined(with: .opacity)
|
|
let removal = AnyTransition.move(edge: .top).combined(with: .opacity)
|
|
return .asymmetric(insertion: insertion, removal: removal)
|
|
}
|
|
}
|
|
|
|
// Helper Views for buttons
|
|
struct SideMenuButton: View {
|
|
let icon: String
|
|
let title: String
|
|
let action: () -> Void
|
|
|
|
var body: some View {
|
|
Button(action: action) {
|
|
HStack(spacing: 15) {
|
|
Image(systemName: icon)
|
|
.font(.title3)
|
|
.frame(width: 30)
|
|
Text(title)
|
|
.font(.subheadline)
|
|
}
|
|
.foregroundColor(.primary)
|
|
.padding(.vertical, 8)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct SideMenuFooterButton: View {
|
|
let icon: String
|
|
let title: String
|
|
let action: () -> Void
|
|
|
|
var body: some View {
|
|
Button(action: action) {
|
|
VStack {
|
|
Image(systemName: icon)
|
|
.font(.title2)
|
|
Text(title)
|
|
.font(.caption2)
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
.foregroundColor(.primary)
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
}
|
|
|
|
|
|
// --- MAIN VIEW ---
|
|
|
|
struct SideMenuView: View {
|
|
@ObservedObject var viewModel: LoginViewModel
|
|
@EnvironmentObject var themeManager: ThemeManager
|
|
@Environment(\.colorScheme) var colorScheme
|
|
@Binding var isPresented: Bool
|
|
@State private var isAccountListExpanded = false
|
|
@State private var navigateToSettings = false
|
|
@State private var navigateToFAQ = false
|
|
|
|
// Adjustable paddings
|
|
private let topPadding: CGFloat = 66
|
|
private let bottomPadding: CGFloat = 34
|
|
|
|
private var themeToggleButton: some View {
|
|
Button(action: {
|
|
themeManager.toggleTheme(from: colorScheme)
|
|
}) {
|
|
Image(systemName: iconName)
|
|
.font(.title2)
|
|
.foregroundColor(.primary)
|
|
}
|
|
}
|
|
|
|
private var iconName: String {
|
|
let effectiveScheme: ColorScheme
|
|
switch themeManager.theme {
|
|
case .system:
|
|
effectiveScheme = colorScheme
|
|
case .light:
|
|
effectiveScheme = .light
|
|
case .dark:
|
|
effectiveScheme = .dark
|
|
}
|
|
|
|
return effectiveScheme == .dark ? "sun.max.fill" : "moon.fill"
|
|
}
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 0) {
|
|
NavigationLink(
|
|
destination: SettingsView(viewModel: viewModel),
|
|
isActive: $navigateToSettings
|
|
) {
|
|
EmptyView()
|
|
}
|
|
NavigationLink(
|
|
destination: FAQView(),
|
|
isActive: $navigateToFAQ
|
|
) {
|
|
EmptyView()
|
|
}
|
|
|
|
ScrollView(showsIndicators: false) {
|
|
VStack(alignment: .leading, spacing: 0) { // Parent VStack
|
|
|
|
// Menu Items
|
|
VStack(alignment: .leading, spacing: 20) {
|
|
// Section 1
|
|
VStack(alignment: .leading, spacing: 7) {
|
|
SideMenuButton(icon: "person.2.fill", title: NSLocalizedString("Добавить друзей", comment: "Add friends"), action: {})
|
|
SideMenuButton(icon: "star.fill", title: NSLocalizedString("Fun Fest", comment: "Fun Fest"), action: {})
|
|
SideMenuButton(icon: "lightbulb.fill", title: NSLocalizedString("Центр авторов", comment: "Creator Center"), action: {})
|
|
}
|
|
.padding(.top, topPadding)
|
|
|
|
Divider()
|
|
|
|
// Section 2
|
|
VStack(alignment: .leading, spacing: 7) {
|
|
// Text("CATEGORY").font(.caption2).foregroundColor(.secondary)
|
|
SideMenuButton(icon: "doc.text", title: NSLocalizedString("Черновики", comment: "Drafts"), action: {})
|
|
SideMenuButton(icon: "bubble.left", title: NSLocalizedString("Мои комментарии", comment: "My Comments"), action: {})
|
|
SideMenuButton(icon: "clock", title: NSLocalizedString("История", comment: "History"), action: {})
|
|
SideMenuButton(icon: "arrow.down.circle", title: NSLocalizedString("Мои загрузки", comment: "My Downloads"), action: {})
|
|
}
|
|
|
|
Divider()
|
|
|
|
// Section 3
|
|
VStack(alignment: .leading, spacing: 7) {
|
|
// Text("SERVICES").font(.caption2).foregroundColor(.secondary)
|
|
SideMenuButton(icon: "shippingbox", title: NSLocalizedString("Заказы", comment: "Orders"), action: {})
|
|
SideMenuButton(icon: "cart", title: NSLocalizedString("Корзина", comment: "Cart"), action: {})
|
|
SideMenuButton(icon: "wallet.pass", title: NSLocalizedString("Кошелёк", comment: "Wallet"), action: {})
|
|
}
|
|
|
|
Divider()
|
|
|
|
// Section 4
|
|
VStack(alignment: .leading, spacing: 15) {
|
|
SideMenuButton(icon: "square.grid.2x2", title: NSLocalizedString("Мини-приложения", comment: "Applets"), action: {})
|
|
}
|
|
}
|
|
.padding()
|
|
}
|
|
.frame(maxWidth: .infinity, alignment: .leading) // Align to the left
|
|
}
|
|
.clipped()
|
|
|
|
Spacer()
|
|
|
|
// Footer
|
|
HStack(spacing: 0) {
|
|
SideMenuFooterButton(
|
|
icon: "qrcode.viewfinder",
|
|
title: NSLocalizedString("Скан", comment: "Scan"),
|
|
action: {}
|
|
)
|
|
Spacer(minLength: 40)
|
|
SideMenuFooterButton(
|
|
icon: "questionmark.circle",
|
|
title: NSLocalizedString("Помощь", comment: "Help Center")
|
|
) {
|
|
withAnimation(.easeInOut) {
|
|
isPresented = false
|
|
}
|
|
navigateToFAQ = true
|
|
}
|
|
Spacer(minLength: 40)
|
|
SideMenuFooterButton(
|
|
icon: "gear",
|
|
title: NSLocalizedString("Настройки", comment: "Settings")
|
|
) {
|
|
withAnimation(.easeInOut) {
|
|
isPresented = false
|
|
}
|
|
navigateToSettings = true
|
|
}
|
|
}
|
|
.padding(.horizontal, 28)
|
|
.padding(.vertical)
|
|
.padding(.bottom, bottomPadding)
|
|
}
|
|
.background(Color(UIColor.systemBackground))
|
|
}
|
|
}
|
|
|
|
// --- PREVIEW ---
|
|
|
|
struct SideMenuView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
let mockViewModel = LoginViewModel()
|
|
NavigationView {
|
|
SideMenuView(viewModel: mockViewModel, isPresented: .constant(true))
|
|
.environmentObject(ThemeManager())
|
|
}
|
|
}
|
|
}
|