This commit is contained in:
Trey t
2023-06-25 21:11:35 -05:00
parent 508491510c
commit d055ed182d
3 changed files with 205 additions and 92 deletions

View File

@@ -10,35 +10,37 @@ import SwiftUI
import Combine
struct AddExerciseView: View {
enum CreateWorkoutItemPickerViewType {
case muscles
case equipment
}
@State var selectedMuscles = [Muscle]()
@State var selectedEquipment = [Equipment]()
@State var filteredExercises = [ExerciseExercise]()
@State var searchString: String = ""
@StateObject var bridgeModule = BridgeModule.shared
@Environment(\.dismiss) var dismiss
var selectedWorkout: ((ExerciseExercise) -> Void)
@State var createWorkoutItemPickerViewModel: CreateWorkoutItemPickerViewModel?
@State var createWorkoutItemPickerViewType: CreateWorkoutItemPickerViewType?
var body: some View {
VStack {
muscleView()
Divider()
equipmentView()
Divider()
TextField("Filter", text: $searchString)
.onReceive(Just(searchString)) { location in
filterExercises()
}
.padding()
Divider()
HStack {
muscleView()
.frame(maxWidth: .infinity)
Divider()
equipmentView()
.frame(maxWidth: .infinity)
}
.padding(.top)
.frame(height: 44)
exerciseView()
.padding(.top)
}
.onAppear{
if #function.hasPrefix("__preview") {
@@ -53,6 +55,38 @@ struct AddExerciseView: View {
selectedEquipment = equipment
filteredExercises = exercises
}
.sheet(item: $createWorkoutItemPickerViewModel) { item in
CreateWorkoutItemPickerView(viewModel: item, completed: { selectedids in
if let viewType = createWorkoutItemPickerViewType {
switch viewType {
case .muscles:
if let muscles = DataStore.shared.allMuscles {
selectedMuscles.removeAll()
for id in selectedids {
if let muscle = muscles.first(where: {
$0.id == id
}) {
selectedMuscles.append(muscle)
}
}
}
case .equipment:
if let equipment = DataStore.shared.allEquipment {
selectedEquipment.removeAll()
for id in selectedids {
if let equipment = equipment.first(where: {
$0.id == id
}) {
selectedEquipment.append(equipment)
}
}
}
}
}
filterExercises()
})
}
.background(Color(uiColor: .tertiarySystemBackground))
}
@@ -97,94 +131,57 @@ struct AddExerciseView: View {
}
}
if !searchString.isEmpty {
return exercise.name.contains(searchString) && hasCorrectMuscles && hasCorrectEquipment
} else {
return hasCorrectMuscles && hasCorrectEquipment
}
return hasCorrectMuscles && hasCorrectEquipment
})
}
func muscleView() -> some View {
VStack {
if let _ = DataStore.shared.allMuscles {
Text("Select Muscles")
.foregroundColor(.cyan)
Text("\(selectedMuscles.count) Selected")
}
}
.onTapGesture {
if let muscles = DataStore.shared.allMuscles {
Button("toggle all", action: {
if self.selectedMuscles.count > 0 {
self.selectedMuscles.removeAll()
} else {
self.selectedMuscles.append(contentsOf: muscles)
}
filterExercises()
var createWorkoutItemPickerModels = [CreateWorkoutItemPickerModel]()
muscles.forEach({
let model = CreateWorkoutItemPickerModel(id: $0.id, name: $0.name)
createWorkoutItemPickerModels.append(model)
})
ScrollView(.horizontal) {
HStack(spacing: 10) {
ForEach(muscles, id:\.id) { muscle in
ZStack {
RoundedRectangle(cornerRadius: 8)
.stroke(selectedMuscles.contains(where: { $0.id == muscle.id }) ? .green : .gray, lineWidth: 3)
.frame(maxWidth: .infinity, maxHeight: .infinity)
Text(muscle.name)
.lineLimit(2)
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
.contentShape(Rectangle())
.onTapGesture {
if selectedMuscles.contains(where: { $0.id == muscle.id }) {
self.selectedMuscles.removeAll(where: {
$0.id == muscle.id
})
} else {
self.selectedMuscles.append(muscle)
}
filterExercises()
}
.frame(width: 150, height: 70)
}
}.padding()
}.frame(height: 100)
createWorkoutItemPickerModels = createWorkoutItemPickerModels.sorted(by: {
$0.name < $1.name
})
let selectedIds = selectedMuscles.map { $0.id }
createWorkoutItemPickerViewModel = CreateWorkoutItemPickerViewModel(allValues: createWorkoutItemPickerModels, selectedIds: selectedIds)
createWorkoutItemPickerViewType = .muscles
}
}
}
func equipmentView() -> some View {
VStack {
if let _ = DataStore.shared.allEquipment {
Text("Select Equipment")
.foregroundColor(.cyan)
Text("\(selectedEquipment.count) Selected")
}
}
.onTapGesture {
if let equipment = DataStore.shared.allEquipment {
Button("toggle all", action: {
if self.selectedEquipment.count > 0 {
self.selectedEquipment.removeAll()
} else {
self.selectedEquipment.append(contentsOf: equipment)
}
filterExercises()
var createWorkoutItemPickerModels = [CreateWorkoutItemPickerModel]()
equipment.forEach({
let model = CreateWorkoutItemPickerModel(id: $0.id,
name: $0.name ?? "-")
createWorkoutItemPickerModels.append(model)
})
ScrollView(.horizontal) {
HStack(spacing: 10) {
ForEach(equipment, id:\.id) { aequipment in
ZStack {
RoundedRectangle(cornerRadius: 8)
.stroke(selectedEquipment.contains(where: { $0.id == aequipment.id }) ? .green : .gray, lineWidth: 3)
.frame(maxWidth: .infinity, maxHeight: .infinity)
Text(aequipment.name ?? "--")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.lineLimit(2)
.multilineTextAlignment(.center)
}
.contentShape(Rectangle())
.onTapGesture {
if selectedEquipment.contains(where: { $0.id == aequipment.id }) {
self.selectedEquipment.removeAll(where: {
$0.id == aequipment.id
})
} else {
self.selectedEquipment.append(aequipment)
}
filterExercises()
}
.frame(width: 150, height: 70)
}
}.padding()
}.frame(height: 100)
createWorkoutItemPickerModels = createWorkoutItemPickerModels.sorted(by: {
$0.name < $1.name
})
let selectedIds = selectedEquipment.map { $0.id }
createWorkoutItemPickerViewModel = CreateWorkoutItemPickerViewModel(allValues: createWorkoutItemPickerModels, selectedIds: selectedIds)
createWorkoutItemPickerViewType = .equipment
}
}
}