118 lines
3.7 KiB
Swift
118 lines
3.7 KiB
Swift
import SwiftUI
|
|
import SwiftData
|
|
|
|
struct WorkoutLogListView: View {
|
|
@Environment(\.modelContext) private var modelContext
|
|
let workout: Workout
|
|
|
|
@State private var selectedLogIndex: Int = 0
|
|
|
|
var body: some View {
|
|
VStack {
|
|
if let logs = workout.logs?.sorted(by: { $0.order < $1.order }), !logs.isEmpty {
|
|
TabView(selection: $selectedLogIndex) {
|
|
ForEach(Array(logs.enumerated()), id: \.element.id) { index, log in
|
|
WorkoutLogCard(log: log, index: index)
|
|
.tag(index)
|
|
}
|
|
}
|
|
.tabViewStyle(.page)
|
|
// .indexViewStyle(.page(backgroundDisplayMode: .always))
|
|
} else {
|
|
Text("No exercises in this workout")
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
.navigationTitle(workout.split?.name ?? "Workout")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
}
|
|
}
|
|
|
|
struct WorkoutLogCard: View {
|
|
let log: WorkoutLog
|
|
let index: Int
|
|
|
|
var body: some View {
|
|
VStack(spacing: 12) {
|
|
Text(log.exerciseName)
|
|
.font(.headline)
|
|
.multilineTextAlignment(.center)
|
|
|
|
HStack {
|
|
VStack {
|
|
Text("\(log.sets)")
|
|
.font(.title2)
|
|
Text("Sets")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
|
|
VStack {
|
|
Text("\(log.reps)")
|
|
.font(.title2)
|
|
Text("Reps")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
|
|
VStack {
|
|
Text("\(log.weight)")
|
|
.font(.title2)
|
|
Text("Weight")
|
|
.font(.caption)
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
|
|
NavigationLink {
|
|
ExerciseProgressView(log: log)
|
|
} label: {
|
|
Text("Start")
|
|
.font(.headline)
|
|
.foregroundStyle(.white)
|
|
.frame(maxWidth: .infinity)
|
|
.padding(.vertical, 8)
|
|
.background(Color.blue)
|
|
.cornerRadius(8)
|
|
}
|
|
.buttonStyle(PlainButtonStyle())
|
|
|
|
Text(log.status?.name ?? "Not Started")
|
|
.font(.caption)
|
|
.foregroundStyle(statusColor(for: log.status))
|
|
}
|
|
.padding()
|
|
.background(Color.secondary.opacity(0.2))
|
|
.cornerRadius(12)
|
|
.padding(.horizontal)
|
|
}
|
|
|
|
private func statusColor(for status: WorkoutStatus?) -> Color {
|
|
guard let status = status else { return .secondary }
|
|
|
|
switch status {
|
|
case .notStarted:
|
|
return .secondary
|
|
case .inProgress:
|
|
return .blue
|
|
case .completed:
|
|
return .green
|
|
case .skipped:
|
|
return .red
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
let container = AppContainer.preview
|
|
let workout = Workout(start: Date(), end: Date(), split: nil)
|
|
let log1 = WorkoutLog(workout: workout, exerciseName: "Bench Press", date: Date(), sets: 3, reps: 10, weight: 135)
|
|
let log2 = WorkoutLog(workout: workout, exerciseName: "Squats", date: Date(), order: 1, sets: 3, reps: 8, weight: 225)
|
|
|
|
return WorkoutLogListView(workout: workout)
|
|
.modelContainer(container)
|
|
}
|