create ER diagram, refactor to conform to diagram, simplify session management
This commit is contained in:
@@ -8,50 +8,21 @@ struct ActiveWorkoutSession: View {
|
||||
@State var isTimerRunning: Bool = true
|
||||
|
||||
@Query(sort: \WorkoutSession.name) var workoutSessions: [WorkoutSession]
|
||||
@State var activeWorkoutSession: WorkoutSession?
|
||||
@Default(\.activeWorkoutSessionId) var activeWorkoutSessionId
|
||||
@Binding var activeWorkoutSession: WorkoutSession?
|
||||
|
||||
@Query(sort: \Workout.name) var workouts: [Workout]
|
||||
@State var activeWorkout: Workout?
|
||||
@Default(\.activeWorkoutId) var activeWorkoutId
|
||||
@State var activeWorkout: Workout
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
List {
|
||||
Section(header: Text("Workout"), footer: Text(activeWorkoutSession?.creationDate.ISO8601Format() ?? "Unknown Date")) {
|
||||
NavigationLink(destination: {
|
||||
ItemPicker<Workout>(selectedItem: $activeWorkout, items: workouts)
|
||||
}) {
|
||||
Text(activeWorkout?.name ?? "Select Workout")
|
||||
}
|
||||
.onChange(of: activeWorkout) { _, newWorkout in
|
||||
if let newWorkout {
|
||||
activeWorkoutId = newWorkout.id.uuidString
|
||||
activeWorkoutSession?.workout = newWorkout
|
||||
}
|
||||
}
|
||||
Section(header: Text("Workout")) {
|
||||
Text(activeWorkout.name)
|
||||
}
|
||||
|
||||
if let activeWorkout {
|
||||
Section(header: Text("Exercises")) {
|
||||
ForEach(getActiveWorkoutItems(activeWorkout: activeWorkout)) { workoutItem in
|
||||
ActiveWorkoutSessionListItem(workoutItem: workoutItem)
|
||||
}
|
||||
Section(header: Text("Exercises")) {
|
||||
ForEach(getActiveWorkoutItems(activeWorkout: activeWorkout)) { workoutItem in
|
||||
ActiveWorkoutSessionListItem(workoutItem: workoutItem)
|
||||
}
|
||||
} else {
|
||||
ContentUnavailableView {
|
||||
Label("Select a Workout", systemImage: "arrow.up")
|
||||
}
|
||||
}
|
||||
}
|
||||
// MARK: Workout Controls
|
||||
if (isWorkingOut) {
|
||||
if activeWorkoutSession != nil {
|
||||
ActiveWorkoutSessionControls(
|
||||
session: Binding(
|
||||
get: { self.activeWorkoutSession! },
|
||||
set: { self.activeWorkoutSession = $0 }
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,12 +41,11 @@ struct ActiveWorkoutSession: View {
|
||||
.bold()
|
||||
.fontDesign(.rounded)
|
||||
.tint(.red)
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
Button(action: {
|
||||
isWorkingOut = true
|
||||
if let activeWorkout {
|
||||
activeWorkoutSession?.start(with: activeWorkout)
|
||||
}
|
||||
activeWorkoutSession = activeWorkout.start()
|
||||
}) {
|
||||
HStack {
|
||||
Image(systemName: "play.fill")
|
||||
@@ -87,25 +57,6 @@ struct ActiveWorkoutSession: View {
|
||||
.tint(.green)
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
if let activeWorkoutSession = getItem(from: workoutSessions, by: activeWorkoutSessionId) {
|
||||
self.activeWorkoutSession = activeWorkoutSession
|
||||
if let workout = getItem(from: workouts, by: activeWorkoutId) {
|
||||
self.activeWorkout = workout
|
||||
}
|
||||
} else {
|
||||
createNewWorkoutSession()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func createNewWorkoutSession() {
|
||||
let newWorkoutSession = WorkoutSession()
|
||||
activeWorkoutSessionId = newWorkoutSession.id.uuidString
|
||||
if let selectedWorkout = getItem(from: workouts, by: activeWorkoutId) {
|
||||
newWorkoutSession.workout = selectedWorkout
|
||||
}
|
||||
self.activeWorkoutSession = newWorkoutSession
|
||||
}
|
||||
|
||||
private func getActiveWorkoutItems(activeWorkout: Workout?) -> [WorkoutItem] {
|
||||
@@ -120,10 +71,12 @@ struct ActiveWorkoutSession: View {
|
||||
}
|
||||
}
|
||||
|
||||
#Preview("RR Selected") {
|
||||
@Previewable @State var activeWorkout = Workout.sampleData.first!
|
||||
#Preview {
|
||||
@Previewable @State var activeWorkoutSession: WorkoutSession?
|
||||
@Previewable @State var workout = Workout.sampleData.first!
|
||||
|
||||
NavigationStack {
|
||||
ActiveWorkoutSession(activeWorkout: activeWorkout)
|
||||
ActiveWorkoutSession(activeWorkoutSession: $activeWorkoutSession, activeWorkout: workout)
|
||||
}
|
||||
.onAppear {
|
||||
Defaults.shared.isWorkingOut = false
|
||||
@@ -131,18 +84,13 @@ struct ActiveWorkoutSession: View {
|
||||
.modelContainer(SampleData.shared.modelContainer)
|
||||
}
|
||||
|
||||
#Preview("No Workout Selected") {
|
||||
NavigationStack {
|
||||
ActiveWorkoutSession()
|
||||
}
|
||||
.onAppear {
|
||||
Defaults.shared.isWorkingOut = false
|
||||
}
|
||||
.modelContainer(SampleData.shared.modelContainer)
|
||||
}
|
||||
|
||||
#Preview("No Workout Data available") {
|
||||
NavigationStack {
|
||||
ActiveWorkoutSession()
|
||||
}
|
||||
}
|
||||
//#Preview("Empty modelContainer") {
|
||||
// @Previewable @State var activeWorkoutSession: WorkoutSession?
|
||||
//
|
||||
// NavigationStack {
|
||||
// ActiveWorkoutSession(activeWorkoutSession: $activeWorkoutSession)
|
||||
// }
|
||||
// .onAppear {
|
||||
// Defaults.shared.isWorkingOut = false
|
||||
// }
|
||||
//}
|
||||
|
||||
Reference in New Issue
Block a user