// // ExerciseListView.swift // Werkout_ios // // Created by Trey Tartt on 7/7/23. // import SwiftUI import AVKit struct ExerciseListView: View { @AppStorage(Constants.phoneThotStyle) private var phoneThotStyle: ThotStyle = .never @ObservedObject var bridgeModule = BridgeModule.shared @State var avPlayer = AVPlayer(url: URL(string: "https://dev.werkout.fitness/media/exercise_videos/2_Dumbbell_Lateral_Lunges.mp4")!) var workout: Workout @Binding var showExecersizeInfo: Bool @AppStorage(Constants.thotGenderOption) private var thotGenderOption: String = "female" @State var videoExercise: Exercise? { didSet { if let videoURL = VideoURLCreator.videoURL( thotStyle: phoneThotStyle, gender: thotGenderOption, defaultVideoURLStr: self.videoExercise?.videoURL, exerciseName: self.videoExercise?.name, workout: bridgeModule.currentExerciseInfo.workout) { avPlayer = AVPlayer(url: videoURL) avPlayer.play() } } } var body: some View { if let supersets = workout.supersets { ScrollViewReader { proxy in List() { ForEach(supersets.indices, id: \.self) { supersetIndex in let superset = supersets[supersetIndex] Section(content: { ForEach(superset.exercises.indices, id: \.self) { exerciseIndex in let supersetExecercise = superset.exercises[exerciseIndex] VStack { HStack { if bridgeModule.isInWorkout && supersetIndex == bridgeModule.currentExerciseInfo.supersetIndex && exerciseIndex == bridgeModule.currentExerciseInfo.exerciseIndex { Image(systemName: "checkmark") .foregroundColor(.green) } Text(supersetExecercise.exercise.extName) Spacer() if let reps = supersetExecercise.reps, reps > 0 { HStack { Image(systemName: "number") .foregroundColor(.white) .frame(width: 20, alignment: .leading) Text("\(reps)") .foregroundColor(.white) .frame(width: 30, alignment: .trailing) } .padding([.top, .bottom], 5) .padding([.leading], 10) .padding([.trailing], 15) .background(.blue) .cornerRadius(5, corners: [.topLeft, .bottomLeft]) .frame(alignment: .trailing) } if let duration = supersetExecercise.duration, duration > 0 { HStack { Image(systemName: "stopwatch") .foregroundColor(.white) .frame(width: 20, alignment: .leading) Text("\(duration)") .foregroundColor(.white) .frame(width: 30, alignment: .trailing) } .padding([.top, .bottom], 5) .padding([.leading], 10) .padding([.trailing], 15) .background(.green) .cornerRadius(5, corners: [.topLeft, .bottomLeft]) } } .padding(.trailing, -20) .contentShape(Rectangle()) .onTapGesture { if bridgeModule.isInWorkout { bridgeModule.goToExerciseAt(section: supersetIndex, row: exerciseIndex) } else { videoExercise = supersetExecercise.exercise } } if bridgeModule.isInWorkout && supersetIndex == bridgeModule.currentExerciseInfo.supersetIndex && exerciseIndex == bridgeModule.currentExerciseInfo.exerciseIndex && showExecersizeInfo { detailView(forExercise: supersetExecercise) } }.id(supersetExecercise.id) } }, header: { HStack { Text(superset.name ?? "--") .foregroundColor(Color("appColor")) .bold() Spacer() Text("\(superset.rounds) rounds") .foregroundColor(Color("appColor")) .bold() if let estimatedTime = superset.estimatedTime { Text("@ " + estimatedTime.asString(style: .abbreviated)) .foregroundColor(Color("appColor")) .bold() } } }) } } .onChange(of: bridgeModule.currentExerciseInfo.allSupersetExecerciseIndex, perform: { newValue in if let newCurrentExercise = bridgeModule.currentExerciseInfo.currentExercise { withAnimation { proxy.scrollTo(newCurrentExercise.id, anchor: .top) } } }) .sheet(item: $videoExercise) { exercise in PlayerView(player: $avPlayer) .onAppear{ avPlayer.play() } } } } } func detailView(forExercise supersetExecercise: SupersetExercise) -> some View { VStack { Text(supersetExecercise.exercise.description) .frame(alignment: .leading) Divider() Text(supersetExecercise.exercise.muscles.map({ $0.name }).joined(separator: ", ")) .frame(alignment: .leading) } } } //struct ExerciseListView_Previews: PreviewProvider { // static var previews: some View { // ExerciseListView(workout: PreviewData.workout(), showExecersizeInfo: ) // } //}