This commit is contained in:
Trey t
2025-03-13 22:12:50 -05:00
parent fb22f47a82
commit ca25d61019
15 changed files with 218 additions and 90 deletions

View File

@@ -28,6 +28,7 @@ struct ContentView: View {
} else {
PlayerView(player: $avPlayer)
.onAppear{
avPlayer.isMuted = true
avPlayer.play()
}
.onReceive(videoEnded){ _ in
@@ -49,6 +50,7 @@ struct ContentView: View {
func playVideo(url: String) {
let url = URL(string: BaseURLs.currentBaseURL + url)
avPlayer = AVPlayer(url: url!)
avPlayer.isMuted = true
avPlayer.play()
}

View File

@@ -63,31 +63,51 @@ struct Workout: Codable, Identifiable, Equatable {
}
extension Array where Element == Workout {
func filterWorkouts(searchString: String, filteredRegisterdUser: RegisteredUser?) -> [Workout] {
func filterWorkouts(nameSearchString: String,
musclesSearchString: Set<String>,
equipmentSearchString: Set<String>,
filteredRegisterdUser: RegisteredUser?) -> [Workout] {
var matchingWorkouts = [Workout]()
if (!searchString.isEmpty && searchString.count > 0) {
if matchingWorkouts.isEmpty {
matchingWorkouts.append(contentsOf: self)
}
if (!nameSearchString.isEmpty && nameSearchString.count > 0) {
matchingWorkouts = self.filter({
if $0.name.lowercased().contains(searchString.lowercased()) {
if $0.name.lowercased().contains(nameSearchString.lowercased()) {
return true
}
if let equipment = $0.equipment?.joined(separator: "").lowercased(),
equipment.contains(searchString.lowercased()) {
return true
}
if let muscles = $0.muscles?.joined(separator: "").lowercased(),
muscles.contains(searchString.lowercased()) {
return true
}
return false
})
}
if matchingWorkouts.isEmpty {
matchingWorkouts.append(contentsOf: self)
if (!equipmentSearchString.isEmpty && equipmentSearchString.count > 0) {
matchingWorkouts = matchingWorkouts.filter({
if let equipment = $0.equipment?.joined(separator: "").lowercased() {
for word in equipmentSearchString {
if equipment.contains(word.lowercased()) {
return true
}
}
return false
}
return false
})
}
if (!musclesSearchString.isEmpty && musclesSearchString.count > 0) {
matchingWorkouts = matchingWorkouts.filter({
if let muscles = $0.muscles?.joined(separator: "").lowercased() {
for word in musclesSearchString {
if muscles.contains(word.lowercased()) {
return true
}
}
return false
}
return false
})
}
if let filteredRegisterdUser = filteredRegisterdUser {

View File

@@ -12,6 +12,6 @@ enum BaseURLs: String {
case dev = "https://dev.werkout.fitness"
static var currentBaseURL: String {
return BaseURLs.local.rawValue
return BaseURLs.dev.rawValue
}
}

View File

@@ -9,11 +9,13 @@ import SwiftUI
enum SortType: String, CaseIterable {
case name = "Name"
case date = "Date"
case createdDate = "Created Date"
}
struct AllWorkoutsListView: View {
@State var searchString: String = ""
@State var searchNameString: String = ""
@State var selectedMuscles: Set<String> = []
@State var selectedEquipment: Set<String> = []
@Binding var uniqueWorkoutUsers: [RegisteredUser]?
@State private var filteredRegisterdUser: RegisteredUser?
@@ -30,7 +32,9 @@ struct AllWorkoutsListView: View {
Text((filteredRegisterdUser.firstName ?? "NA") + "'s Workouts")
}
FilterAllView(searchString: $searchString,
FilterAllView(selectedMuscles: $selectedMuscles,
selectedEquipment: $selectedEquipment,
searchNameString: $searchNameString,
uniqueWorkoutUsers: $uniqueWorkoutUsers,
filteredRegisterdUser: $filteredRegisterdUser,
filteredWorkouts: $filteredWorkouts,
@@ -55,13 +59,28 @@ struct AllWorkoutsListView: View {
refresh()
}
}
.onChange(of: searchString) { newValue in
filteredWorkouts = workouts.filterWorkouts(searchString: searchString, filteredRegisterdUser: filteredRegisterdUser)
.onChange(of: searchNameString) { newValue in
filterWorkouts()
}
.onChange(of: selectedMuscles) { newValue in
filterWorkouts()
}
.onChange(of: selectedEquipment) { newValue in
filterWorkouts()
}
.onAppear{
filteredWorkouts = workouts.filterWorkouts(searchString: searchString, filteredRegisterdUser: filteredRegisterdUser)
filterWorkouts()
}
}
func filterWorkouts() {
filteredWorkouts = workouts.filterWorkouts(
nameSearchString: searchNameString,
musclesSearchString: selectedMuscles,
equipmentSearchString: selectedEquipment,
filteredRegisterdUser: filteredRegisterdUser
)
}
}
struct AllWorkoutsListView_Previews: PreviewProvider {

View File

@@ -155,7 +155,7 @@ struct AllWorkoutsView: View {
healthStore.requestAuthorization(toShare: nil, read: healthKitTypes) { (succ, error) in
if !succ {
fatalError("Error requesting authorization from health store: \(String(describing: error)))")
// fatalError("Error requesting authorization from health store: \(String(describing: error)))")
}
}
}

View File

@@ -76,19 +76,19 @@ struct CompletedWorkoutView: View {
.onAppear{
bridgeModule.sendWorkoutCompleteToWatch()
}
.onChange(of: bridgeModule.healthKitUUID, perform: { healthKitUUID in
if let healthKitUUID = healthKitUUID {
gettingHealthKitData = true
healthKitHelper.getDetails(forHealthKitUUID: healthKitUUID,
completion: { healthKitWorkoutData in
guard let healthStore = healthKitWorkoutData else {
return
}
self.healthKitWorkoutData = healthKitWorkoutData
gettingHealthKitData = false
})
}
})
// .onChange(of: bridgeModule.healthKitUUID, perform: { healthKitUUID in
// if let healthKitUUID = healthKitUUID {
// gettingHealthKitData = true
// healthKitHelper.getDetails(forHealthKitUUID: healthKitUUID,
// completion: { healthKitWorkoutData in
// guard let healthStore = healthKitWorkoutData else {
// return
// }
// self.healthKitWorkoutData = healthKitWorkoutData
// gettingHealthKitData = false
// })
// }
// })
}
func upload(postBody: [String: Any]) {

View File

@@ -89,8 +89,6 @@ struct CreateExerciseActionsView: View {
Spacer()
}
Divider()
}
}
}

View File

@@ -26,6 +26,7 @@ struct ExternalWorkoutDetailView: View {
PlayerView(player: $avPlayer)
.frame(width: metrics.size.width * 0.5, height: metrics.size.height * 0.8)
.onAppear{
avPlayer.isMuted = true
avPlayer.play()
}
}
@@ -48,6 +49,7 @@ struct ExternalWorkoutDetailView: View {
.frame(width: metrics.size.width * 0.2,
height: metrics.size.height * 0.2)
.onAppear{
avPlayer.isMuted = true
avPlayer.play()
}
}

View File

@@ -25,6 +25,7 @@ struct ExerciseListView: View {
exerciseName: self.videoExercise?.name,
workout: bridgeModule.currentWorkoutInfo.workout) {
avPlayer = AVPlayer(url: videoURL)
avPlayer.isMuted = true
avPlayer.play()
}
}
@@ -137,6 +138,7 @@ struct ExerciseListView: View {
.sheet(item: $videoExercise) { exercise in
PlayerView(player: $avPlayer)
.onAppear{
avPlayer.isMuted = true
avPlayer.play()
}
}

View File

@@ -46,6 +46,7 @@ struct WorkoutDetailView: View {
PlayerView(player: $avPlayer)
.frame(width: metrics.size.width * 1, height: metrics.size.height * 1)
.onAppear{
avPlayer.isMuted = true
avPlayer.play()
}
@@ -59,6 +60,7 @@ struct WorkoutDetailView: View {
exerciseName: currentExtercise.exercise.name,
workout: bridgeModule.currentWorkoutInfo.workout) {
avPlayer = AVPlayer(url: otherVideoURL)
avPlayer.isMuted = true
avPlayer.play()
}
}, label: {
@@ -169,6 +171,7 @@ struct WorkoutDetailView: View {
exerciseName: currentExtercise.exercise.name,
workout: bridgeModule.currentWorkoutInfo.workout) {
avPlayer = AVPlayer(url: videoURL)
avPlayer.isMuted = true
avPlayer.play()
}
}
@@ -181,6 +184,7 @@ struct WorkoutDetailView: View {
}
.onReceive(NotificationCenter.default.publisher(
for: UIScene.willEnterForegroundNotification)) { _ in
avPlayer.isMuted = true
avPlayer.play()
}
}
@@ -194,6 +198,7 @@ struct WorkoutDetailView: View {
exerciseName: currentExtercise.exercise.name,
workout: bridgeModule.currentWorkoutInfo.workout) {
avPlayer = AVPlayer(url: videoURL)
avPlayer.isMuted = true
avPlayer.play()
}
}

View File

@@ -12,25 +12,34 @@ struct AddSupersetView: View {
@Binding var selectedCreateWorkoutSuperSet: CreateWorkoutSuperSet?
var body: some View {
VStack {
TabView {
ForEach(createWorkoutSuperSet.exercises, id: \.id) { createWorkoutExercise in
HStack {
VStack {
Text(createWorkoutExercise.exercise.name)
.font(.title2)
.frame(maxWidth: .infinity)
if createWorkoutExercise.exercise.side != nil && createWorkoutExercise.exercise.side!.count > 0 {
Text(createWorkoutExercise.exercise.side!)
.font(.title3)
.frame(maxWidth: .infinity, alignment: .center)
}
CreateExerciseActionsView(workoutExercise: createWorkoutExercise,
superset: createWorkoutSuperSet,
viewModel: viewModel)
VStack {
Text(createWorkoutExercise.exercise.name)
.font(.title2)
.frame(maxWidth: .infinity)
if createWorkoutExercise.exercise.side != nil && createWorkoutExercise.exercise.side!.count > 0 {
Text(createWorkoutExercise.exercise.side!)
.font(.title3)
.frame(maxWidth: .infinity, alignment: .center)
}
CreateExerciseActionsView(workoutExercise: createWorkoutExercise,
superset: createWorkoutSuperSet,
viewModel: viewModel)
}
.frame(width: 300.0)
.padding(.bottom, 40)
}
}
.frame(height: 300)
.tabViewStyle(.page)
.onAppear {
setupAppearance()
}
}
func setupAppearance() {
UIPageControl.appearance().currentPageIndicatorTintColor = .black
UIPageControl.appearance().pageIndicatorTintColor = UIColor.black.withAlphaComponent(0.2)
}
}

View File

@@ -82,6 +82,7 @@ struct AllExerciseView: View {
.sheet(item: $videoExercise) { exercise in
PlayerView(player: $avPlayer)
.onAppear{
avPlayer.isMuted = true
avPlayer.play()
}
}

View File

@@ -8,7 +8,9 @@
import SwiftUI
struct FilterAllView: View {
@Binding var searchString: String
@Binding var selectedMuscles: Set<String>
@Binding var selectedEquipment: Set<String>
@Binding var searchNameString: String
@Binding var uniqueWorkoutUsers: [RegisteredUser]?
@Binding var filteredRegisterdUser: RegisteredUser?
@Binding var filteredWorkouts: [Workout]
@@ -16,48 +18,113 @@ struct FilterAllView: View {
@Binding var currentSort: SortType?
var body: some View {
HStack {
TextField("Filter" ,text: $searchString)
VStack {
TextField("Search by name" ,text: $searchNameString)
.padding(.horizontal)
.textFieldStyle(.roundedBorder)
if let uniqueWorkoutUsers = uniqueWorkoutUsers {
Menu(content: {
ForEach(uniqueWorkoutUsers, id: \.self) { index in
HStack {
if let uniqueWorkoutUsers = uniqueWorkoutUsers {
Menu(content: {
ForEach(uniqueWorkoutUsers, id: \.self) { index in
Button(action: {
filteredRegisterdUser = index
filteredWorkouts = workouts.filterWorkouts(
nameSearchString: searchNameString,
musclesSearchString: selectedMuscles,
equipmentSearchString: selectedEquipment,
filteredRegisterdUser: filteredRegisterdUser
)
}, label: {
Text((index.firstName ?? "") + " -" + (index.lastName ?? ""))
})
}
Button(action: {
filteredRegisterdUser = index
filteredWorkouts = workouts.filterWorkouts(searchString: searchString,
filteredRegisterdUser: filteredRegisterdUser)
filteredRegisterdUser = nil
filteredWorkouts = workouts.filterWorkouts(
nameSearchString: searchNameString,
musclesSearchString: selectedMuscles,
equipmentSearchString: selectedEquipment,
filteredRegisterdUser: filteredRegisterdUser
)
}, label: {
Text((index.firstName ?? "") + " -" + (index.lastName ?? ""))
Text("All")
})
}, label: {
Image(systemName: filteredRegisterdUser == nil ? "person.2" : "person.2.fill")
.padding(.trailing)
})
}
Menu(content: {
ForEach(SortType.allCases, id: \.self) { index in
Button(action: {
sortWorkouts(sortType: index)
}, label: {
Text(index.rawValue)
})
}
Button(action: {
filteredRegisterdUser = nil
filteredWorkouts = workouts.filterWorkouts(searchString: searchString,filteredRegisterdUser: filteredRegisterdUser)
}, label: {
Text("All")
})
}, label: {
Image(systemName: filteredRegisterdUser == nil ? "person.2" : "person.2.fill")
Image(systemName: "list.number")
.padding(.trailing)
})
if let equipments = DataStore.shared.allEquipment {
Menu(content: {
ForEach(equipments, id: \.id) { equipment in
Button(action: {
if selectedEquipment.contains(equipment.name) {
selectedEquipment.remove(equipment.name)
} else {
selectedEquipment.insert(equipment.name)
}
}, label: {
if selectedEquipment.contains(equipment.name) {
Image(systemName: "checkmark")
}
Text(equipment.name)
})
}
}, label: {
Image(systemName: "scalemass")
.padding(.trailing)
})
}
if let muscles = DataStore.shared.allMuscles {
Menu(content: {
ForEach(muscles, id: \.id) { muscle in
Button(action: {
if selectedMuscles.contains(muscle.name) {
selectedMuscles.remove(muscle.name)
} else {
selectedMuscles.insert(muscle.name)
}
}, label: {
if selectedMuscles.contains(muscle.name) {
Image(systemName: "checkmark")
}
Text(muscle.name)
})
}
}, label: {
Image(systemName: "brain.head.profile")
.padding(.trailing)
})
}
Button(action: {
selectedMuscles.removeAll()
selectedEquipment.removeAll()
searchNameString = ""
filteredRegisterdUser = nil
}, label: {
Image(systemName: "xmark.circle")
.padding(.trailing)
})
}
Menu(content: {
ForEach(SortType.allCases, id: \.self) { index in
Button(action: {
sortWorkouts(sortType: index)
}, label: {
Text(index.rawValue)
})
}
}, label: {
Image(systemName: "list.number")
.padding(.trailing)
})
}
}
@@ -71,7 +138,7 @@ struct FilterAllView: View {
filteredWorkouts = filteredWorkouts.sorted(by: {
$0.name < $1.name
})
case .date:
case .createdDate:
filteredWorkouts = filteredWorkouts.sorted(by: {
$0.createdAt ?? Date() < $1.createdAt ?? Date()
})
@@ -81,7 +148,9 @@ struct FilterAllView: View {
}
#Preview {
FilterAllView(searchString: .constant(""),
FilterAllView(selectedMuscles: .constant([]),
selectedEquipment: .constant([]),
searchNameString: .constant(""),
uniqueWorkoutUsers: .constant(nil),
filteredRegisterdUser: .constant(nil),
filteredWorkouts: .constant(PreviewData.allWorkouts()),

View File

@@ -13,7 +13,7 @@ struct PlannedWorkoutView: View {
var body: some View {
List {
ForEach(workouts, id:\.workout.name) { plannedWorkout in
ForEach(workouts.sorted(by: { $0.onDate < $1.onDate }), id:\.workout.name) { plannedWorkout in
HStack {
VStack(alignment: .leading) {
Text(plannedWorkout.onDate.plannedDate?.weekDay ?? "-")

View File

@@ -62,6 +62,7 @@ class PlayerUIView: UIView {
if let playerItem = notification.object as? AVPlayerItem {
playerItem.seek(to: .zero, completionHandler: nil)
self.playerLayer.player?.play()
self.playerLayer.player?.isMuted = true
}
}
}