70 lines
2.1 KiB
Swift
70 lines
2.1 KiB
Swift
import SwiftUI
|
|
import Collections
|
|
import HealthKit
|
|
import HKDatabase
|
|
|
|
struct WorkoutDetailView: View {
|
|
|
|
let workout: Workout
|
|
|
|
var metadata: [(key: String, value: Any)] {
|
|
workout.metadata.sorted { $0.key }
|
|
}
|
|
|
|
var body: some View {
|
|
List {
|
|
Section("Info") {
|
|
DetailRow("ID", value: workout.id)
|
|
DetailRow("Total Distance", kilometer: workout.totalDistance)
|
|
DetailRow("Goal", value: workout.goal)
|
|
}
|
|
if !workout.activities.isEmpty {
|
|
Section("Activities") {
|
|
ForEach(workout.activities, id: \.startDate) { activity in
|
|
NavigationLink(value: activity) {
|
|
DetailRow(activity.workoutConfiguration.activityType.description,
|
|
date: activity.startDate)
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
if !workout.events.isEmpty {
|
|
Section("Events") {
|
|
ForEach(workout.events) { event in
|
|
NavigationLink(value: event) {
|
|
DetailRow(event.type.description, date: event.dateInterval.start)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if !workout.metadata.isEmpty {
|
|
Section("Metadata") {
|
|
ForEach(metadata, id:\.key) { (key, value) in
|
|
DetailRow("\(key)", value: "\(value)")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle(workout.typeString)
|
|
.navigationDestination(for: HKWorkoutActivity.self) { activity in
|
|
ActivityDetailView(activity: activity)
|
|
}
|
|
.navigationDestination(for: HKWorkoutEvent.self) { event in
|
|
EventDetailView(event: event)
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
HealthDatabase.shared = .mock()
|
|
return NavigationStack {
|
|
WorkoutDetailView(workout: .mock1)
|
|
}
|
|
}
|
|
|
|
extension String: Identifiable {
|
|
|
|
public var id: Self { self }
|
|
}
|