add ActiveWorkoutSession logic, refactor Home, add additional sample data, add isDebug
This commit is contained in:
@@ -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"),
|
||||
]
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
protocol Nameable: Identifiable {
|
||||
protocol Nameable: Identifiable, Hashable {
|
||||
var id: UUID { get }
|
||||
var name: String { get }
|
||||
}
|
||||
|
||||
@@ -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]
|
||||
}()
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}()
|
||||
|
||||
@@ -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 () { }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user