WIP
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user