simplify Exercise to only hold on to the unit of the metric, remove ValueKeyboard as input

This commit is contained in:
Felix Förtsch
2024-10-02 12:41:04 +02:00
parent 41a82f081a
commit b7f5caf9dd
15 changed files with 630 additions and 243 deletions
+52 -61
View File
@@ -5,6 +5,30 @@
// Created by Felix Förtsch on 10.08.24.
//
// TODO: Think about what's happening when an exercise (template) is deleted or changed
// If it is delete -> we just keep the WorkoutItem with the name :)
// The only relevant delete is delete Workout -> Delete Workoutitems
// { didSet { self.name = exercise?.name ?? "self.name" } }
// TODO: Wondering if a SortDescriptor in the Model is useful?
// https://old.reddit.com/r/SwiftUI/comments/1fnvkud/extracting_the_creation_of_swiftdata_query_into/
// static var sorted: SortDescriptor<WorkoutItem> {
// SortDescriptor(\.position, order: .forward)
// }
// struct ExerciseValue: ValueType {
// var value: String = ""
// var unit: ExerciseUnit
// }
// TODO: Deload items -> Think about how to model deload/sick/rest/holiday week
//enum PerformanceMetric: String, CaseIterable, CustomStringConvertible {
// case speed = "m/s"
// case pace = "s/m"
//
// var description: String { rawValue }
//}
import Foundation
import SwiftData
@@ -12,61 +36,36 @@ import SwiftData
final class WorkoutItem: Nameable, Positionable {
var id = UUID()
var name: String
var workout: Workout?
var workoutItemType: WorkoutItemType
var workoutItemType: WorkoutItemType // Differentiates between exercise/rest/set
var position: Int = 0
var set: [WorkoutItem] = []
var exercise: Exercise? // Do Push-up | Run Marathon
var reps: Int // 8 times | 1 time
var value: Double? // With 10 | 42,187
var metric: ExerciseMetric? // kg (weight) | km (distance)
enum WorkoutItemType: Codable {
// TODO: Add workout as WorkoutItemType (needs recursive dealing)
// case workout
case exercise
case rest
case set
case exerciseWithReps
case exerciseWithDuration
}
var position: Int = 0
// TODO: Wondering if a SortDescriptor in the Model is useful?
// https://old.reddit.com/r/SwiftUI/comments/1fnvkud/extracting_the_creation_of_swiftdata_query_into/
// static var sorted: SortDescriptor<WorkoutItem> {
// SortDescriptor(\.position, order: .forward)
// }
var reps: Int = 0
var duration: Int = 0
// EXERCISE
var exercise: Exercise?
// TODO: Think about what's happening when an exercise (template) is deleted or changed
// If it is delete -> we just keep the WorkoutItem with the name :)
// The only relevant delete is delete Workout -> Delete Workoutitems
// { didSet { self.name = exercise?.name ?? "self.name" } }
// TODO: Deload items -> Think about how to model deload/sick/rest/holiday week
// Exercise
init(reps: Int, _ exercise: String) {
self.workoutItemType = .exerciseWithReps
self.name = exercise
self.reps = reps
self.exercise = Exercise(exercise, .reps)
}
init(duration: Int, _ exercise: String) {
self.workoutItemType = .exerciseWithDuration
self.name = exercise
self.duration = duration
self.exercise = Exercise(exercise, .duration)
}
init(exercise: Exercise) {
self.workoutItemType = .exerciseWithReps
self.name = exercise.name
init(_ exercise: Exercise) {
self.exercise = exercise
self.workoutItemType = .exercise
// Push-up
self.name = exercise.name
// 8x
self.reps = 1
// 0
self.value = 0
// kg
self.metric = exercise.metric
}
// SET
var set: [WorkoutItem] = []
init(set: [WorkoutItem] = []) {
self.workoutItemType = .set
self.name = "Set"
@@ -80,38 +79,30 @@ final class WorkoutItem: Nameable, Positionable {
}
}
// PAUSE
init (rest: Int) {
init(rest: Double) {
self.workoutItemType = .rest
self.name = "Rest"
self.duration = rest
self.reps = 1
self.value = rest
self.metric = .time
}
}
extension WorkoutItem {
static let sampleDataRecommendedRoutine: [WorkoutItem] = {
var exercises = [WorkoutItem]()
for exercise in Exercise.sampleDataRecommendedRoutine {
exercises.append(WorkoutItem(exercise: exercise))
exercises.append(WorkoutItem(exercise))
}
// var set = WorkoutItem(workoutItems: [
// WorkoutItem(from: Exercise("Set item 1")),
// WorkoutItem(from: Exercise("Set item 2"))
// ])
// exercises.append(set)
return exercises
}()
static let sampleDataRings: [WorkoutItem] = {
var exercises = [WorkoutItem]()
for exercise in Exercise.sampleDataRings {
exercises.append(WorkoutItem(exercise: exercise))
exercises.append(WorkoutItem(exercise))
}
return exercises
}()
}