WIP
This commit is contained in:
@@ -40,6 +40,7 @@
|
|||||||
1CF65A7F2A4129320042FFBD /* Fetchables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A7E2A4129320042FFBD /* Fetchables.swift */; };
|
1CF65A7F2A4129320042FFBD /* Fetchables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A7E2A4129320042FFBD /* Fetchables.swift */; };
|
||||||
1CF65A812A412AA30042FFBD /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A802A412AA30042FFBD /* DataStore.swift */; };
|
1CF65A812A412AA30042FFBD /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A802A412AA30042FFBD /* DataStore.swift */; };
|
||||||
1CF65A832A42347D0042FFBD /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A822A42347D0042FFBD /* Extensions.swift */; };
|
1CF65A832A42347D0042FFBD /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A822A42347D0042FFBD /* Extensions.swift */; };
|
||||||
|
1CF65A852A43E8060042FFBD /* CompletedWorkout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A842A43E8060042FFBD /* CompletedWorkout.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@@ -79,6 +80,7 @@
|
|||||||
1CF65A7E2A4129320042FFBD /* Fetchables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fetchables.swift; sourceTree = "<group>"; };
|
1CF65A7E2A4129320042FFBD /* Fetchables.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fetchables.swift; sourceTree = "<group>"; };
|
||||||
1CF65A802A412AA30042FFBD /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = "<group>"; };
|
1CF65A802A412AA30042FFBD /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = "<group>"; };
|
||||||
1CF65A822A42347D0042FFBD /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
|
1CF65A822A42347D0042FFBD /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
|
||||||
|
1CF65A842A43E8060042FFBD /* CompletedWorkout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompletedWorkout.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@@ -156,6 +158,7 @@
|
|||||||
1CF65A462A39FB6C0042FFBD /* RegisteredUser.swift */,
|
1CF65A462A39FB6C0042FFBD /* RegisteredUser.swift */,
|
||||||
1CF65A582A3BF4B60042FFBD /* Muscle.swift */,
|
1CF65A582A3BF4B60042FFBD /* Muscle.swift */,
|
||||||
1CF65A5A2A3BF4BE0042FFBD /* Equipment.swift */,
|
1CF65A5A2A3BF4BE0042FFBD /* Equipment.swift */,
|
||||||
|
1CF65A842A43E8060042FFBD /* CompletedWorkout.swift */,
|
||||||
);
|
);
|
||||||
path = APIModels;
|
path = APIModels;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -285,6 +288,7 @@
|
|||||||
1CF65A4E2A39FF200042FFBD /* WorkoutDetailViewModel.swift in Sources */,
|
1CF65A4E2A39FF200042FFBD /* WorkoutDetailViewModel.swift in Sources */,
|
||||||
1CF65A472A39FB6C0042FFBD /* RegisteredUser.swift in Sources */,
|
1CF65A472A39FB6C0042FFBD /* RegisteredUser.swift in Sources */,
|
||||||
1CF65A522A3A90A00042FFBD /* PreviewWorkout.swift in Sources */,
|
1CF65A522A3A90A00042FFBD /* PreviewWorkout.swift in Sources */,
|
||||||
|
1CF65A852A43E8060042FFBD /* CompletedWorkout.swift in Sources */,
|
||||||
1CF65A6E2A3F60480042FFBD /* CreateViewModels.swift in Sources */,
|
1CF65A6E2A3F60480042FFBD /* CreateViewModels.swift in Sources */,
|
||||||
1CF65A4C2A39FDA20042FFBD /* WorkoutDetailView.swift in Sources */,
|
1CF65A4C2A39FDA20042FFBD /* WorkoutDetailView.swift in Sources */,
|
||||||
1CF65A432A39FB410042FFBD /* Workout.swift in Sources */,
|
1CF65A432A39FB410042FFBD /* Workout.swift in Sources */,
|
||||||
|
|||||||
26
Werkout_ios/APIModels/CompletedWorkout.swift
Normal file
26
Werkout_ios/APIModels/CompletedWorkout.swift
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
//
|
||||||
|
// CompletedWorkout.swift
|
||||||
|
// Werkout_ios
|
||||||
|
//
|
||||||
|
// Created by Trey Tartt on 6/21/23.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct CompletedWorkout: Codable {
|
||||||
|
let id: Int
|
||||||
|
let createdAt, updatedAt: String
|
||||||
|
let difficulty, totalTime: Int
|
||||||
|
let workoutStartTime: String
|
||||||
|
let workout: Int
|
||||||
|
|
||||||
|
enum CodingKeys: String, CodingKey {
|
||||||
|
case id
|
||||||
|
case createdAt = "created_at"
|
||||||
|
case updatedAt = "updated_at"
|
||||||
|
case difficulty
|
||||||
|
case totalTime = "total_time"
|
||||||
|
case workoutStartTime = "workout_start_time"
|
||||||
|
case workout
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,7 @@ class BridgeModule: ObservableObject {
|
|||||||
var currentWorkout: Workout?
|
var currentWorkout: Workout?
|
||||||
var currentExerciseIdx: Int = -1
|
var currentExerciseIdx: Int = -1
|
||||||
|
|
||||||
|
var workoutStartDate: Date?
|
||||||
@Published var currentWorkoutRunTimeInSeconds: Int = -1
|
@Published var currentWorkoutRunTimeInSeconds: Int = -1
|
||||||
private var currentWorkoutRunTimer: Timer?
|
private var currentWorkoutRunTimer: Timer?
|
||||||
|
|
||||||
@@ -33,10 +34,11 @@ class BridgeModule: ObservableObject {
|
|||||||
let exercise = workout.exercises[currentExerciseIdx]
|
let exercise = workout.exercises[currentExerciseIdx]
|
||||||
updateCurrent(exercise: exercise)
|
updateCurrent(exercise: exercise)
|
||||||
startWorkoutTimer()
|
startWorkoutTimer()
|
||||||
|
workoutStartDate = Date()
|
||||||
isInWorkout = true
|
isInWorkout = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func completeWorkout() {
|
func resetCurrentWorkout() {
|
||||||
currentWorkoutRunTimeInSeconds = 0
|
currentWorkoutRunTimeInSeconds = 0
|
||||||
currentWorkoutRunTimer?.invalidate()
|
currentWorkoutRunTimer?.invalidate()
|
||||||
currentWorkoutRunTimer = nil
|
currentWorkoutRunTimer = nil
|
||||||
@@ -51,6 +53,7 @@ class BridgeModule: ObservableObject {
|
|||||||
currentWorkout = nil
|
currentWorkout = nil
|
||||||
|
|
||||||
isInWorkout = false
|
isInWorkout = false
|
||||||
|
workoutStartDate = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startWorkoutTimer() {
|
private func startWorkoutTimer() {
|
||||||
|
|||||||
@@ -29,3 +29,11 @@ extension CharacterSet {
|
|||||||
return allowed
|
return allowed
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension Date {
|
||||||
|
var timeFormatForUpload: String {
|
||||||
|
let isoFormatter = DateFormatter()
|
||||||
|
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssX"
|
||||||
|
return isoFormatter.string(from: self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -46,3 +46,14 @@ class CreateWorkoutFetchable: Postable {
|
|||||||
self.postableData = postData
|
self.postableData = postData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CompleteWorkoutFetchable: Postable {
|
||||||
|
var postableData: [String : Any]?
|
||||||
|
|
||||||
|
typealias Response = CompletedWorkout
|
||||||
|
var endPoint: String = "workout/complete/"
|
||||||
|
|
||||||
|
init(postData: [String: Any]) {
|
||||||
|
self.postableData = postData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ struct ActionsView: View {
|
|||||||
HStack {
|
HStack {
|
||||||
if bridgeModule.isInWorkout == false {
|
if bridgeModule.isInWorkout == false {
|
||||||
Button(action: {
|
Button(action: {
|
||||||
completeWorkout()
|
bridgeModule.resetCurrentWorkout()
|
||||||
dismiss()
|
dismiss()
|
||||||
}, label: {
|
}, label: {
|
||||||
Image(systemName: "xmark.octagon.fill")
|
Image(systemName: "xmark.octagon.fill")
|
||||||
@@ -101,7 +101,6 @@ struct ActionsView: View {
|
|||||||
|
|
||||||
Button(action: {
|
Button(action: {
|
||||||
completeWorkout()
|
completeWorkout()
|
||||||
dismiss()
|
|
||||||
}, label: {
|
}, label: {
|
||||||
Image(systemName: "checkmark")
|
Image(systemName: "checkmark")
|
||||||
.font(.title)
|
.font(.title)
|
||||||
@@ -115,7 +114,28 @@ struct ActionsView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func completeWorkout() {
|
func completeWorkout() {
|
||||||
bridgeModule.completeWorkout()
|
guard let workoutid = bridgeModule.currentWorkout?.id,
|
||||||
|
let startTime = bridgeModule.workoutStartDate?.timeFormatForUpload else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let postBody = [
|
||||||
|
"difficulty": 1,
|
||||||
|
"workout_start_time": startTime,
|
||||||
|
"workout": workoutid,
|
||||||
|
"total_time": bridgeModule.currentWorkoutRunTimeInSeconds
|
||||||
|
] as [String : Any]
|
||||||
|
|
||||||
|
CompleteWorkoutFetchable(postData: postBody).fetch(completion: { result in
|
||||||
|
switch result {
|
||||||
|
case .success(_):
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
bridgeModule.resetCurrentWorkout()
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
case .failure(let failure):
|
||||||
|
print(failure)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func nextExercise() {
|
func nextExercise() {
|
||||||
|
|||||||
Reference in New Issue
Block a user