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)) 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 return exercises
}() }()
} }

View File

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

View File

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

View File

@@ -8,18 +8,21 @@
import SwiftUI import SwiftUI
import SwiftData import SwiftData
struct AddWorkoutItemToWorkout: View { struct WorkoutItemLibrarySheet: View {
@Environment(\.modelContext) private var modelContext @Environment(\.modelContext) private var modelContext
@Query(sort: \Exercise.name) private var exercises: [Exercise] @Query(sort: \Exercise.name) private var exercises: [Exercise]
@State var workout: Workout @State var workout: Workout
// TODO: Add (i) Button that allows editing an exercise (maybe requires NavigationStack?) // 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 { var body: some View {
Group { Group {
List { List {
Section(header: Text("Utilities")) { Section(header: Text("Utilities")) {
// AddExerciseToWorkoutListItem(WorkoutItem(workoutItems: []), workout) AddItemButton(label: "Set") {
addWorkoutItemtoWorkout(WorkoutItem(workoutItems: []))
}
} }
Section(header: Text("Excersises")) { Section(header: Text("Excersises")) {
if !exercises.isEmpty { if !exercises.isEmpty {
@@ -38,6 +41,8 @@ struct AddWorkoutItemToWorkout: View {
} }
} }
} }
.presentationDetents([.medium, .large])
.presentationDragIndicator(.visible)
} }
private func addWorkoutItemtoWorkout(_ workoutItem: WorkoutItem) { private func addWorkoutItemtoWorkout(_ workoutItem: WorkoutItem) {
@@ -48,11 +53,11 @@ struct AddWorkoutItemToWorkout: View {
} }
#Preview("With Sample Data") { #Preview("With Sample Data") {
AddWorkoutItemToWorkout(workout: Workout.sampleData) WorkoutItemLibrarySheet(workout: Workout.sampleData)
.modelContainer(SampleData.shared.modelContainer) .modelContainer(SampleData.shared.modelContainer)
} }
#Preview("Empty Database") { #Preview("Empty Database") {
AddWorkoutItemToWorkout(workout: Workout.sampleData) WorkoutItemLibrarySheet(workout: Workout.sampleData)
.modelContainer(for: Exercise.self, inMemory: true) .modelContainer(for: Exercise.self, inMemory: true)
} }