// // WorkoutHistoryView.swift // Werkout_ios // // Created by Trey Tartt on 6/26/23. // import SwiftUI struct WorkoutHistoryView: View { enum DifficltyString: Int { case easy = 1 case moderate case average case hard case death var stringValue: String { switch self { case .easy: return "Easy" case .moderate: return "Moderate" case .average: return "Average" case .hard: return "Hard" case .death: return "Death" } } var color: Color { switch self { case .easy: return WerkoutTheme.success case .moderate: return Color(red: 0.4, green: 0.8, blue: 0.2) case .average: return WerkoutTheme.warning case .hard: return Color(red: 1.0, green: 0.5, blue: 0.2) case .death: return WerkoutTheme.danger } } } let completedWorkouts: [CompletedWorkout] @State private var selectedPlannedWorkout: Workout? private var sortedWorkouts: [CompletedWorkout] { completedWorkouts.sorted(by: { $0.createdAt > $1.createdAt }) } var body: some View { List { ForEach(sortedWorkouts, id: \.id) { completedWorkout in HStack { VStack { if let date = completedWorkout.workoutStartTime.dateFromServerDate { Text(date.monthString) .font(WerkoutTheme.caption) .foregroundStyle(WerkoutTheme.textSecondary) Text("\(date.get(.day))") .font(WerkoutTheme.stat.monospacedDigit()) .foregroundStyle(WerkoutTheme.accent) Text("\(date.get(.hour))") .font(WerkoutTheme.caption) .foregroundStyle(WerkoutTheme.textMuted) } } .frame(minWidth: 60) VStack(alignment: .leading) { Text(completedWorkout.workout.name) .font(WerkoutTheme.cardTitle) .foregroundStyle(WerkoutTheme.textPrimary) if let desc = completedWorkout.workout.description { Text(desc) .font(WerkoutTheme.caption) .foregroundStyle(WerkoutTheme.textSecondary) } Divider() .overlay(WerkoutTheme.divider) if let difficulty = completedWorkout.difficulty, let difficultyEnum = DifficltyString(rawValue: difficulty) { Text(difficultyEnum.stringValue) .font(WerkoutTheme.caption) .foregroundStyle(difficultyEnum.color) .padding(.horizontal, WerkoutTheme.sm) .padding(.vertical, WerkoutTheme.xs) .background(difficultyEnum.color.opacity(0.15)) .clipShape(RoundedRectangle(cornerRadius: WerkoutTheme.badgeRadius, style: .continuous)) } if let notes = completedWorkout.notes { Text(notes) .font(WerkoutTheme.bodyText) .foregroundStyle(WerkoutTheme.textSecondary) } } .padding(.leading) .contentShape(Rectangle()) .onTapGesture { selectedPlannedWorkout = completedWorkout.workout } } .listRowBackground(WerkoutTheme.surfaceCard) } } .listStyle(.plain) .background(WerkoutTheme.background) .scrollContentBackground(.hidden) .sheet(item: $selectedPlannedWorkout) { item in let viewModel = WorkoutDetailViewModel(workout: item, isPreview: true) WorkoutDetailView(viewModel: viewModel) } } } struct WorkoutHistoryView_Previews: PreviewProvider { static let fakeHistory = PreviewData.parseCompletedWorkouts() static var previews: some View { WorkoutHistoryView(completedWorkouts: fakeHistory) } }