add ActiveWorkoutSession logic, refactor Home, add additional sample data, add isDebug

This commit is contained in:
Felix Förtsch
2024-09-14 17:01:20 +02:00
parent f45d6288dd
commit 0a400ff349
27 changed files with 710 additions and 189 deletions
+17 -2
View File
@@ -26,7 +26,22 @@ final class Exercise: Nameable {
}
extension Exercise {
static let sampleData: [Exercise] = [
static let sampleDataRecommendedRoutine: [Exercise] = [
Exercise("Shoulder Band Warm-up"),
Exercise("Squat Sky Reaches"),
Exercise("GMB Wrist Prep"),
Exercise("Dead Bugs"),
Exercise("Pull-up Progression"),
Exercise("Dip Progression"),
Exercise("Squat Progression"),
Exercise("Hinge Progression"),
Exercise("Row Progression"),
Exercise("Push-up Progression"),
Exercise("Handstand Practice"),
Exercise("Support Practice")
]
static let sampleDataRings: [Exercise] = [
Exercise("Dips"),
Exercise("Chin-ups"),
Exercise("Push-ups"),
@@ -34,6 +49,6 @@ extension Exercise {
Exercise("Hanging Knee Raises"),
Exercise("Pistol Squats"),
Exercise("Hanging Leg Curls"),
Exercise("Sissy Squats")
Exercise("Sissy Squats"),
]
}
+1 -1
View File
@@ -7,7 +7,7 @@
import Foundation
protocol Nameable: Identifiable {
protocol Nameable: Identifiable, Hashable {
var id: UUID { get }
var name: String { get }
}
+13 -7
View File
@@ -9,7 +9,7 @@ import SwiftUI
import SwiftData
@Model
final class Workout: Nameable {
final class Workout: Nameable, Hashable {
static var systemImage = "figure.run.square.stack"
var id = UUID()
@@ -50,6 +50,8 @@ final class Workout: Nameable {
exercise.position = index
}
}
func isSelected(workout: Workout) -> Bool { self.id == workout.id }
}
extension Workout {
@@ -116,14 +118,18 @@ extension Workout {
self.workoutItems = exercises
}
static let sampleData: Workout = {
var workout = Workout(name: "Recommended Routine")
for workoutItem in WorkoutItem.sampleData {
workout.add(workoutItem: workoutItem)
static let sampleData: [Workout] = {
var rr = Workout(name: "Recommended Routine")
for workoutItem in WorkoutItem.sampleDataRecommendedRoutine {
rr.add(workoutItem: workoutItem)
}
return workout
var rings = Workout(name: "Fully Body Rings")
for workoutItem in WorkoutItem.sampleDataRings {
rings.add(workoutItem: workoutItem)
}
return [rr, rings]
}()
}
+19 -7
View File
@@ -26,6 +26,8 @@ final class WorkoutItem: Nameable, Positionable {
// 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
init(_ reps: Int, _ exercise: String) {
self.workoutItemType = .exercise
@@ -67,18 +69,28 @@ extension WorkoutItem {
}
extension WorkoutItem {
static let sampleData: [WorkoutItem] = {
static let sampleDataRecommendedRoutine: [WorkoutItem] = {
var exercises = [WorkoutItem]()
for exercise in Exercise.sampleData {
for exercise in Exercise.sampleDataRecommendedRoutine {
exercises.append(WorkoutItem(from: exercise))
}
var set = WorkoutItem(workoutItems: [
WorkoutItem(from: Exercise("Set item 1")),
WorkoutItem(from: Exercise("Set item 2"))
])
exercises.append(set)
// 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(from: exercise))
}
return exercises
}()
+37 -14
View File
@@ -9,27 +9,50 @@ import Foundation
import SwiftData
@Model
final class WorkoutSession {
var workout: Workout
// Time
var startDate = Date.now
var stopDate: Date? = nil
var duration: TimeInterval? = nil
func stopWorkout() {
self.stopDate = Date.now
if let stopDate = stopDate {
self.duration = stopDate.timeIntervalSince(startDate)
final class WorkoutSession: Nameable {
var id = UUID()
var name = ""
var workout: Workout? {
didSet {
self.name = workout?.name ?? ""
}
}
// Time
var creationDate = Date.now
private var startDate: Date? = nil
private var stopDate: Date? = nil
private var duration: TimeInterval? = nil
// Exercise Progress
var currentExercise = 0
func isActive() -> Bool {
return startDate != nil && stopDate == nil
}
func startWorkoutSession() {
self.startDate = Date.now
}
func stopWorkoutSession() {
guard let startDate else { return }
self.stopDate = Date.now
self.duration = self.stopDate!.timeIntervalSince(startDate)
}
func elapsedTime(since startDate: Date) -> String {
let elapsedTime = Date.now.timeIntervalSince(startDate)
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.unitsStyle = .positional
return formatter.string(from: elapsedTime) ?? "00:00:00"
}
// var isCompleted: Bool
// var isPaused: Bool
// var isCancelled: Bool
// var isDeleted: Bool
// var isSynced: Bool
init (workout: Workout) {
self.workout = workout
}
init () { }
}