From 49496368361c2b9657c5c2014545af37e837af7c Mon Sep 17 00:00:00 2001 From: Trey t Date: Wed, 21 Jun 2023 23:00:11 -0500 Subject: [PATCH] WIP --- Werkout_ios.xcodeproj/project.pbxproj | 4 +++ Werkout_ios/APIModels/CompletedWorkout.swift | 26 ++++++++++++++++++++ Werkout_ios/BridgeModule.swift | 5 +++- Werkout_ios/Extensions.swift | 8 ++++++ Werkout_ios/Network/Fetchables.swift | 11 +++++++++ Werkout_ios/Views/WorkoutDetailView.swift | 26 +++++++++++++++++--- 6 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 Werkout_ios/APIModels/CompletedWorkout.swift diff --git a/Werkout_ios.xcodeproj/project.pbxproj b/Werkout_ios.xcodeproj/project.pbxproj index 03c4f45..a3cf490 100644 --- a/Werkout_ios.xcodeproj/project.pbxproj +++ b/Werkout_ios.xcodeproj/project.pbxproj @@ -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 = ""; }; 1CF65A802A412AA30042FFBD /* DataStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStore.swift; sourceTree = ""; }; 1CF65A822A42347D0042FFBD /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; + 1CF65A842A43E8060042FFBD /* CompletedWorkout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompletedWorkout.swift; sourceTree = ""; }; /* 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 = ""; @@ -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 */, diff --git a/Werkout_ios/APIModels/CompletedWorkout.swift b/Werkout_ios/APIModels/CompletedWorkout.swift new file mode 100644 index 0000000..a12c0c2 --- /dev/null +++ b/Werkout_ios/APIModels/CompletedWorkout.swift @@ -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 + } +} diff --git a/Werkout_ios/BridgeModule.swift b/Werkout_ios/BridgeModule.swift index 301d3cd..85ddbbe 100644 --- a/Werkout_ios/BridgeModule.swift +++ b/Werkout_ios/BridgeModule.swift @@ -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() { diff --git a/Werkout_ios/Extensions.swift b/Werkout_ios/Extensions.swift index e497220..db25deb 100644 --- a/Werkout_ios/Extensions.swift +++ b/Werkout_ios/Extensions.swift @@ -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) + } +} diff --git a/Werkout_ios/Network/Fetchables.swift b/Werkout_ios/Network/Fetchables.swift index e132b8e..b45c5ca 100644 --- a/Werkout_ios/Network/Fetchables.swift +++ b/Werkout_ios/Network/Fetchables.swift @@ -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 + } +} diff --git a/Werkout_ios/Views/WorkoutDetailView.swift b/Werkout_ios/Views/WorkoutDetailView.swift index 5e16e12..07b6333 100644 --- a/Werkout_ios/Views/WorkoutDetailView.swift +++ b/Werkout_ios/Views/WorkoutDetailView.swift @@ -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() {