From 55f0926a08202522c197aadc2787f4d0ea92475e Mon Sep 17 00:00:00 2001 From: Trey t Date: Mon, 19 Jun 2023 20:03:41 -0500 Subject: [PATCH] WIP --- Werkout_ios.xcodeproj/project.pbxproj | 2 +- Werkout_ios/APIModels/Workout.swift | 4 +- Werkout_ios/Network/Fetchables.swift | 4 +- Werkout_ios/Views/AllWorkoutsView.swift | 13 ++- Werkout_ios/Views/WorkoutDetailView.swift | 93 +++++++++++-------- .../Views/WorkoutDetailViewModel.swift | 19 +++- 6 files changed, 87 insertions(+), 48 deletions(-) diff --git a/Werkout_ios.xcodeproj/project.pbxproj b/Werkout_ios.xcodeproj/project.pbxproj index 5adab08..0757082 100644 --- a/Werkout_ios.xcodeproj/project.pbxproj +++ b/Werkout_ios.xcodeproj/project.pbxproj @@ -164,9 +164,9 @@ 1CF65A3B2A3972CE0042FFBD /* ExternalWorkoutDetailView.swift */, 1CF65A622A3BF6A30042FFBD /* AllWorkoutsView.swift */, 1CF65A4B2A39FDA20042FFBD /* WorkoutDetailView.swift */, + 1CF65A4D2A39FF200042FFBD /* WorkoutDetailViewModel.swift */, 1CF65A6C2A3F60100042FFBD /* CreateWorkoutViews */, 1CF65A602A3BF6020042FFBD /* AddExerciseView.swift */, - 1CF65A4D2A39FF200042FFBD /* WorkoutDetailViewModel.swift */, 1CF65A682A3C018F0042FFBD /* AccountView.swift */, ); path = Views; diff --git a/Werkout_ios/APIModels/Workout.swift b/Werkout_ios/APIModels/Workout.swift index 5e28789..938b319 100644 --- a/Werkout_ios/APIModels/Workout.swift +++ b/Werkout_ios/APIModels/Workout.swift @@ -8,13 +8,14 @@ import Foundation struct Workout: Codable { + let id: Int let name: String let description: String? let exercises: [ExerciseElement] let registeredUser: RegisteredUser enum CodingKeys: String, CodingKey { - case name, description, exercises + case name, description, exercises, id case registeredUser = "registered_user" } @@ -29,6 +30,7 @@ struct Workout: Codable { self.name = try container.decode(String.self, forKey: .name) self.description = try container.decodeIfPresent(String.self, forKey: .description) self.registeredUser = try container.decode(RegisteredUser.self, forKey: .registeredUser) + self.id = try container.decode(Int.self, forKey: .id) } var exercisesSortedByCreated_at: [ExerciseElement] { diff --git a/Werkout_ios/Network/Fetchables.swift b/Werkout_ios/Network/Fetchables.swift index 0eb55de..fa19d7d 100644 --- a/Werkout_ios/Network/Fetchables.swift +++ b/Werkout_ios/Network/Fetchables.swift @@ -16,8 +16,8 @@ class WorkoutDetailFetchable: Fetchable { typealias Response = Workout var endPoint: String - init(workoutID: String) { - self.endPoint = "/workout/"+workoutID+"/details/" + init(workoutID: Int) { + self.endPoint = "workout/"+String(workoutID)+"/details/" } } diff --git a/Werkout_ios/Views/AllWorkoutsView.swift b/Werkout_ios/Views/AllWorkoutsView.swift index 28c97ed..1ec6015 100644 --- a/Werkout_ios/Views/AllWorkoutsView.swift +++ b/Werkout_ios/Views/AllWorkoutsView.swift @@ -41,7 +41,16 @@ struct AllWorkoutsView: View { Text("no workouts") } }.onAppear{ - testParse() + AllWorkoutFetchable().fetch(completion: { result in + switch result { + case .success(let model): + DispatchQueue.main.async { + self.workouts = model + } + case .failure(let failure): + fatalError("shit broke") + } + }) } .sheet(isPresented: $showWorkoutDetail) { if let selectedWorkout = selectedWorkout { @@ -52,7 +61,7 @@ struct AllWorkoutsView: View { } func selectedItem(workout: Workout) { - selectedWorkout = PreviewWorkout.workout() + selectedWorkout = workout } func testParse() { diff --git a/Werkout_ios/Views/WorkoutDetailView.swift b/Werkout_ios/Views/WorkoutDetailView.swift index b8c942d..154ad07 100644 --- a/Werkout_ios/Views/WorkoutDetailView.swift +++ b/Werkout_ios/Views/WorkoutDetailView.swift @@ -19,52 +19,65 @@ struct WorkoutDetailView: View { } var body: some View { - VStack { - HStack { - Button("i dont want to do this", action: { - bridgeModule.currentWorkout = nil - dismiss() - }) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background(.red) - - Button("ohhh lets do it", action: { - runItemAt(idx: 0) - }) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background(.green) - } - .frame(height: 88) - List() { - ForEach(viewModel.workout.exercisesSortedByCreated_at.indices, id: \.self) { i in - let obj = viewModel.workout.exercisesSortedByCreated_at[i] - Text(obj.exercise.name ?? "") - .onTapGesture { selectedIdx = i } + ZStack { + switch viewModel.status { + case .loading: + Text("Loading") + case .showWorkout(let workout): + VStack { + HStack { + Button("i dont want to do this", action: { + bridgeModule.currentWorkout = nil + dismiss() + }) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(.red) + + Button("ohhh lets do it", action: { + runItemAt(idx: 0) + }) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(.green) + } + .frame(height: 88) + List() { + ForEach(workout.exercisesSortedByCreated_at.indices, id: \.self) { i in + let obj = workout.exercisesSortedByCreated_at[i] + Text(obj.exercise.name ?? "") + .onTapGesture { selectedIdx = i } + } + } + + if let duration = bridgeModule.currentExercise?.duration { + HStack { + ProgressView(value: Float(bridgeModule.timeLeft), total: Float(duration)) + Text("\(bridgeModule.timeLeft)") + }.padding(16) + } } - } - - if let duration = bridgeModule.currentExercise?.duration { - HStack { - ProgressView(value: Float(bridgeModule.timeLeft), total: Float(duration)) - Text("\(bridgeModule.timeLeft)") - }.padding(16) + .onAppear{ + bridgeModule.timerCompleted = { + selectedIdx += 1 + } + } + .interactiveDismissDisabled() } } - .onAppear{ - bridgeModule.timerCompleted = { - selectedIdx += 1 - } - } - .interactiveDismissDisabled() + } func runItemAt(idx: Int) { - if idx < viewModel.workout.exercises.count { - let exercise = viewModel.workout.exercises[idx] - bridgeModule.updateCurrent(exercise: exercise) - bridgeModule.currentExerciseIdx = idx - } else { - workoutComplete() + switch viewModel.status { + case .showWorkout(let workout): + if idx < workout.exercises.count { + let exercise = workout.exercises[idx] + bridgeModule.updateCurrent(exercise: exercise) + bridgeModule.currentExerciseIdx = idx + } else { + workoutComplete() + } + default: + fatalError("no workout!!") } } diff --git a/Werkout_ios/Views/WorkoutDetailViewModel.swift b/Werkout_ios/Views/WorkoutDetailViewModel.swift index 7113d61..95205cd 100644 --- a/Werkout_ios/Views/WorkoutDetailViewModel.swift +++ b/Werkout_ios/Views/WorkoutDetailViewModel.swift @@ -9,9 +9,24 @@ import Combine import Foundation class WorkoutDetailViewModel: ObservableObject { - @Published var workout: Workout + enum WorkoutDetailViewModelStatus { + case loading + case showWorkout(Workout) + } + @Published var status: WorkoutDetailViewModelStatus init(workout: Workout) { - self.workout = workout + self.status = .loading + + WorkoutDetailFetchable(workoutID: workout.id).fetch(completion: { result in + switch result { + case .success(let model): + DispatchQueue.main.async { + self.status = .showWorkout(model) + } + case .failure(let failure): + fatalError("failed \(failure.localizedDescription)") + } + }) } }