refactor WorkoutItemLibrarySheet, add Set sample data

This commit is contained in:
Felix Förtsch
2024-09-07 11:27:01 +02:00
parent 87f1922a61
commit 03cc854c66
4 changed files with 30 additions and 17 deletions

View File

@@ -74,6 +74,12 @@ extension WorkoutItem {
exercises.append(WorkoutItem(from: exercise))
}
var set = WorkoutItem(workoutItems: [
WorkoutItem(from: Exercise("Set item 1")),
WorkoutItem(from: Exercise("Set item 2"))
])
exercises.append(set)
return exercises
}()
}

View File

@@ -1,9 +1,11 @@
# Workouts+
## TODO List
- Actually DO a workout View
- JSON Import/Export
- Use Multipeer connect for sharing/tracking?
- Progression-Fotos: als eigene App? -> Generalisierung zu "Foto-Track"
- Karte mit öffentlichen Orten einbinden (AOK-Fitnesspark?)
- Progression-Fotos: als eigene App? -> Generalisierung zu "Foto-Track"
## Workouts
- time-based: 60 s

View File

@@ -13,7 +13,7 @@ struct WorkoutDetail: View {
@Environment(\.modelContext) private var modelContext
@State var workout: Workout
@State private var isPresentingExerciseLibrary = false
@State private var isPresentingWorkoutItemLibrarySheet = false
var body: some View {
List {
@@ -25,7 +25,9 @@ struct WorkoutDetail: View {
.foregroundStyle(workout.workoutIconColorName.color)
}
}
Section(header: Text("Exercises")) {
Section(
header: Text("Exercises"),
footer: Text("Drag and drop to re-arrange or swipe to delete exercises.")) {
ForEach(workout.workoutItems
.sorted(by: { $0.position < $1.position})) { workoutItem in
switch workoutItem.workoutItemType {
@@ -40,25 +42,23 @@ struct WorkoutDetail: View {
.onDelete(perform: deleteExerciseFromWorkout)
.onMove(perform: move)
.environment(\.editMode, .constant(.active)) // Always active drag mode
AddItemButton(label: "Exercise", action: addWorkoutItemToWorkout)
AddItemButton(label: "Exercise", action: presentWorkoutItemLibrarySheet)
}
}
.navigationBarTitle("\(workout.name)")
.toolbar {
ToolbarItem() {
EditButton()
}
// TODO: Add proper Sharing for workouts.
ToolbarItem() { ShareLink(item: URL(filePath: "felixfoertsch.de")!) }
ToolbarItem() { EditButton() }
}
.sheet(isPresented: $isPresentingExerciseLibrary) {
AddWorkoutItemToWorkout(workout: workout)
.presentationDetents([.medium, .large])
.presentationDragIndicator(.visible)
.sheet(isPresented: $isPresentingWorkoutItemLibrarySheet) {
WorkoutItemLibrarySheet(workout: workout)
}
}
private func addWorkoutItemToWorkout() {
private func presentWorkoutItemLibrarySheet() {
withAnimation {
isPresentingExerciseLibrary = true
isPresentingWorkoutItemLibrarySheet = true
}
}

View File

@@ -8,18 +8,21 @@
import SwiftUI
import SwiftData
struct AddWorkoutItemToWorkout: View {
struct WorkoutItemLibrarySheet: View {
@Environment(\.modelContext) private var modelContext
@Query(sort: \Exercise.name) private var exercises: [Exercise]
@State var workout: Workout
// TODO: Add (i) Button that allows editing an exercise (maybe requires NavigationStack?)
// TODO: Pass in some context? So that when we come from a Set and add a Set, it's treed. Or when we come from a Set and add an Exercise, we put it into it's child
var body: some View {
Group {
List {
Section(header: Text("Utilities")) {
// AddExerciseToWorkoutListItem(WorkoutItem(workoutItems: []), workout)
AddItemButton(label: "Set") {
addWorkoutItemtoWorkout(WorkoutItem(workoutItems: []))
}
}
Section(header: Text("Excersises")) {
if !exercises.isEmpty {
@@ -38,6 +41,8 @@ struct AddWorkoutItemToWorkout: View {
}
}
}
.presentationDetents([.medium, .large])
.presentationDragIndicator(.visible)
}
private func addWorkoutItemtoWorkout(_ workoutItem: WorkoutItem) {
@@ -48,11 +53,11 @@ struct AddWorkoutItemToWorkout: View {
}
#Preview("With Sample Data") {
AddWorkoutItemToWorkout(workout: Workout.sampleData)
WorkoutItemLibrarySheet(workout: Workout.sampleData)
.modelContainer(SampleData.shared.modelContainer)
}
#Preview("Empty Database") {
AddWorkoutItemToWorkout(workout: Workout.sampleData)
WorkoutItemLibrarySheet(workout: Workout.sampleData)
.modelContainer(for: Exercise.self, inMemory: true)
}