Stabilize iOS/watchOS/tvOS apps and add cross-platform audit remediation
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import SharedCore
|
||||
|
||||
class CreateWorkoutExercise: ObservableObject, Identifiable {
|
||||
let id = UUID()
|
||||
@@ -49,7 +50,7 @@ class CreateWorkoutExercise: ObservableObject, Identifiable {
|
||||
}
|
||||
|
||||
func decreaseWeight() {
|
||||
self.weight -= 15
|
||||
self.weight -= 5
|
||||
if self.weight < 0 {
|
||||
self.weight = 0
|
||||
}
|
||||
@@ -90,6 +91,8 @@ class WorkoutViewModel: ObservableObject {
|
||||
@Published var superSets = [CreateWorkoutSuperSet]()
|
||||
@Published var title = String()
|
||||
@Published var description = String()
|
||||
@Published var validationError: String?
|
||||
@Published var isUploading = false
|
||||
@Published var randomValueForUpdatingValue = 0
|
||||
|
||||
func increaseRandomNumberForUpdating() {
|
||||
@@ -111,60 +114,82 @@ class WorkoutViewModel: ObservableObject {
|
||||
}
|
||||
|
||||
func showRoundsError() {
|
||||
|
||||
validationError = "Each superset must have at least one round."
|
||||
}
|
||||
|
||||
func showNoDurationOrReps() {
|
||||
|
||||
validationError = "Each exercise must have reps or duration."
|
||||
}
|
||||
|
||||
func uploadWorkout() {
|
||||
guard isUploading == false else {
|
||||
return
|
||||
}
|
||||
|
||||
validationError = nil
|
||||
let normalizedTitle = title.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||
guard normalizedTitle.isEmpty == false else {
|
||||
validationError = "Workout title is required."
|
||||
return
|
||||
}
|
||||
|
||||
var supersets = [[String: Any]]()
|
||||
var supersetOrder = 1
|
||||
superSets.forEach({ superset in
|
||||
if superset.numberOfRounds == 0 {
|
||||
showRoundsError()
|
||||
return
|
||||
}
|
||||
for (supersetOffset, superset) in superSets.enumerated() {
|
||||
var supersetInfo = [String: Any]()
|
||||
supersetInfo["name"] = ""
|
||||
supersetInfo["rounds"] = superset.numberOfRounds
|
||||
supersetInfo["order"] = supersetOrder
|
||||
supersetInfo["order"] = supersetOffset + 1
|
||||
|
||||
var exercises = [[String: Any]]()
|
||||
var exerciseOrder = 1
|
||||
for exercise in superset.exercises {
|
||||
if exercise.reps == 0 && exercise.duration == 0 {
|
||||
showNoDurationOrReps()
|
||||
return
|
||||
}
|
||||
|
||||
for (exerciseOffset, exercise) in superset.exercises.enumerated() {
|
||||
let item = ["id": exercise.exercise.id,
|
||||
"reps": exercise.reps,
|
||||
"weight": exercise.weight,
|
||||
"duration": exercise.duration,
|
||||
"order": exerciseOrder] as [String : Any]
|
||||
"order": exerciseOffset + 1] as [String : Any]
|
||||
exercises.append(item)
|
||||
exerciseOrder += 1
|
||||
}
|
||||
supersetInfo["exercises"] = exercises
|
||||
|
||||
supersets.append(supersetInfo)
|
||||
supersetOrder += 1
|
||||
})
|
||||
let uploadBody = ["name": title,
|
||||
}
|
||||
|
||||
if supersets.isEmpty {
|
||||
validationError = "Add at least one superset before uploading."
|
||||
return
|
||||
}
|
||||
|
||||
let issues = WorkoutValidation.validateSupersets(supersets)
|
||||
if let issue = issues.first {
|
||||
switch issue.code {
|
||||
case "invalid_rounds":
|
||||
showRoundsError()
|
||||
case "invalid_exercise_payload":
|
||||
showNoDurationOrReps()
|
||||
default:
|
||||
validationError = issue.message
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
let uploadBody = ["name": normalizedTitle,
|
||||
"description": description,
|
||||
"supersets": supersets] as [String : Any]
|
||||
isUploading = true
|
||||
CreateWorkoutFetchable(postData: uploadBody).fetch(completion: { result in
|
||||
DispatchQueue.main.async {
|
||||
switch result {
|
||||
case .success(_):
|
||||
self.superSets.removeAll()
|
||||
self.title = ""
|
||||
NotificationCenter.default.post(name: NSNotification.Name("CreatedNewWorkout"), object: nil, userInfo: nil)
|
||||
case .failure(let failure):
|
||||
print(failure)
|
||||
}
|
||||
self.isUploading = false
|
||||
switch result {
|
||||
case .success(_):
|
||||
self.superSets.removeAll()
|
||||
self.title = ""
|
||||
self.description = ""
|
||||
NotificationCenter.default.post(
|
||||
name: AppNotifications.createdNewWorkout,
|
||||
object: nil,
|
||||
userInfo: nil
|
||||
)
|
||||
case .failure(let failure):
|
||||
self.validationError = "Failed to upload workout: \(failure.localizedDescription)"
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user