From 03cc854c66712ea541cd2c6846ffe7d5d8e10cdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Sat, 7 Sep 2024 11:27:01 +0200 Subject: [PATCH] refactor WorkoutItemLibrarySheet, add Set sample data --- WorkoutsPlus/Models/WorkoutItem.swift | 6 +++++ WorkoutsPlus/README.md | 4 +++- WorkoutsPlus/Workout/WorkoutDetail.swift | 24 +++++++++---------- ...ut.swift => WorkoutItemLibrarySheet.swift} | 13 ++++++---- 4 files changed, 30 insertions(+), 17 deletions(-) rename WorkoutsPlus/Workout/{AddWorkoutItemToWorkout.swift => WorkoutItemLibrarySheet.swift} (73%) diff --git a/WorkoutsPlus/Models/WorkoutItem.swift b/WorkoutsPlus/Models/WorkoutItem.swift index 9a0aad3..196b25a 100644 --- a/WorkoutsPlus/Models/WorkoutItem.swift +++ b/WorkoutsPlus/Models/WorkoutItem.swift @@ -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 }() } diff --git a/WorkoutsPlus/README.md b/WorkoutsPlus/README.md index 12bf3cc..3c9769d 100644 --- a/WorkoutsPlus/README.md +++ b/WorkoutsPlus/README.md @@ -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 diff --git a/WorkoutsPlus/Workout/WorkoutDetail.swift b/WorkoutsPlus/Workout/WorkoutDetail.swift index a1a054c..33db5a3 100644 --- a/WorkoutsPlus/Workout/WorkoutDetail.swift +++ b/WorkoutsPlus/Workout/WorkoutDetail.swift @@ -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 } } diff --git a/WorkoutsPlus/Workout/AddWorkoutItemToWorkout.swift b/WorkoutsPlus/Workout/WorkoutItemLibrarySheet.swift similarity index 73% rename from WorkoutsPlus/Workout/AddWorkoutItemToWorkout.swift rename to WorkoutsPlus/Workout/WorkoutItemLibrarySheet.swift index 10d2e6e..97a15b3 100644 --- a/WorkoutsPlus/Workout/AddWorkoutItemToWorkout.swift +++ b/WorkoutsPlus/Workout/WorkoutItemLibrarySheet.swift @@ -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) }