// // AllExerciseView.swift // Werkout_ios // // Created by Trey Tartt on 6/16/24. // import SwiftUI import AVKit struct AllExerciseView: View { @Environment(\.dismiss) var dismiss @State var searchString: String = "" @Binding var filteredExercises: [Exercise] @State private var displayedExercises: [Exercise] = [] var selectedExercise: ((Exercise) -> Void) @State var avPlayer = AVPlayer(url: URL(string: BaseURLs.currentBaseURL + "/media/exercise_videos/2_Dumbbell_Lateral_Lunges.mp4") ?? URL(fileURLWithPath: "/dev/null")) @State private var currentVideoURL: URL? @State var videoExercise: Exercise? { didSet { if let viddd = self.videoExercise?.videoURL, let url = URL(string: BaseURLs.currentBaseURL + viddd) { updatePlayer(for: url) } } } var body: some View { VStack(spacing: WerkoutTheme.sm) { TextField("Filter", text: $searchString) .werkoutTextField() .padding(.horizontal, WerkoutTheme.md) List() { ForEach(displayedExercises, id: \.self) { exercise in HStack { VStack(spacing: WerkoutTheme.xs) { Text(exercise.name) .font(WerkoutTheme.bodyText) .foregroundStyle(WerkoutTheme.textPrimary) .frame(maxWidth: .infinity, alignment: .leading) if let side = exercise.side, side.isEmpty == false { Text(side) .font(WerkoutTheme.caption) .foregroundStyle(WerkoutTheme.textSecondary) .frame(maxWidth: .infinity, alignment: .leading) } if exercise.equipmentRequired?.isEmpty == false { Text(exercise.spacedEquipmentRequired) .font(WerkoutTheme.caption) .foregroundStyle(WerkoutTheme.textSecondary) .frame(maxWidth: .infinity, alignment: .leading) } if exercise.muscleGroups?.isEmpty == false { Text(exercise.spacedMuscleGroups) .font(WerkoutTheme.caption) .foregroundStyle(WerkoutTheme.textSecondary) .frame(maxWidth: .infinity, alignment: .leading) } } .contentShape(Rectangle()) .onTapGesture { selectedExercise(exercise) dismiss() } Button(action: { videoExercise = exercise }) { ZStack { Circle() .fill(WerkoutTheme.accent) .frame(width: 33, height: 33) Image(systemName: "video.fill") .frame(width: 33, height: 33) .foregroundStyle(WerkoutTheme.textPrimary) } } .frame(width: 33, height: 33) } .listRowBackground(WerkoutTheme.surfaceCard) } } .scrollContentBackground(.hidden) .background(WerkoutTheme.background) } .sheet(item: $videoExercise) { exercise in PlayerView(player: $avPlayer) .onAppear{ avPlayer.isMuted = true avPlayer.play() } } .onAppear { applySearch() } .onChange(of: searchString) { _, _ in applySearch() } .onChange(of: filteredExercises) { _, _ in applySearch() } .onDisappear { avPlayer.pause() } } private func applySearch() { if searchString.isEmpty { displayedExercises = filteredExercises } else { let query = searchString.lowercased() displayedExercises = filteredExercises.filter { $0.name.lowercased().contains(query) } } } private func updatePlayer(for url: URL) { if currentVideoURL == url { avPlayer.seek(to: .zero) avPlayer.isMuted = true avPlayer.play() return } currentVideoURL = url avPlayer = AVPlayer(url: url) avPlayer.isMuted = true avPlayer.play() } } // //#Preview { // AllExerciseView() //}