WIP
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
1C485C832A489B9C00A6F896 /* CompletedWorkouts.json in Resources */ = {isa = PBXBuildFile; fileRef = 1C485C822A489B9C00A6F896 /* CompletedWorkouts.json */; };
|
||||
1C485C872A4915C400A6F896 /* CreateWorkoutItemPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C485C862A4915C400A6F896 /* CreateWorkoutItemPickerView.swift */; };
|
||||
1C485C8A2A492BB400A6F896 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C485C892A492BB400A6F896 /* LoginView.swift */; };
|
||||
1C485C8C2A49D65600A6F896 /* WorkoutHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C485C8B2A49D65600A6F896 /* WorkoutHistoryView.swift */; };
|
||||
1C485C8D2A49D95700A6F896 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A822A42347D0042FFBD /* Extensions.swift */; };
|
||||
1CF65A262A3972840042FFBD /* Werkout_iosApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A252A3972840042FFBD /* Werkout_iosApp.swift */; };
|
||||
1CF65A282A3972840042FFBD /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A272A3972840042FFBD /* Persistence.swift */; };
|
||||
1CF65A2B2A3972840042FFBD /* Werkout_ios.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A292A3972840042FFBD /* Werkout_ios.xcdatamodeld */; };
|
||||
@@ -24,7 +26,7 @@
|
||||
1CF65A4C2A39FDA20042FFBD /* WorkoutDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A4B2A39FDA20042FFBD /* WorkoutDetailView.swift */; };
|
||||
1CF65A4E2A39FF200042FFBD /* WorkoutDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A4D2A39FF200042FFBD /* WorkoutDetailViewModel.swift */; };
|
||||
1CF65A502A3A1EA90042FFBD /* BridgeModule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A4F2A3A1EA90042FFBD /* BridgeModule.swift */; };
|
||||
1CF65A522A3A90A00042FFBD /* PreviewWorkout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A512A3A90A00042FFBD /* PreviewWorkout.swift */; };
|
||||
1CF65A522A3A90A00042FFBD /* PreviewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A512A3A90A00042FFBD /* PreviewData.swift */; };
|
||||
1CF65A542A3A9AF30042FFBD /* Straight_Leg_Sit_Up.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 1CF65A532A3A9A990042FFBD /* Straight_Leg_Sit_Up.mp4 */; };
|
||||
1CF65A572A3BF3830042FFBD /* AllMuscles.json in Resources */ = {isa = PBXBuildFile; fileRef = 1CF65A562A3BF3830042FFBD /* AllMuscles.json */; };
|
||||
1CF65A592A3BF4B60042FFBD /* Muscle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A582A3BF4B60042FFBD /* Muscle.swift */; };
|
||||
@@ -57,7 +59,7 @@
|
||||
1CF65AA82A452D9C0042FFBD /* Exercise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A442A39FB550042FFBD /* Exercise.swift */; };
|
||||
1CF65AA92A452D9C0042FFBD /* Workout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A422A39FB410042FFBD /* Workout.swift */; };
|
||||
1CF65AAA2A452D9C0042FFBD /* RegisteredUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A462A39FB6C0042FFBD /* RegisteredUser.swift */; };
|
||||
1CF65AAB2A452DAC0042FFBD /* PreviewWorkout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A512A3A90A00042FFBD /* PreviewWorkout.swift */; };
|
||||
1CF65AAB2A452DAC0042FFBD /* PreviewData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A512A3A90A00042FFBD /* PreviewData.swift */; };
|
||||
1CF65AAC2A452DF50042FFBD /* WorkoutOne.json in Resources */ = {isa = PBXBuildFile; fileRef = 1CF65A492A39FBB10042FFBD /* WorkoutOne.json */; };
|
||||
1CF65AAD2A452DF50042FFBD /* Exercises.json in Resources */ = {isa = PBXBuildFile; fileRef = 1CF65A662A3BFF840042FFBD /* Exercises.json */; };
|
||||
1CF65AAE2A452DF50042FFBD /* AllWorkouts.json in Resources */ = {isa = PBXBuildFile; fileRef = 1CF65A642A3BF6BE0042FFBD /* AllWorkouts.json */; };
|
||||
@@ -99,6 +101,7 @@
|
||||
1C485C822A489B9C00A6F896 /* CompletedWorkouts.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CompletedWorkouts.json; sourceTree = "<group>"; };
|
||||
1C485C862A4915C400A6F896 /* CreateWorkoutItemPickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateWorkoutItemPickerView.swift; sourceTree = "<group>"; };
|
||||
1C485C892A492BB400A6F896 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = "<group>"; };
|
||||
1C485C8B2A49D65600A6F896 /* WorkoutHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutHistoryView.swift; sourceTree = "<group>"; };
|
||||
1CF65A222A3972840042FFBD /* Werkout_ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Werkout_ios.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1CF65A252A3972840042FFBD /* Werkout_iosApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Werkout_iosApp.swift; sourceTree = "<group>"; };
|
||||
1CF65A272A3972840042FFBD /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = "<group>"; };
|
||||
@@ -115,7 +118,7 @@
|
||||
1CF65A4B2A39FDA20042FFBD /* WorkoutDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutDetailView.swift; sourceTree = "<group>"; };
|
||||
1CF65A4D2A39FF200042FFBD /* WorkoutDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutDetailViewModel.swift; sourceTree = "<group>"; };
|
||||
1CF65A4F2A3A1EA90042FFBD /* BridgeModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BridgeModule.swift; sourceTree = "<group>"; };
|
||||
1CF65A512A3A90A00042FFBD /* PreviewWorkout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewWorkout.swift; sourceTree = "<group>"; };
|
||||
1CF65A512A3A90A00042FFBD /* PreviewData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewData.swift; sourceTree = "<group>"; };
|
||||
1CF65A532A3A9A990042FFBD /* Straight_Leg_Sit_Up.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = Straight_Leg_Sit_Up.mp4; sourceTree = "<group>"; };
|
||||
1CF65A552A3AA6800042FFBD /* Werkout-ios-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Werkout-ios-Info.plist"; sourceTree = SOURCE_ROOT; };
|
||||
1CF65A562A3BF3830042FFBD /* AllMuscles.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = AllMuscles.json; sourceTree = "<group>"; };
|
||||
@@ -224,7 +227,7 @@
|
||||
children = (
|
||||
1CF65A532A3A9A990042FFBD /* Straight_Leg_Sit_Up.mp4 */,
|
||||
1CF65A322A3972850042FFBD /* Preview Assets.xcassets */,
|
||||
1CF65A512A3A90A00042FFBD /* PreviewWorkout.swift */,
|
||||
1CF65A512A3A90A00042FFBD /* PreviewData.swift */,
|
||||
);
|
||||
path = "Preview Content";
|
||||
sourceTree = "<group>";
|
||||
@@ -263,6 +266,7 @@
|
||||
1CF65A8C2A44B7680042FFBD /* CompletedWorkout */,
|
||||
1CF65A6C2A3F60100042FFBD /* CreateWorkout */,
|
||||
1CF65A882A44B7290042FFBD /* WorkoutDetail */,
|
||||
1C485C8B2A49D65600A6F896 /* WorkoutHistoryView.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
@@ -483,7 +487,7 @@
|
||||
1CF65A4E2A39FF200042FFBD /* WorkoutDetailViewModel.swift in Sources */,
|
||||
1CF65A472A39FB6C0042FFBD /* RegisteredUser.swift in Sources */,
|
||||
1CF65AB32A452F360042FFBD /* WatchPackageModel.swift in Sources */,
|
||||
1CF65A522A3A90A00042FFBD /* PreviewWorkout.swift in Sources */,
|
||||
1CF65A522A3A90A00042FFBD /* PreviewData.swift in Sources */,
|
||||
1CF65A852A43E8060042FFBD /* CompletedWorkout.swift in Sources */,
|
||||
1CF65A6E2A3F60480042FFBD /* CreateViewModels.swift in Sources */,
|
||||
1CF65A4C2A39FDA20042FFBD /* WorkoutDetailView.swift in Sources */,
|
||||
@@ -499,6 +503,7 @@
|
||||
1CF65A832A42347D0042FFBD /* Extensions.swift in Sources */,
|
||||
1CF65A282A3972840042FFBD /* Persistence.swift in Sources */,
|
||||
1CF65ABA2A4894430042FFBD /* UserStore.swift in Sources */,
|
||||
1C485C8C2A49D65600A6F896 /* WorkoutHistoryView.swift in Sources */,
|
||||
1CF65A5B2A3BF4BE0042FFBD /* Equipment.swift in Sources */,
|
||||
1CF65A452A39FB550042FFBD /* Exercise.swift in Sources */,
|
||||
1CF65A612A3BF6020042FFBD /* AddExerciseView.swift in Sources */,
|
||||
@@ -518,7 +523,8 @@
|
||||
1CF65AAA2A452D9C0042FFBD /* RegisteredUser.swift in Sources */,
|
||||
1CF65AB62A4532940042FFBD /* WatchMainViewModel.swift in Sources */,
|
||||
1CF65AA72A452D9C0042FFBD /* Muscle.swift in Sources */,
|
||||
1CF65AAB2A452DAC0042FFBD /* PreviewWorkout.swift in Sources */,
|
||||
1C485C8D2A49D95700A6F896 /* Extensions.swift in Sources */,
|
||||
1CF65AAB2A452DAC0042FFBD /* PreviewData.swift in Sources */,
|
||||
1CF65AA52A452D9C0042FFBD /* CompletedWorkout.swift in Sources */,
|
||||
1CF65AA82A452D9C0042FFBD /* Exercise.swift in Sources */,
|
||||
1CF65AB42A4530200042FFBD /* WatchPackageModel.swift in Sources */,
|
||||
|
||||
@@ -23,13 +23,6 @@ struct ExerciseElement: Codable {
|
||||
case weightAudio = "weight_audio"
|
||||
case createdAt = "created_at"
|
||||
}
|
||||
|
||||
var createdAtDate: Date {
|
||||
let df = DateFormatter()
|
||||
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
|
||||
df.locale = Locale(identifier: "en_US_POSIX")
|
||||
return df.date(from: self.createdAt) ?? Date()
|
||||
}
|
||||
}
|
||||
|
||||
struct ExerciseExercise: Codable, Hashable, Identifiable {
|
||||
@@ -67,11 +60,4 @@ struct ExerciseExercise: Codable, Hashable, Identifiable {
|
||||
case muscleGroups = "muscle_groups"
|
||||
case synonyms
|
||||
}
|
||||
|
||||
var createdAtDate: Date {
|
||||
let df = DateFormatter()
|
||||
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
|
||||
df.locale = Locale(identifier: "en_US_POSIX")
|
||||
return df.date(from: self.createdAt) ?? Date()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,11 @@ struct Workout: Codable, Identifiable {
|
||||
|
||||
var exercisesSortedByCreated_at: [ExerciseElement] {
|
||||
return self.exercises.sorted(by: {
|
||||
$0.createdAtDate < $1.createdAtDate
|
||||
if let lhsDate = $0.createdAt.dateFromServerDate,
|
||||
let rhsDate = $1.createdAt.dateFromServerDate {
|
||||
return lhsDate < rhsDate
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,9 +85,9 @@ class DataStore {
|
||||
|
||||
|
||||
func setupFakeData() {
|
||||
allWorkouts = PreviewWorkout.allWorkouts()
|
||||
allMuscles = PreviewWorkout.parseMuscle()
|
||||
allEquipment = PreviewWorkout.parseEquipment()
|
||||
allExercise = PreviewWorkout.parseExercises()
|
||||
allWorkouts = PreviewData.allWorkouts()
|
||||
allMuscles = PreviewData.parseMuscle()
|
||||
allEquipment = PreviewData.parseEquipment()
|
||||
allExercise = PreviewData.parseExercises()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,3 +37,22 @@ extension Date {
|
||||
return isoFormatter.string(from: self)
|
||||
}
|
||||
}
|
||||
|
||||
extension String {
|
||||
var dateFromServerDate: Date? {
|
||||
let df = DateFormatter()
|
||||
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX"
|
||||
df.locale = Locale(identifier: "en_US_POSIX")
|
||||
return df.date(from: self)
|
||||
}
|
||||
}
|
||||
|
||||
extension Date {
|
||||
func get(_ components: Calendar.Component..., calendar: Calendar = Calendar.current) -> DateComponents {
|
||||
return calendar.dateComponents(Set(components), from: self)
|
||||
}
|
||||
|
||||
func get(_ component: Calendar.Component, calendar: Calendar = Calendar.current) -> Int {
|
||||
return calendar.component(component, from: self)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,30 @@
|
||||
"difficulty": 1,
|
||||
"total_time": 112,
|
||||
"workout_start_time": "2015-10-22T19:50:08Z",
|
||||
"notes": "free",
|
||||
"notes": "🔥 i almost died",
|
||||
"total_calories": 123.0
|
||||
}, {
|
||||
"id": 12,
|
||||
"workout": {
|
||||
"id": 20,
|
||||
"registered_user": {
|
||||
"id": 2,
|
||||
"first_name": "test2_first",
|
||||
"last_name": "test2_last",
|
||||
"image": "",
|
||||
"nick_name": null
|
||||
},
|
||||
"created_at": "2023-06-20T21:03:00.124080Z",
|
||||
"updated_at": "2023-06-20T21:03:00.125595Z",
|
||||
"name": "Ipad",
|
||||
"description": "description"
|
||||
},
|
||||
"created_at": "2023-06-24T04:24:18.564094Z",
|
||||
"updated_at": "2023-06-24T04:24:18.567762Z",
|
||||
"difficulty": 1,
|
||||
"total_time": 112,
|
||||
"workout_start_time": "2015-10-22T19:50:08Z",
|
||||
"notes": "this workout sucked",
|
||||
"total_calories": 123.0
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//
|
||||
// PreviewWorkout.swift
|
||||
// PreviewData.swift
|
||||
// Werkout_ios
|
||||
//
|
||||
// Created by Trey Tartt on 6/14/23.
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
class PreviewWorkout {
|
||||
class PreviewData {
|
||||
class func workout() -> Workout {
|
||||
let filepath = Bundle.main.path(forResource: "WorkoutOne", ofType: "json")!
|
||||
let data = try! Data(NSData(contentsOfFile: filepath))
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
-apple watch
|
||||
|
||||
account view
|
||||
-account view
|
||||
workout history view
|
||||
calorie upload
|
||||
-calorie upload
|
||||
|
||||
video view on iphone during workout
|
||||
|
||||
|
||||
@@ -51,6 +51,6 @@ class UserStore: ObservableObject {
|
||||
}
|
||||
|
||||
func setFakeUser() {
|
||||
self.registeredUser = PreviewWorkout.parseRegisterdUser()
|
||||
self.registeredUser = PreviewData.parseRegisterdUser()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import SwiftUI
|
||||
struct AccountView: View {
|
||||
@State var completedWorkouts: [CompletedWorkout]?
|
||||
@ObservedObject var userStore = UserStore.shared
|
||||
@State var showCompletedWorkouts: Bool = false
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading) {
|
||||
@@ -44,8 +45,19 @@ struct AccountView: View {
|
||||
Text("Last workout:")
|
||||
Text(lastWorkout.workoutStartTime)
|
||||
}
|
||||
|
||||
Button("View All Workouts", action: {
|
||||
showCompletedWorkouts = true
|
||||
})
|
||||
.frame(maxWidth: .infinity, alignment: .center)
|
||||
.frame(height: 44)
|
||||
.foregroundColor(.blue)
|
||||
.background(.yellow)
|
||||
.cornerRadius(8)
|
||||
.padding()
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Spacer()
|
||||
@@ -62,11 +74,17 @@ struct AccountView: View {
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
.padding()
|
||||
.sheet(isPresented: $showCompletedWorkouts) {
|
||||
if let history = completedWorkouts {
|
||||
WorkoutHistoryView(completedWorkouts: history)
|
||||
}
|
||||
}
|
||||
.onAppear{
|
||||
if completedWorkouts == nil {
|
||||
fetchCompletedWorkouts()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func fetchCompletedWorkouts() {
|
||||
@@ -83,7 +101,7 @@ struct AccountView: View {
|
||||
|
||||
struct AccountView_Previews: PreviewProvider {
|
||||
static let userStore = UserStore.shared
|
||||
static let completedWorkouts = PreviewWorkout.parseCompletedWorkouts()
|
||||
static let completedWorkouts = PreviewData.parseCompletedWorkouts()
|
||||
|
||||
static var previews: some View {
|
||||
AccountView(completedWorkouts: completedWorkouts)
|
||||
|
||||
@@ -90,6 +90,6 @@ struct AllWorkoutsView: View {
|
||||
|
||||
struct AllWorkoutsView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
AllWorkoutsView(workouts: PreviewWorkout.allWorkouts())
|
||||
AllWorkoutsView(workouts: PreviewData.allWorkouts())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ struct CompletedWorkoutView_Previews: PreviewProvider {
|
||||
"heart_rates": [65,65,4,54,232,12]
|
||||
] as [String : Any]
|
||||
|
||||
static let workout = PreviewWorkout.workout()
|
||||
static let workout = PreviewData.workout()
|
||||
|
||||
static var previews: some View {
|
||||
CompletedWorkoutView(postData: CompletedWorkoutView_Previews.postBody,
|
||||
|
||||
@@ -147,8 +147,8 @@ struct ExternalWorkoutDetailView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ExternalWorkoutDetailView().environmentObject({ () -> BridgeModule in
|
||||
let envObj = BridgeModule.shared
|
||||
envObj.currentWorkout = PreviewWorkout.workout()
|
||||
bridge.currentExercise = PreviewWorkout.workout().exercisesSortedByCreated_at.first!
|
||||
envObj.currentWorkout = PreviewData.workout()
|
||||
bridge.currentExercise = PreviewData.workout().exercisesSortedByCreated_at.first!
|
||||
return envObj
|
||||
}() )
|
||||
}
|
||||
|
||||
@@ -244,7 +244,7 @@ struct CountdownView: View {
|
||||
}
|
||||
|
||||
struct WorkoutDetailView_Previews: PreviewProvider {
|
||||
static let workoutDetail = PreviewWorkout.workout()
|
||||
static let workoutDetail = PreviewData.workout()
|
||||
static var previews: some View {
|
||||
WorkoutDetailView(viewModel: WorkoutDetailViewModel(workout: WorkoutDetailView_Previews.workoutDetail, status: .showWorkout(WorkoutDetailView_Previews.workoutDetail)))
|
||||
}
|
||||
|
||||
85
Werkout_ios/Views/WorkoutHistoryView.swift
Normal file
85
Werkout_ios/Views/WorkoutHistoryView.swift
Normal file
@@ -0,0 +1,85 @@
|
||||
//
|
||||
// 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let completedWorkouts: [CompletedWorkout]
|
||||
|
||||
var body: some View {
|
||||
List {
|
||||
ForEach(completedWorkouts, id:\.self.id) { completedWorkout in
|
||||
HStack {
|
||||
VStack {
|
||||
if let date = completedWorkout.workoutStartTime.dateFromServerDate {
|
||||
Text(DateFormatter().shortMonthSymbols[date.get(.month) - 1])
|
||||
|
||||
Text("\(date.get(.day))")
|
||||
Text("\(date.get(.hour))")
|
||||
}
|
||||
}
|
||||
|
||||
VStack(alignment: .leading) {
|
||||
HStack {
|
||||
|
||||
}
|
||||
Text(completedWorkout.workout.name)
|
||||
.font(.title3)
|
||||
|
||||
if let desc = completedWorkout.workout.description {
|
||||
Text(desc)
|
||||
.font(.footnote)
|
||||
}
|
||||
|
||||
Divider()
|
||||
|
||||
if let difficulty = completedWorkout.difficulty,
|
||||
let string = DifficltyString.init(rawValue: difficulty)?.stringValue {
|
||||
Text(string)
|
||||
}
|
||||
|
||||
if let notes = completedWorkout.notes {
|
||||
Text(notes)
|
||||
}
|
||||
}
|
||||
.padding(.leading)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct WorkoutHistoryView_Previews: PreviewProvider {
|
||||
static let fakeHistory = PreviewData.parseCompletedWorkouts()
|
||||
static var previews: some View {
|
||||
WorkoutHistoryView(completedWorkouts: fakeHistory)
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
import SwiftUI
|
||||
|
||||
struct ContentView: View {
|
||||
let exercise = PreviewWorkout.parseEquipment()[2]
|
||||
let exercise = PreviewData.parseEquipment()[2]
|
||||
@StateObject var vm = WatchMainViewModel()
|
||||
|
||||
var body: some View {
|
||||
|
||||
Reference in New Issue
Block a user