WIP
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
1CF65A7F2A4129320042FFBD /* Fetchables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A7E2A4129320042FFBD /* Fetchables.swift */; };
|
||||
1CF65A812A412AA30042FFBD /* DataStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A802A412AA30042FFBD /* DataStore.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 */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@@ -79,6 +80,7 @@
|
||||
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>"; };
|
||||
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 */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -156,6 +158,7 @@
|
||||
1CF65A462A39FB6C0042FFBD /* RegisteredUser.swift */,
|
||||
1CF65A582A3BF4B60042FFBD /* Muscle.swift */,
|
||||
1CF65A5A2A3BF4BE0042FFBD /* Equipment.swift */,
|
||||
1CF65A842A43E8060042FFBD /* CompletedWorkout.swift */,
|
||||
);
|
||||
path = APIModels;
|
||||
sourceTree = "<group>";
|
||||
@@ -285,6 +288,7 @@
|
||||
1CF65A4E2A39FF200042FFBD /* WorkoutDetailViewModel.swift in Sources */,
|
||||
1CF65A472A39FB6C0042FFBD /* RegisteredUser.swift in Sources */,
|
||||
1CF65A522A3A90A00042FFBD /* PreviewWorkout.swift in Sources */,
|
||||
1CF65A852A43E8060042FFBD /* CompletedWorkout.swift in Sources */,
|
||||
1CF65A6E2A3F60480042FFBD /* CreateViewModels.swift in Sources */,
|
||||
1CF65A4C2A39FDA20042FFBD /* WorkoutDetailView.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 currentExerciseIdx: Int = -1
|
||||
|
||||
var workoutStartDate: Date?
|
||||
@Published var currentWorkoutRunTimeInSeconds: Int = -1
|
||||
private var currentWorkoutRunTimer: Timer?
|
||||
|
||||
@@ -33,10 +34,11 @@ class BridgeModule: ObservableObject {
|
||||
let exercise = workout.exercises[currentExerciseIdx]
|
||||
updateCurrent(exercise: exercise)
|
||||
startWorkoutTimer()
|
||||
workoutStartDate = Date()
|
||||
isInWorkout = true
|
||||
}
|
||||
|
||||
func completeWorkout() {
|
||||
func resetCurrentWorkout() {
|
||||
currentWorkoutRunTimeInSeconds = 0
|
||||
currentWorkoutRunTimer?.invalidate()
|
||||
currentWorkoutRunTimer = nil
|
||||
@@ -51,6 +53,7 @@ class BridgeModule: ObservableObject {
|
||||
currentWorkout = nil
|
||||
|
||||
isInWorkout = false
|
||||
workoutStartDate = nil
|
||||
}
|
||||
|
||||
private func startWorkoutTimer() {
|
||||
|
||||
@@ -29,3 +29,11 @@ extension CharacterSet {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
if bridgeModule.isInWorkout == false {
|
||||
Button(action: {
|
||||
completeWorkout()
|
||||
bridgeModule.resetCurrentWorkout()
|
||||
dismiss()
|
||||
}, label: {
|
||||
Image(systemName: "xmark.octagon.fill")
|
||||
@@ -101,7 +101,6 @@ struct ActionsView: View {
|
||||
|
||||
Button(action: {
|
||||
completeWorkout()
|
||||
dismiss()
|
||||
}, label: {
|
||||
Image(systemName: "checkmark")
|
||||
.font(.title)
|
||||
@@ -115,7 +114,28 @@ struct ActionsView: View {
|
||||
}
|
||||
|
||||
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() {
|
||||
|
||||
Reference in New Issue
Block a user