From b1c36a1717a0b63edc21f23934c389d53b5a6462 Mon Sep 17 00:00:00 2001 From: Caitlyn Jin Date: Mon, 28 Oct 2024 15:05:24 -0400 Subject: [PATCH 1/6] Addressed Matt's comments - Removed TabView and used environment object to allow tab bar to be hidden when necessary - Allowed rescaling of font size for class title - Added instructor label --- Uplift/Views/Classes/ClassDetailView.swift | 4 +++- Uplift/Views/ClassesView.swift | 3 +++ Uplift/Views/MainView.swift | 15 ++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Uplift/Views/Classes/ClassDetailView.swift b/Uplift/Views/Classes/ClassDetailView.swift index 3d1d5d2..cac986d 100644 --- a/Uplift/Views/Classes/ClassDetailView.swift +++ b/Uplift/Views/Classes/ClassDetailView.swift @@ -99,13 +99,15 @@ struct ClassDetailView: View { .font(Constants.Fonts.s1) .foregroundStyle(Constants.Colors.white) .multilineTextAlignment(.center) + .minimumScaleFactor(0.01) + .lineLimit(2) Text(classInstance.location) .font(Constants.Fonts.bodyNormal) .foregroundStyle(Constants.Colors.white) .multilineTextAlignment(.center) - Text(classInstance.instructor.uppercased()) + Text("INSTRUCTOR: \(classInstance.instructor.uppercased())") .font(Constants.Fonts.h2) .foregroundStyle(Constants.Colors.white) .multilineTextAlignment(.center) diff --git a/Uplift/Views/ClassesView.swift b/Uplift/Views/ClassesView.swift index 52f32d6..40686b3 100644 --- a/Uplift/Views/ClassesView.swift +++ b/Uplift/Views/ClassesView.swift @@ -13,6 +13,7 @@ struct ClassesView: View { // MARK: - Properties + @EnvironmentObject var tabBarProp: TabBarProperty @StateObject private var viewModel = ViewModel() @State private var weeks: [Int] = [0, 1, 2] // Integers represent the number of weeks from the current week @@ -184,6 +185,8 @@ struct ClassesView: View { ForEach(viewModel.filteredClasses, id: \.self) { classInstance in NavigationLink { ClassDetailView(classInstance: classInstance, viewModel: viewModel) + .onAppear { tabBarProp.hidden = true } + .onDisappear { tabBarProp.hidden = false } } label: { ClassCell(classInstance: classInstance, viewModel: viewModel) } diff --git a/Uplift/Views/MainView.swift b/Uplift/Views/MainView.swift index 64da5a7..519a7e3 100644 --- a/Uplift/Views/MainView.swift +++ b/Uplift/Views/MainView.swift @@ -14,6 +14,7 @@ struct MainView: View { // MARK: - Properties @State private var selectedTab: Screen = .home + @StateObject var tabBarProp = TabBarProperty() @StateObject private var viewModel = ViewModel() // MARK: - UI @@ -23,15 +24,15 @@ struct MainView: View { HomeView(popUpGiveaway: $viewModel.popUpGiveaway) ZStack(alignment: .bottom) { - TabView(selection: $selectedTab) { + switch selectedTab { + case .home: HomeView(popUpGiveaway: $viewModel.popUpGiveaway) - .tag(Screen.home) - + case .classes: ClassesView() - .tag(Screen.classes) + .environmentObject(tabBarProp) } - tabBar + !tabBarProp.hidden ? tabBar : nil } if viewModel.popUpGiveaway { @@ -131,6 +132,10 @@ extension MainView { } +final class TabBarProperty: ObservableObject { + @Published var hidden: Bool = false +} + #Preview { MainView() } From ff4d1c5e19b2cea58dc8870f2bb788cc22d1fdf7 Mon Sep 17 00:00:00 2001 From: Richie Sun <105038960+rs929@users.noreply.github.com> Date: Mon, 4 Nov 2024 12:41:00 -0500 Subject: [PATCH 2/6] Merge Release to Main (#69) * Add support for custom GraphQL errors * Remove codegen build phase * Implemented classes page - Performed soft reset and squashing the previous commits - Implemented ClassesView, ClassCell, ClassDetailView, NextSessionCell, and ClassesViewModel - Created FitnessClass and FitnessClassInstance models - Other modifications to create the classes screens * Comment out giveaway modal on home * Update Package.resolved * Updated build number * Release 2.5.8 Build 29 (#68) * Add support for custom GraphQL errors * Update queries * Remove codegen build phase * Implemented classes page - Performed soft reset and squashing the previous commits - Implemented ClassesView, ClassCell, ClassDetailView, NextSessionCell, and ClassesViewModel - Created FitnessClass and FitnessClassInstance models - Other modifications to create the classes screens * Comment out giveaway modal on home * Optimized filtered classes * Optimized next sessions * Cleaned up code * Update fragments and mutations * Fixed error due to updated mutation * Update project.pbxproj * Create Package.resolved --------- Co-authored-by: Vin Bui Co-authored-by: Vin Bui <75594943+vinnie4k@users.noreply.github.com> --------- Co-authored-by: Vin Bui Co-authored-by: Caitlyn Jin Co-authored-by: Caitlyn Jin <118781810+caitlynjin@users.noreply.github.com> Co-authored-by: Vin Bui <75594943+vinnie4k@users.noreply.github.com> --- Uplift.xcodeproj/project.pbxproj | 4 ++-- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Uplift.xcodeproj/project.pbxproj b/Uplift.xcodeproj/project.pbxproj index 6328343..1fefbd0 100644 --- a/Uplift.xcodeproj/project.pbxproj +++ b/Uplift.xcodeproj/project.pbxproj @@ -902,7 +902,7 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ZGMCXU7X3U; ENABLE_PREVIEWS = YES; @@ -946,7 +946,7 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; DEVELOPMENT_TEAM = ZGMCXU7X3U; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; diff --git a/Uplift.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Uplift.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 1b43a50..7895aaf 100644 --- a/Uplift.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Uplift.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "6565fb05ae3aacf128848c54688822700a2e2ad52cea8ff7f0f38d019500dd55", + "originHash" : "2ea44cae774f449262148416f934e8005eea036ec9391c4c4db6e718c0e4edd8", "pins" : [ { "identity" : "abseil-cpp-binary", From 99b59ebfc243bd4c5e4e5ce8d40d7408ba2a3dc5 Mon Sep 17 00:00:00 2001 From: Caitlyn Jin Date: Thu, 7 Nov 2024 14:22:06 -0500 Subject: [PATCH 3/6] Fixed spacing of tabbar and transition --- Uplift/Views/ClassesView.swift | 12 ++++++++++-- Uplift/Views/MainView.swift | 6 ++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Uplift/Views/ClassesView.swift b/Uplift/Views/ClassesView.swift index 40686b3..9181f29 100644 --- a/Uplift/Views/ClassesView.swift +++ b/Uplift/Views/ClassesView.swift @@ -185,8 +185,16 @@ struct ClassesView: View { ForEach(viewModel.filteredClasses, id: \.self) { classInstance in NavigationLink { ClassDetailView(classInstance: classInstance, viewModel: viewModel) - .onAppear { tabBarProp.hidden = true } - .onDisappear { tabBarProp.hidden = false } + .onAppear { + withAnimation(.easeIn(duration: 0.05)) { + tabBarProp.hidden = true + } + } + .onDisappear { + withAnimation(.easeIn(duration: 0.05)) { + tabBarProp.hidden = false + } + } } label: { ClassCell(classInstance: classInstance, viewModel: viewModel) } diff --git a/Uplift/Views/MainView.swift b/Uplift/Views/MainView.swift index 519a7e3..eaff7f2 100644 --- a/Uplift/Views/MainView.swift +++ b/Uplift/Views/MainView.swift @@ -21,9 +21,7 @@ struct MainView: View { var body: some View { ZStack { - HomeView(popUpGiveaway: $viewModel.popUpGiveaway) - - ZStack(alignment: .bottom) { + VStack(spacing: 0) { switch selectedTab { case .home: HomeView(popUpGiveaway: $viewModel.popUpGiveaway) @@ -32,7 +30,7 @@ struct MainView: View { .environmentObject(tabBarProp) } - !tabBarProp.hidden ? tabBar : nil + !tabBarProp.hidden ? tabBar.transition(.move(edge: .bottom)) : nil } if viewModel.popUpGiveaway { From a6db4948daac5226642564bcf65c412735a847a7 Mon Sep 17 00:00:00 2001 From: Caitlyn Jin Date: Sun, 10 Nov 2024 21:19:51 -0500 Subject: [PATCH 4/6] Fix spacing of tab bar --- Uplift/Utils/Constants.swift | 1 + Uplift/Views/ClassesView.swift | 2 +- Uplift/Views/HomeView.swift | 2 +- Uplift/Views/MainView.swift | 5 +++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Uplift/Utils/Constants.swift b/Uplift/Utils/Constants.swift index 3a33ce1..b1af428 100644 --- a/Uplift/Utils/Constants.swift +++ b/Uplift/Utils/Constants.swift @@ -126,6 +126,7 @@ struct Constants { static let gymDetailHorizontal: CGFloat = 24 static let gymDetailSpacing: CGFloat = 20 static let homeHorizontal: CGFloat = 16 + static let tabBarHeight: CGFloat = 64 } /// Shadows usde in Uplift's design system. diff --git a/Uplift/Views/ClassesView.swift b/Uplift/Views/ClassesView.swift index 9181f29..4dec167 100644 --- a/Uplift/Views/ClassesView.swift +++ b/Uplift/Views/ClassesView.swift @@ -64,7 +64,7 @@ struct ClassesView: View { calendarView classesOnDay } - .padding(.bottom, 32) + .padding(.bottom, 32 + Constants.Padding.tabBarHeight) } .refreshable { viewModel.refreshClasses() diff --git a/Uplift/Views/HomeView.swift b/Uplift/Views/HomeView.swift index 81f6f1e..5cc46da 100644 --- a/Uplift/Views/HomeView.swift +++ b/Uplift/Views/HomeView.swift @@ -174,7 +174,7 @@ struct HomeView: View { EdgeInsets( top: 12, leading: Constants.Padding.homeHorizontal, - bottom: 32, + bottom: 32 + Constants.Padding.tabBarHeight, trailing: Constants.Padding.homeHorizontal ) ) diff --git a/Uplift/Views/MainView.swift b/Uplift/Views/MainView.swift index eaff7f2..633e299 100644 --- a/Uplift/Views/MainView.swift +++ b/Uplift/Views/MainView.swift @@ -29,7 +29,8 @@ struct MainView: View { ClassesView() .environmentObject(tabBarProp) } - + } + .overlay(alignment: .bottom) { !tabBarProp.hidden ? tabBar.transition(.move(edge: .bottom)) : nil } @@ -75,7 +76,7 @@ struct MainView: View { Spacer() } - .frame(height: 64) + .frame(height: Constants.Padding.tabBarHeight) .background(Constants.Colors.yellow) .ignoresSafeArea(.all) } From 8afeb46f13259befdf92b5890f4e5c505cfd53ea Mon Sep 17 00:00:00 2001 From: Caitlyn Jin Date: Mon, 11 Nov 2024 02:13:52 -0500 Subject: [PATCH 5/6] Update class detail page navigation - Removed navigation to new pages of class details - Instead updates information on current class detail page when clicking a next sessions cell - Includes animation of scrolling back to top of screen --- Uplift/Views/Classes/ClassDetailView.swift | 50 ++++++++++++---------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/Uplift/Views/Classes/ClassDetailView.swift b/Uplift/Views/Classes/ClassDetailView.swift index cac986d..a3f7fed 100644 --- a/Uplift/Views/Classes/ClassDetailView.swift +++ b/Uplift/Views/Classes/ClassDetailView.swift @@ -13,10 +13,10 @@ struct ClassDetailView: View { // MARK: - Properties - let classInstance: FitnessClassInstance - - @ObservedObject var viewModel: ClassesView.ViewModel + @State var classInstance: FitnessClassInstance @Environment(\.dismiss) private var dismiss + private let topViewId: String = "topId" + @ObservedObject var viewModel: ClassesView.ViewModel // MARK: - Constants @@ -38,28 +38,31 @@ struct ClassDetailView: View { var body: some View { NavigationStack { - ScrollView(.vertical, showsIndicators: false) { - scrollContent - } - .ignoresSafeArea(.all) - .padding(.bottom) - .navigationBarBackButtonHidden(true) - .toolbarBackground(.hidden, for: .navigationBar) - .toolbar { - ToolbarItem(placement: .topBarLeading) { - NavBackButton(dismiss: dismiss) + ScrollViewReader { reader in + ScrollView(.vertical, showsIndicators: false) { + scrollContent(reader) + } + .ignoresSafeArea(.all) + .padding(.bottom) + .navigationBarBackButtonHidden(true) + .toolbarBackground(.hidden, for: .navigationBar) + .toolbar { + ToolbarItem(placement: .topBarLeading) { + NavBackButton(dismiss: dismiss) + } + } + .background(Constants.Colors.white) + .onAppear { + viewModel.fetchAllClasses() } - } - .background(Constants.Colors.white) - .onAppear { - viewModel.fetchAllClasses() } } } - private var scrollContent: some View { + private func scrollContent(_ reader: ScrollViewProxy) -> some View { VStack(spacing: 0) { heroSection + .id(topViewId) dateTimeSection DividerLine() // TODO: Function data is not in backend @@ -70,7 +73,7 @@ struct ClassDetailView: View { // DividerLine() descriptionSection DividerLine() - nextSessionsSection + nextSessionsSection(reader) } .padding(.bottom) } @@ -210,7 +213,7 @@ struct ClassDetailView: View { .padding(textPadding) } - private var nextSessionsSection: some View { + private func nextSessionsSection(_ reader: ScrollViewProxy) -> some View { VStack(spacing: 24) { Text("NEXT SESSIONS") .font(Constants.Fonts.h2) @@ -225,8 +228,11 @@ struct ClassDetailView: View { } } else { ForEach(viewModel.nextSessions(classInstance: classInstance), id: \.self) { classInstance in - NavigationLink { - ClassDetailView(classInstance: classInstance, viewModel: viewModel) + Button { + withAnimation { + self.classInstance = classInstance + reader.scrollTo(topViewId) + } } label: { NextSessionCell(classInstance: classInstance, viewModel: viewModel) } From efae66ac08268bba29a7c9bae06f9edcc56de072 Mon Sep 17 00:00:00 2001 From: Caitlyn Jin Date: Tue, 12 Nov 2024 13:52:20 -0500 Subject: [PATCH 6/6] Fix spelling error --- Uplift/Utils/Constants.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Uplift/Utils/Constants.swift b/Uplift/Utils/Constants.swift index b1af428..53d6eae 100644 --- a/Uplift/Utils/Constants.swift +++ b/Uplift/Utils/Constants.swift @@ -129,7 +129,7 @@ struct Constants { static let tabBarHeight: CGFloat = 64 } - /// Shadows usde in Uplift's design system. + /// Shadows used in Uplift's design system. enum Shadows { static let normalDark = ShadowConfig( color: Constants.Colors.black,