// // MainView.swift // Werkout_ios // // Created by Trey Tartt on 6/14/23. // import SwiftUI import AVKit struct WorkoutDetailView: View { @StateObject var viewModel: WorkoutDetailViewModel @State var avPlayer = AVPlayer(url: URL(string: "https://dev.werkout.fitness/media/exercise_videos/2_Dumbbell_Lateral_Lunges.mp4")!) @StateObject var bridgeModule = BridgeModule.shared @Environment(\.dismiss) var dismiss @AppStorage("showNSFWVideos") private var showNSFWVideos = false enum Sheet: Identifiable { case completedWorkout([String: Any]) var id: String { return UUID().uuidString } } @State var presentedSheet: Sheet? @State var workoutToPlan: Workout? var showAddToCalendar = true var body: some View { ZStack { switch viewModel.status { case .loading: Text("Loading") case .showWorkout(let workout): VStack(spacing: 0) { if bridgeModule.isInWorkout { HStack { CurrentWorkoutElapsedTimeView() CountdownView() } .padding() .frame(maxWidth: .infinity) GeometryReader { metrics in PlayerView(player: $avPlayer) .frame(width: metrics.size.width * 1, height: metrics.size.height * 1) .onAppear{ avPlayer.play() } } } InfoView(workout: workout) .padding(.bottom) ExerciseListView(workout: workout) ActionsView(completedWorkout: { bridgeModule.completeWorkout() }, planWorkout: { workout in workoutToPlan = workout }, workout: workout, showAddToCalendar: showAddToCalendar) .frame(height: 44) } .sheet(item: $presentedSheet) { item in switch item { case .completedWorkout(let data): CompletedWorkoutView(postData: data, workout: workout, completedWorkoutDismissed: { uploaded in if uploaded { dismiss() } }) } } .sheet(item: $workoutToPlan) { workout in PlanWorkoutView(workout: workout, addedPlannedWorkout: { dismiss() }) } } } .onChange(of: bridgeModule.currentExercise, perform: { newValue in if let videoURL = newValue?.videoURL(nsfw: showNSFWVideos) { avPlayer = AVPlayer(url: videoURL) avPlayer.play() } }) .onAppear{ if let videoURL = bridgeModule.currentExercise?.videoURL(nsfw: showNSFWVideos) { avPlayer = AVPlayer(url: videoURL) avPlayer.play() } bridgeModule.completedWorkout = { if let workoutData = createWorkoutData() { presentedSheet = .completedWorkout(workoutData) bridgeModule.resetCurrentWorkout() } } } } func createWorkoutData() -> [String:Any]? { guard let workoutid = bridgeModule.currentWorkout?.id, let startTime = bridgeModule.workoutStartDate?.timeFormatForUpload, let endTime = bridgeModule.workoutEndDate?.timeFormatForUpload else { return nil } let postBody = [ "difficulty": 1, "workout_start_time": startTime, "workout_end_time": endTime, "workout": workoutid, "total_time": bridgeModule.currentWorkoutRunTimeInSeconds, "total_calories": bridgeModule.totalCaloire ?? -1, "heart_rates": bridgeModule.heartRates ?? [Int]() ] as [String : Any] return postBody } } struct WorkoutDetailView_Previews: PreviewProvider { static let workoutDetail = PreviewData.workout() static var previews: some View { WorkoutDetailView(viewModel: WorkoutDetailViewModel(workout: WorkoutDetailView_Previews.workoutDetail, status: .showWorkout(WorkoutDetailView_Previews.workoutDetail))) } }