From d1a87957f63e7e736abc2c81adf843f27b8c032d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20F=C3=B6rtsch?= Date: Mon, 21 Oct 2024 15:03:47 +0200 Subject: [PATCH] change folders to the "feature" mindset --- WorkoutsPlus/Components/SetListItem.swift | 32 +++++++-------- .../{Models => Configuration}/Protocols.swift | 0 .../{Debug => Configuration}/SampleData.swift | 0 WorkoutsPlus/ContentView.swift | 3 +- WorkoutsPlus/{Debug => }/DebugList.swift | 0 WorkoutsPlus/{Debug => }/ExampleView.swift | 0 .../Exercise}/Equipment.swift | 0 .../Exercise}/Exercise.swift | 0 .../Exercise/ExerciseDetail.swift | 0 .../Exercise/ExerciseEditor.swift | 0 .../Exercise/ExerciseLibrary.swift | 0 .../{Models => Features/Food}/Food.swift | 0 .../{Models => Features/Food}/Unit.swift | 0 .../{ => Features}/Home/ActivityLog.swift | 0 .../{ => Features}/Home/Miniplayer.swift | 0 .../{ => Features}/Home/WorkoutLog.swift | 2 +- .../Onboarding/Onboarding.swift | 0 .../{ => Features}/Settings/Settings.swift | 0 .../{Models => Features/Sharing}/Person.swift | 0 .../{ => Features}/Workout/AddWorkout.swift | 0 .../Workout}/Workout.swift | 0 .../Workout/WorkoutDetail.swift | 0 .../Workout/WorkoutIconSelector.swift | 0 .../Workout}/WorkoutItem.swift | 40 +++++++++---------- .../Workout/WorkoutItemLibrarySheet.swift | 22 +++++----- .../Workout/WorkoutLibrary.swift | 20 +++++----- .../Workout/WorkoutListItem.swift | 10 ++--- .../ActiveWorkoutSession.swift | 26 ++---------- .../ActiveWorkoutSessionControls.swift | 0 .../ActiveWorkoutSessionListItem.swift | 12 ++---- .../WorkoutSession}/WorkoutSession.swift | 28 ++++++------- .../WorkoutSession/WorkoutSessionItem.swift | 34 ++++++++++++++++ WorkoutsPlus/Models/WorkoutSessionItem.swift | 25 ------------ WorkoutsPlus/er-diagram.md | 6 +-- 34 files changed, 121 insertions(+), 139 deletions(-) rename WorkoutsPlus/{Models => Configuration}/Protocols.swift (100%) rename WorkoutsPlus/{Debug => Configuration}/SampleData.swift (100%) rename WorkoutsPlus/{Debug => }/DebugList.swift (100%) rename WorkoutsPlus/{Debug => }/ExampleView.swift (100%) rename WorkoutsPlus/{Models => Features/Exercise}/Equipment.swift (100%) rename WorkoutsPlus/{Models => Features/Exercise}/Exercise.swift (100%) rename WorkoutsPlus/{ => Features}/Exercise/ExerciseDetail.swift (100%) rename WorkoutsPlus/{ => Features}/Exercise/ExerciseEditor.swift (100%) rename WorkoutsPlus/{ => Features}/Exercise/ExerciseLibrary.swift (100%) rename WorkoutsPlus/{Models => Features/Food}/Food.swift (100%) rename WorkoutsPlus/{Models => Features/Food}/Unit.swift (100%) rename WorkoutsPlus/{ => Features}/Home/ActivityLog.swift (100%) rename WorkoutsPlus/{ => Features}/Home/Miniplayer.swift (100%) rename WorkoutsPlus/{ => Features}/Home/WorkoutLog.swift (98%) rename WorkoutsPlus/{ => Features}/Onboarding/Onboarding.swift (100%) rename WorkoutsPlus/{ => Features}/Settings/Settings.swift (100%) rename WorkoutsPlus/{Models => Features/Sharing}/Person.swift (100%) rename WorkoutsPlus/{ => Features}/Workout/AddWorkout.swift (100%) rename WorkoutsPlus/{Models => Features/Workout}/Workout.swift (100%) rename WorkoutsPlus/{ => Features}/Workout/WorkoutDetail.swift (100%) rename WorkoutsPlus/{ => Features}/Workout/WorkoutIconSelector.swift (100%) rename WorkoutsPlus/{Models => Features/Workout}/WorkoutItem.swift (77%) rename WorkoutsPlus/{ => Features}/Workout/WorkoutItemLibrarySheet.swift (81%) rename WorkoutsPlus/{ => Features}/Workout/WorkoutLibrary.swift (89%) rename WorkoutsPlus/{ => Features}/Workout/WorkoutListItem.swift (81%) rename WorkoutsPlus/{ActiveWorkout => Features/WorkoutSession}/ActiveWorkoutSession.swift (76%) rename WorkoutsPlus/{ActiveWorkout => Features/WorkoutSession}/ActiveWorkoutSessionControls.swift (100%) rename WorkoutsPlus/{ActiveWorkout => Features/WorkoutSession}/ActiveWorkoutSessionListItem.swift (70%) rename WorkoutsPlus/{Models => Features/WorkoutSession}/WorkoutSession.swift (79%) create mode 100644 WorkoutsPlus/Features/WorkoutSession/WorkoutSessionItem.swift delete mode 100644 WorkoutsPlus/Models/WorkoutSessionItem.swift diff --git a/WorkoutsPlus/Components/SetListItem.swift b/WorkoutsPlus/Components/SetListItem.swift index 564dacf..d4ddac8 100644 --- a/WorkoutsPlus/Components/SetListItem.swift +++ b/WorkoutsPlus/Components/SetListItem.swift @@ -49,19 +49,19 @@ struct SetListItem: View { } } -#Preview { - @Previewable @State var set = WorkoutItem(set: [ - WorkoutItem(Exercise("Squat")), - WorkoutItem(Exercise("Squat")), - WorkoutItem(Exercise("Squat"))]) - List { - SetListItem(workout: Workout(name: "RR"), set: $set) - } -} - -#Preview("Empty Database") { - @Previewable @State var set = WorkoutItem(set: []) - List { - SetListItem(workout: Workout(name: "RR"), set: $set) - } -} +//#Preview { +// @Previewable @State var set = WorkoutItem(set: [ +// WorkoutItem(Exercise("Squat")), +// WorkoutItem(Exercise("Squat")), +// WorkoutItem(Exercise("Squat"))]) +// List { +// SetListItem(workout: Workout(name: "RR"), set: $set) +// } +//} +// +//#Preview("Empty Database") { +// @Previewable @State var set = WorkoutItem(set: []) +// List { +// SetListItem(workout: Workout(name: "RR"), set: $set) +// } +//} diff --git a/WorkoutsPlus/Models/Protocols.swift b/WorkoutsPlus/Configuration/Protocols.swift similarity index 100% rename from WorkoutsPlus/Models/Protocols.swift rename to WorkoutsPlus/Configuration/Protocols.swift diff --git a/WorkoutsPlus/Debug/SampleData.swift b/WorkoutsPlus/Configuration/SampleData.swift similarity index 100% rename from WorkoutsPlus/Debug/SampleData.swift rename to WorkoutsPlus/Configuration/SampleData.swift diff --git a/WorkoutsPlus/ContentView.swift b/WorkoutsPlus/ContentView.swift index d54985f..0a39f7c 100644 --- a/WorkoutsPlus/ContentView.swift +++ b/WorkoutsPlus/ContentView.swift @@ -49,8 +49,7 @@ struct ContentView: View { Section { NavigationLink( destination: ActiveWorkoutSession( - activeWorkoutSession: $activeWorkoutSession, - activeWorkout: activeWorkoutSession.workout) + activeWorkoutSession: $activeWorkoutSession) ) { HStack { Label("Back to Session", systemImage: "memories") diff --git a/WorkoutsPlus/Debug/DebugList.swift b/WorkoutsPlus/DebugList.swift similarity index 100% rename from WorkoutsPlus/Debug/DebugList.swift rename to WorkoutsPlus/DebugList.swift diff --git a/WorkoutsPlus/Debug/ExampleView.swift b/WorkoutsPlus/ExampleView.swift similarity index 100% rename from WorkoutsPlus/Debug/ExampleView.swift rename to WorkoutsPlus/ExampleView.swift diff --git a/WorkoutsPlus/Models/Equipment.swift b/WorkoutsPlus/Features/Exercise/Equipment.swift similarity index 100% rename from WorkoutsPlus/Models/Equipment.swift rename to WorkoutsPlus/Features/Exercise/Equipment.swift diff --git a/WorkoutsPlus/Models/Exercise.swift b/WorkoutsPlus/Features/Exercise/Exercise.swift similarity index 100% rename from WorkoutsPlus/Models/Exercise.swift rename to WorkoutsPlus/Features/Exercise/Exercise.swift diff --git a/WorkoutsPlus/Exercise/ExerciseDetail.swift b/WorkoutsPlus/Features/Exercise/ExerciseDetail.swift similarity index 100% rename from WorkoutsPlus/Exercise/ExerciseDetail.swift rename to WorkoutsPlus/Features/Exercise/ExerciseDetail.swift diff --git a/WorkoutsPlus/Exercise/ExerciseEditor.swift b/WorkoutsPlus/Features/Exercise/ExerciseEditor.swift similarity index 100% rename from WorkoutsPlus/Exercise/ExerciseEditor.swift rename to WorkoutsPlus/Features/Exercise/ExerciseEditor.swift diff --git a/WorkoutsPlus/Exercise/ExerciseLibrary.swift b/WorkoutsPlus/Features/Exercise/ExerciseLibrary.swift similarity index 100% rename from WorkoutsPlus/Exercise/ExerciseLibrary.swift rename to WorkoutsPlus/Features/Exercise/ExerciseLibrary.swift diff --git a/WorkoutsPlus/Models/Food.swift b/WorkoutsPlus/Features/Food/Food.swift similarity index 100% rename from WorkoutsPlus/Models/Food.swift rename to WorkoutsPlus/Features/Food/Food.swift diff --git a/WorkoutsPlus/Models/Unit.swift b/WorkoutsPlus/Features/Food/Unit.swift similarity index 100% rename from WorkoutsPlus/Models/Unit.swift rename to WorkoutsPlus/Features/Food/Unit.swift diff --git a/WorkoutsPlus/Home/ActivityLog.swift b/WorkoutsPlus/Features/Home/ActivityLog.swift similarity index 100% rename from WorkoutsPlus/Home/ActivityLog.swift rename to WorkoutsPlus/Features/Home/ActivityLog.swift diff --git a/WorkoutsPlus/Home/Miniplayer.swift b/WorkoutsPlus/Features/Home/Miniplayer.swift similarity index 100% rename from WorkoutsPlus/Home/Miniplayer.swift rename to WorkoutsPlus/Features/Home/Miniplayer.swift diff --git a/WorkoutsPlus/Home/WorkoutLog.swift b/WorkoutsPlus/Features/Home/WorkoutLog.swift similarity index 98% rename from WorkoutsPlus/Home/WorkoutLog.swift rename to WorkoutsPlus/Features/Home/WorkoutLog.swift index 37f3b7a..921c804 100644 --- a/WorkoutsPlus/Home/WorkoutLog.swift +++ b/WorkoutsPlus/Features/Home/WorkoutLog.swift @@ -75,7 +75,7 @@ struct WorkoutLog: View { ForEach(workoutSessions) { session in VStack(alignment: .leading) { Text(session.startDate.ISO8601Format()) - Text(session.workout.name) + Text(session.name) .font(.subheadline) } }.onDelete(perform: deleteWorkoutSession) diff --git a/WorkoutsPlus/Onboarding/Onboarding.swift b/WorkoutsPlus/Features/Onboarding/Onboarding.swift similarity index 100% rename from WorkoutsPlus/Onboarding/Onboarding.swift rename to WorkoutsPlus/Features/Onboarding/Onboarding.swift diff --git a/WorkoutsPlus/Settings/Settings.swift b/WorkoutsPlus/Features/Settings/Settings.swift similarity index 100% rename from WorkoutsPlus/Settings/Settings.swift rename to WorkoutsPlus/Features/Settings/Settings.swift diff --git a/WorkoutsPlus/Models/Person.swift b/WorkoutsPlus/Features/Sharing/Person.swift similarity index 100% rename from WorkoutsPlus/Models/Person.swift rename to WorkoutsPlus/Features/Sharing/Person.swift diff --git a/WorkoutsPlus/Workout/AddWorkout.swift b/WorkoutsPlus/Features/Workout/AddWorkout.swift similarity index 100% rename from WorkoutsPlus/Workout/AddWorkout.swift rename to WorkoutsPlus/Features/Workout/AddWorkout.swift diff --git a/WorkoutsPlus/Models/Workout.swift b/WorkoutsPlus/Features/Workout/Workout.swift similarity index 100% rename from WorkoutsPlus/Models/Workout.swift rename to WorkoutsPlus/Features/Workout/Workout.swift diff --git a/WorkoutsPlus/Workout/WorkoutDetail.swift b/WorkoutsPlus/Features/Workout/WorkoutDetail.swift similarity index 100% rename from WorkoutsPlus/Workout/WorkoutDetail.swift rename to WorkoutsPlus/Features/Workout/WorkoutDetail.swift diff --git a/WorkoutsPlus/Workout/WorkoutIconSelector.swift b/WorkoutsPlus/Features/Workout/WorkoutIconSelector.swift similarity index 100% rename from WorkoutsPlus/Workout/WorkoutIconSelector.swift rename to WorkoutsPlus/Features/Workout/WorkoutIconSelector.swift diff --git a/WorkoutsPlus/Models/WorkoutItem.swift b/WorkoutsPlus/Features/Workout/WorkoutItem.swift similarity index 77% rename from WorkoutsPlus/Models/WorkoutItem.swift rename to WorkoutsPlus/Features/Workout/WorkoutItem.swift index d34de3e..645bc96 100644 --- a/WorkoutsPlus/Models/WorkoutItem.swift +++ b/WorkoutsPlus/Features/Workout/WorkoutItem.swift @@ -37,14 +37,14 @@ final class WorkoutItem: Nameable, Positionable { var id = UUID() var name: String var workout: Workout? + // TODO: Make WorkoutItem a protocol so the type can be distinguished by the class type var workoutItemType: WorkoutItemType // Differentiates between exercise/rest/set var position: Int = 0 var set: [WorkoutItem] = [] - // Exercise has to be optional to allow Rest and Set to be a WorkoutItem (without being an Exercise). - var exerciseData: Exercise? // Do Push-up | Run Marathon - var plannedReps: Int // 8 times | 1 time - var plannedValue: Double // With 10 | 42,187 + var exercise: Exercise // Do Push-up | Run Marathon + var plannedReps: Int // 8 times | 1 time + var plannedValue: Double // With 10 | 42,187 var metric: ExerciseMetric? // kg (weight) | km (distance) enum WorkoutItemType: Codable { @@ -54,7 +54,7 @@ final class WorkoutItem: Nameable, Positionable { } init(_ exercise: Exercise) { - self.exerciseData = exercise + self.exercise = exercise self.workoutItemType = .exercise // Push-up @@ -67,27 +67,25 @@ final class WorkoutItem: Nameable, Positionable { self.metric = exercise.metric } - init(set: [WorkoutItem] = []) { - self.workoutItemType = .set - self.name = "Set" - self.plannedReps = 3 - self.plannedValue = 0 - set.forEach(addChild) - } - + // init(set: [WorkoutItem] = []) { + // self.workoutItemType = .set + // self.name = "Set" + // self.plannedReps = 3 + // self.plannedValue = 0 + // set.forEach(addChild) + // } + // init(rest: Double) { + // self.workoutItemType = .rest + // self.name = "Rest" + // self.plannedReps = 1 + // self.plannedValue = rest + // self.metric = .time + // } func addChild(_ child: WorkoutItem) { if self.workoutItemType == .set { self.set.append(child) } } - - init(rest: Double) { - self.workoutItemType = .rest - self.name = "Rest" - self.plannedReps = 1 - self.plannedValue = rest - self.metric = .time - } } extension WorkoutItem { diff --git a/WorkoutsPlus/Workout/WorkoutItemLibrarySheet.swift b/WorkoutsPlus/Features/Workout/WorkoutItemLibrarySheet.swift similarity index 81% rename from WorkoutsPlus/Workout/WorkoutItemLibrarySheet.swift rename to WorkoutsPlus/Features/Workout/WorkoutItemLibrarySheet.swift index e64df73..88b0965 100644 --- a/WorkoutsPlus/Workout/WorkoutItemLibrarySheet.swift +++ b/WorkoutsPlus/Features/Workout/WorkoutItemLibrarySheet.swift @@ -19,17 +19,17 @@ struct WorkoutItemLibrarySheet: View { var body: some View { Group { List { - Section(header: Text("Utilities")) { - AddItemButton(label: "Set") { - addWorkoutItemtoWorkout(WorkoutItem(set: [ - WorkoutItem(Exercise("Set item 1")), - WorkoutItem(Exercise("Set item 2")) - ])) - } - AddItemButton(label: "Rest") { - addWorkoutItemtoWorkout(WorkoutItem(rest: 45)) - } - } +// Section(header: Text("Utilities")) { +// AddItemButton(label: "Set") { +// addWorkoutItemtoWorkout(WorkoutItem(set: [ +// WorkoutItem(Exercise("Set item 1")), +// WorkoutItem(Exercise("Set item 2")) +// ])) +// } +// AddItemButton(label: "Rest") { +// addWorkoutItemtoWorkout(WorkoutItem(rest: 45)) +// } +// } Section(header: Text("Excersises")) { if !exercises.isEmpty { ForEach(exercises) { exercise in diff --git a/WorkoutsPlus/Workout/WorkoutLibrary.swift b/WorkoutsPlus/Features/Workout/WorkoutLibrary.swift similarity index 89% rename from WorkoutsPlus/Workout/WorkoutLibrary.swift rename to WorkoutsPlus/Features/Workout/WorkoutLibrary.swift index 4a2df1a..606bd05 100644 --- a/WorkoutsPlus/Workout/WorkoutLibrary.swift +++ b/WorkoutsPlus/Features/Workout/WorkoutLibrary.swift @@ -34,18 +34,20 @@ struct WorkoutLibrary: View { NavigationLink { WorkoutDetail(activeWorkoutSession: $activeWorkoutSession, workout: workout) } label: { - Button(action: { - activeWorkoutSession = workout.start() - }) { - Image(systemName: "play.fill") - .foregroundStyle(.green) - } - // TODO: Decide if icon should appear here/create custom view - // Image(systemName: workout.workoutIconSystemName) - // .foregroundStyle(workout.workoutIconColorName.color) + Image(systemName: workout.workoutIconSystemName) + .foregroundStyle(workout.workoutIconColorName.color) Text(workout.name) } + .swipeActions(edge: .leading) { + Button { + activeWorkoutSession = workout.start() + } label: { + Label("Start", systemImage: "play") + .tint(.green) + } + } } + .onDelete(perform: deleteWorkout) if filteredItems.isEmpty { ContentUnavailableView.search(text: searchText) diff --git a/WorkoutsPlus/Workout/WorkoutListItem.swift b/WorkoutsPlus/Features/Workout/WorkoutListItem.swift similarity index 81% rename from WorkoutsPlus/Workout/WorkoutListItem.swift rename to WorkoutsPlus/Features/Workout/WorkoutListItem.swift index 2270d6e..cc9e499 100644 --- a/WorkoutsPlus/Workout/WorkoutListItem.swift +++ b/WorkoutsPlus/Features/Workout/WorkoutListItem.swift @@ -37,12 +37,12 @@ struct WorkoutListItem: View { #Preview { List { - WorkoutListItem(Workout(name: "RR"), WorkoutItem(set: [ - WorkoutItem(Exercise("Squat")), - WorkoutItem(Exercise("Squat")), - WorkoutItem(Exercise("Squat"))])) +// WorkoutListItem(Workout(name: "RR"), WorkoutItem(set: [ +// WorkoutItem(Exercise("Squat")), +// WorkoutItem(Exercise("Squat")), +// WorkoutItem(Exercise("Squat"))])) WorkoutListItem(Workout(name: "RR"), WorkoutItem(Exercise("Push-ups"))) - WorkoutListItem(Workout(name: "RR"), WorkoutItem(rest: 15)) +// WorkoutListItem(Workout(name: "RR"), WorkoutItem(rest: 15)) WorkoutListItem(Workout(name: "RR"), WorkoutItem(Exercise("Push-ups"))) WorkoutListItem(Workout(name: "RR"), WorkoutItem(Exercise("Sprint", .distance))) WorkoutListItem(Workout(name: "RR"), WorkoutItem(Exercise("Run", .time))) diff --git a/WorkoutsPlus/ActiveWorkout/ActiveWorkoutSession.swift b/WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSession.swift similarity index 76% rename from WorkoutsPlus/ActiveWorkout/ActiveWorkoutSession.swift rename to WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSession.swift index c814b47..7095078 100644 --- a/WorkoutsPlus/ActiveWorkout/ActiveWorkoutSession.swift +++ b/WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSession.swift @@ -1,6 +1,7 @@ import SwiftUI import SwiftData +// This view can only be viewed, if there exists a WorkoutSession that can be considered active (a person working out). struct ActiveWorkoutSession: View { @Environment(\.modelContext) private var modelContext @@ -10,17 +11,14 @@ struct ActiveWorkoutSession: View { @Query(sort: \WorkoutSession.name) var workoutSessions: [WorkoutSession] @Binding var activeWorkoutSession: WorkoutSession? - @Query(sort: \Workout.name) var workouts: [Workout] - @State var activeWorkout: Workout - var body: some View { VStack { List { Section(header: Text("Workout")) { - Text(activeWorkout.name) + Text(activeWorkoutSession!.name) } Section(header: Text("Exercises")) { - ForEach(getActiveWorkoutItems(activeWorkout: activeWorkout)) { workoutItem in + ForEach(activeWorkoutSession!.workoutSessionItems) { workoutItem in ActiveWorkoutSessionListItem(workoutItem: workoutItem) } } @@ -28,7 +26,6 @@ struct ActiveWorkoutSession: View { } .navigationTitle("Session") .toolbar { - if (isWorkingOut) { Button(action: { isWorkingOut = false activeWorkoutSession?.stop() @@ -41,21 +38,6 @@ struct ActiveWorkoutSession: View { .bold() .fontDesign(.rounded) .tint(.red) - } - else { - Button(action: { - isWorkingOut = true - activeWorkoutSession = activeWorkout.start() - }) { - HStack { - Image(systemName: "play.fill") - Text("Start") - } - } - .bold() - .fontDesign(.rounded) - .tint(.green) - } } } @@ -76,7 +58,7 @@ struct ActiveWorkoutSession: View { @Previewable @State var workout = Workout.sampleData.first! NavigationStack { - ActiveWorkoutSession(activeWorkoutSession: $activeWorkoutSession, activeWorkout: workout) + ActiveWorkoutSession(activeWorkoutSession: $activeWorkoutSession) } .onAppear { Defaults.shared.isWorkingOut = false diff --git a/WorkoutsPlus/ActiveWorkout/ActiveWorkoutSessionControls.swift b/WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSessionControls.swift similarity index 100% rename from WorkoutsPlus/ActiveWorkout/ActiveWorkoutSessionControls.swift rename to WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSessionControls.swift diff --git a/WorkoutsPlus/ActiveWorkout/ActiveWorkoutSessionListItem.swift b/WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSessionListItem.swift similarity index 70% rename from WorkoutsPlus/ActiveWorkout/ActiveWorkoutSessionListItem.swift rename to WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSessionListItem.swift index b65e8c7..6a75b55 100644 --- a/WorkoutsPlus/ActiveWorkout/ActiveWorkoutSessionListItem.swift +++ b/WorkoutsPlus/Features/WorkoutSession/ActiveWorkoutSessionListItem.swift @@ -8,14 +8,10 @@ import SwiftUI struct ActiveWorkoutSessionListItem: View { - var workoutItem: WorkoutItem + var workoutItem: WorkoutSessionItem var body: some View { HStack { - switch workoutItem.workoutItemType { - case .set: - Text(workoutItem.name) - case .exercise: Text(workoutItem.name) Spacer() Button(action: { @@ -24,17 +20,15 @@ struct ActiveWorkoutSessionListItem: View { Image(systemName: "info.circle") .foregroundColor(.blue) } - case .rest: - Text("Pause") - } } } } #Preview { + @Previewable @State var workoutSession = WorkoutSession(start: Workout.sampleData.first!) List { ForEach(WorkoutItem.sampleDataRecommendedRoutine) { item in - ActiveWorkoutSessionListItem(workoutItem: item) + ActiveWorkoutSessionListItem(workoutItem: WorkoutSessionItem(workoutSession: workoutSession, planned: item)) } } } diff --git a/WorkoutsPlus/Models/WorkoutSession.swift b/WorkoutsPlus/Features/WorkoutSession/WorkoutSession.swift similarity index 79% rename from WorkoutsPlus/Models/WorkoutSession.swift rename to WorkoutsPlus/Features/WorkoutSession/WorkoutSession.swift index 498b1d3..fdc9a5b 100644 --- a/WorkoutsPlus/Models/WorkoutSession.swift +++ b/WorkoutsPlus/Features/WorkoutSession/WorkoutSession.swift @@ -11,16 +11,16 @@ import SwiftData @Model final class WorkoutSession: Nameable { var id = UUID() - var name = "" - // The Workout is what *should* happen - var workout: Workout { - didSet { - self.name = workout?.name ?? "Unknown Workout" - } - } + var name: String + // TODO: Think about if a refrence to the workout makes sense; a Workout could change. + // var workout: Workout + var workoutSessionItems: [WorkoutSessionItem] = [] - init(start with: Workout) { - self.workout = with + init(start workout: Workout) { + self.name = workout.name + for workoutItem in workout.getWorkoutItems() { + workoutSessionItems.append(WorkoutSessionItem(workoutSession: self, planned: workoutItem)) + } } // State @@ -69,9 +69,7 @@ final class WorkoutSession: Nameable { } func nextExercise() { - if currentExercise < workout.getWorkoutItems().count - 1 { - currentExercise += 1 - } + } // MARK: -- Workout Information @@ -84,7 +82,7 @@ final class WorkoutSession: Nameable { } func getTotalExerciseCount() -> Double { - return Double(workout.getWorkoutItems().count) + return 100.0 } func getCurrentExerciseIndex() -> Double { @@ -96,10 +94,10 @@ final class WorkoutSession: Nameable { } func getCurrentExerciseName() -> String { - return workout.getWorkoutItems()[Int(currentExercise)].name + return "Hello" } func getCurrentExerciseMetric() -> String { - return String(workout.getWorkoutItems()[Int(currentExercise)].plannedReps) + return "Hello" } } diff --git a/WorkoutsPlus/Features/WorkoutSession/WorkoutSessionItem.swift b/WorkoutsPlus/Features/WorkoutSession/WorkoutSessionItem.swift new file mode 100644 index 0000000..633de35 --- /dev/null +++ b/WorkoutsPlus/Features/WorkoutSession/WorkoutSessionItem.swift @@ -0,0 +1,34 @@ +// +// WorkoutSessionItem.swift +// WorkoutsPlus +// +// Created by Felix Förtsch on 15.10.24. +// + +import Foundation +import SwiftData + +@Model +final class WorkoutSessionItem: Nameable, Positionable { + var id = UUID() + var position: Int + var name: String + + var workoutSession: WorkoutSession + + var plannedReps: Int // 8 times | 1 time + var plannedValue: Double // With 10 | 42,187 + var metric: ExerciseMetric? // kg (weight) | km (distance) + + var actualReps: Int? + var actualValue: Double? + + init(workoutSession: WorkoutSession, planned: WorkoutItem) { + self.workoutSession = workoutSession + self.name = planned.exercise.name + self.position = planned.position + self.plannedReps = planned.plannedReps + self.plannedValue = planned.plannedValue + self.metric = planned.metric + } +} diff --git a/WorkoutsPlus/Models/WorkoutSessionItem.swift b/WorkoutsPlus/Models/WorkoutSessionItem.swift deleted file mode 100644 index b90fd48..0000000 --- a/WorkoutsPlus/Models/WorkoutSessionItem.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// WorkoutSessionItem.swift -// WorkoutsPlus -// -// Created by Felix Förtsch on 15.10.24. -// - -import Foundation -import SwiftData - -@Model -final class WorkoutSessionItem { - var id = UUID() - - var workoutSession: WorkoutSession - - var exerciseData: WorkoutItem - var actualReps: Int? - var actualValue: Double? - - init(workoutSession: WorkoutSession, planned: WorkoutItem) { - self.workoutSession = workoutSession - self.exerciseData = planned - } -} diff --git a/WorkoutsPlus/er-diagram.md b/WorkoutsPlus/er-diagram.md index bfa798a..e40a2d6 100644 --- a/WorkoutsPlus/er-diagram.md +++ b/WorkoutsPlus/er-diagram.md @@ -3,10 +3,10 @@ erDiagram Exercise 1 .. 0+ Equipment : uses Exercise 1 -- 0+ WorkoutItem : "provides data for" Workout 1 .. 0+ WorkoutItem : collects - Workout 1 .. 0+ ViewModel : "provides data for" + Workout 1 .. 0+ WorkoutSession : "starts" WorkoutItem 1 -- 1 WorkoutSessionItem : "provides data for" WorkoutSession 1 -- 1+ WorkoutSessionItem : collects - ViewModel 1 -- 1+ WorkoutSession : "creates, starts" + ContentView 1 -- 1 WorkoutSession : "holds onto" Exercise { string name @@ -29,7 +29,7 @@ erDiagram int actualReps double actualValue } - ViewModel { + ContentView { Workout workout WorkoutSession workoutSession }