create ER diagram, refactor to conform to diagram, simplify session management

This commit is contained in:
Felix Förtsch
2024-10-17 14:41:14 +02:00
parent b7f5caf9dd
commit 97ecbcc6f4
23 changed files with 394 additions and 226 deletions
@@ -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
// }
//}