// // SideMenuView.swift // uSTADIUM // // Created by Omar Hegazy on 6/13/24. // Copyright © 2024 uSTADIUM. All rights reserved. // import SwiftUI struct SideMenuView: View { @ObservedObject var viewModel: SideMenuViewModel var body: some View { NavigationStack { ZStack { Color.containerBackground .edgesIgnoringSafeArea(.all) ScrollView { VStack(alignment: .leading, spacing: 16) { // User profile section if let user = viewModel.user { HStack(spacing: 12) { ProfileImageView(url: user.getProfileImageURL()) .frame(width: 50, height: 50) .clipShape(Circle()) VStack(alignment: .leading, spacing: 4) { Text(user.nickname) .font(.headline) user.attributedFullAt() .font(.subheadline) .foregroundColor(.gray) } Spacer() } .padding(.horizontal) .padding(.vertical, 8) .background(Color.containerBackground) .cornerRadius(8) .padding(.horizontal) } // MARK: - Side Menu Sections VStack(alignment: .leading, spacing: 8) { SideMenuSection(header: "PROFILE", options: viewModel.profileOptions, onTap: viewModel.handleProfileOptionTap) SideMenuSection(header: "COOL STUFF", options: viewModel.coolStuffOptions, onTap: viewModel.handleCoolStuffOptionTap) if viewModel.isAdmin { SideMenuSection(header: "ADMIN", options: viewModel.adminOptions, onTap: viewModel.handleAdminOptionTap) } } .padding(.horizontal) } } } } .onAppear { viewModel.navigateTo = { vc in if let rootVC = UIApplication.shared.windows.first?.rootViewController { rootVC.dismiss(animated: true) { if let navVC = rootVC as? UINavigationController { navVC.pushViewController(vc, animated: true) } else { rootVC.present(vc, animated: true, completion: nil) } } } } } } } struct SideMenuSection: View { var header: String var options: [SideMenuOBJ] var onTap: (SideMenuOBJ) -> Void var body: some View { VStack(alignment: .leading, spacing: 4) { Text(header) .font(.headline) .padding(.leading) .padding(.top, 8) ForEach(options, id: \.label) { option in MenuOptionRow(option: option) .onTapGesture { onTap(option) print("Option chosen: \(option.label)") } } } .background(Color.containerBackground) .cornerRadius(8) } } struct MenuOptionRow: View { var option: SideMenuOBJ var body: some View { HStack { Image(uiImage: option.image) .renderingMode(.template) .foregroundColor(.primary) .frame(width: 24, height: 24) Text(option.label) .foregroundColor(.primary) .font(.body) Spacer() } .padding() } }