This commit is contained in:
Trey t
2023-06-22 20:27:21 -05:00
parent cf22aeee19
commit a43acc9c27
12 changed files with 205 additions and 36 deletions

View File

@@ -42,6 +42,7 @@
1CF65A832A42347D0042FFBD /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A822A42347D0042FFBD /* Extensions.swift */; };
1CF65A852A43E8060042FFBD /* CompletedWorkout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A842A43E8060042FFBD /* CompletedWorkout.swift */; };
1CF65A872A4400E10042FFBD /* ToDo in Resources */ = {isa = PBXBuildFile; fileRef = 1CF65A862A4400E10042FFBD /* ToDo */; };
1CF65A8E2A44B78B0042FFBD /* CompletedWorkoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF65A8D2A44B78B0042FFBD /* CompletedWorkoutView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -83,6 +84,7 @@
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>"; };
1CF65A862A4400E10042FFBD /* ToDo */ = {isa = PBXFileReference; lastKnownFileType = text; path = ToDo; sourceTree = "<group>"; };
1CF65A8D2A44B78B0042FFBD /* CompletedWorkoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompletedWorkoutView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -122,6 +124,7 @@
1CF65A272A3972840042FFBD /* Persistence.swift */,
1CF65A4F2A3A1EA90042FFBD /* BridgeModule.swift */,
1CF65A3F2A3973840042FFBD /* Views */,
1CF65A8B2A44B7590042FFBD /* AccountView */,
1CF65A3E2A39737D0042FFBD /* APIModels */,
1CF65A3D2A3973760042FFBD /* Network */,
1CF65A2E2A3972850042FFBD /* Assets.xcassets */,
@@ -171,12 +174,11 @@
children = (
1CF65A2C2A3972840042FFBD /* MainView.swift */,
1CF65A3B2A3972CE0042FFBD /* ExternalWorkoutDetailView.swift */,
1CF65A622A3BF6A30042FFBD /* AllWorkoutsView.swift */,
1CF65A4B2A39FDA20042FFBD /* WorkoutDetailView.swift */,
1CF65A4D2A39FF200042FFBD /* WorkoutDetailViewModel.swift */,
1CF65A6C2A3F60100042FFBD /* CreateWorkoutViews */,
1CF65A602A3BF6020042FFBD /* AddExerciseView.swift */,
1CF65A682A3C018F0042FFBD /* AccountView.swift */,
1CF65A8A2A44B74D0042FFBD /* AddExercise */,
1CF65A892A44B7390042FFBD /* AllWorkouts */,
1CF65A8C2A44B7680042FFBD /* CompletedWorkout */,
1CF65A6C2A3F60100042FFBD /* CreateWorkout */,
1CF65A882A44B7290042FFBD /* WorkoutDetail */,
);
path = Views;
sourceTree = "<group>";
@@ -193,7 +195,7 @@
path = JSON;
sourceTree = "<group>";
};
1CF65A6C2A3F60100042FFBD /* CreateWorkoutViews */ = {
1CF65A6C2A3F60100042FFBD /* CreateWorkout */ = {
isa = PBXGroup;
children = (
1CF65A6D2A3F60480042FFBD /* CreateViewModels.swift */,
@@ -201,7 +203,48 @@
1CF65A722A3F60D20042FFBD /* CreateExerciseActionsView.swift */,
1CF65A7A2A3F83440042FFBD /* CreateWorkoutSupersetActionsView.swift */,
);
path = CreateWorkoutViews;
path = CreateWorkout;
sourceTree = "<group>";
};
1CF65A882A44B7290042FFBD /* WorkoutDetail */ = {
isa = PBXGroup;
children = (
1CF65A4B2A39FDA20042FFBD /* WorkoutDetailView.swift */,
1CF65A4D2A39FF200042FFBD /* WorkoutDetailViewModel.swift */,
);
path = WorkoutDetail;
sourceTree = "<group>";
};
1CF65A892A44B7390042FFBD /* AllWorkouts */ = {
isa = PBXGroup;
children = (
1CF65A622A3BF6A30042FFBD /* AllWorkoutsView.swift */,
);
path = AllWorkouts;
sourceTree = "<group>";
};
1CF65A8A2A44B74D0042FFBD /* AddExercise */ = {
isa = PBXGroup;
children = (
1CF65A602A3BF6020042FFBD /* AddExerciseView.swift */,
);
path = AddExercise;
sourceTree = "<group>";
};
1CF65A8B2A44B7590042FFBD /* AccountView */ = {
isa = PBXGroup;
children = (
1CF65A682A3C018F0042FFBD /* AccountView.swift */,
);
path = AccountView;
sourceTree = "<group>";
};
1CF65A8C2A44B7680042FFBD /* CompletedWorkout */ = {
isa = PBXGroup;
children = (
1CF65A8D2A44B78B0042FFBD /* CompletedWorkoutView.swift */,
);
path = CompletedWorkout;
sourceTree = "<group>";
};
/* End PBXGroup section */
@@ -295,6 +338,7 @@
1CF65A852A43E8060042FFBD /* CompletedWorkout.swift in Sources */,
1CF65A6E2A3F60480042FFBD /* CreateViewModels.swift in Sources */,
1CF65A4C2A39FDA20042FFBD /* WorkoutDetailView.swift in Sources */,
1CF65A8E2A44B78B0042FFBD /* CompletedWorkoutView.swift in Sources */,
1CF65A432A39FB410042FFBD /* Workout.swift in Sources */,
1CF65A502A3A1EA90042FFBD /* BridgeModule.swift in Sources */,
1CF65A592A3BF4B60042FFBD /* Muscle.swift in Sources */,

View File

@@ -13,7 +13,7 @@ enum FetchableError: Error {
case decodeError(Error)
case endOfFileError
case noPostData
case statusError(Int)
case statusError(Int, String?)
}
protocol Fetchable {
@@ -86,7 +86,12 @@ extension Postable {
if let httpRespone = response as? HTTPURLResponse {
if httpRespone.statusCode != 201 {
completion(.failure(.statusError(httpRespone.statusCode)))
var returnStr: String?
if let data = data {
returnStr = String(data: data, encoding: .utf8)
}
completion(.failure(.statusError(httpRespone.statusCode, returnStr)))
return
}
}

View File

@@ -0,0 +1,103 @@
//
// CompletedWorkoutView.swift
// Werkout_ios
//
// Created by Trey Tartt on 6/22/23.
//
import SwiftUI
struct CompletedWorkoutView: View {
@ObservedObject var bridgeModule = BridgeModule.shared
var postData: [String: Any]
let workout: Workout
@Environment(\.dismiss) var dismiss
@State var difficulty: Float = 0
@State var notes: String = ""
let completedWorkoutDismissed: ((Bool) -> Void)?
var body: some View {
VStack {
Text(workout.name)
.frame(maxWidth: .infinity, alignment: .leading)
.font(.title3)
.padding(.top
)
if let desc = workout.description {
Text(desc)
.frame(maxWidth: .infinity, alignment: .leading)
.font(.body)
.padding(.top)
}
Divider()
Text("how hard was this shit")
HStack {
Text("easy")
Spacer()
Text("Death")
}
Slider(value: $difficulty, in: 0...5, step: 1)
Divider()
TextField("Notes", text: $notes)
// Divider()
Spacer()
Button("Upload", action: {
upload(postBody: postData)
})
.frame(maxWidth: .infinity, alignment: .center)
.frame(height: 44)
.foregroundColor(.blue)
.background(.yellow)
.cornerRadius(8)
.padding()
.frame(maxWidth: .infinity)
}
.padding([.leading, .trailing])
}
func upload(postBody: [String: Any]) {
var _postBody = postBody
_postBody["difficulty"] = difficulty
_postBody["notes"] = notes
CompleteWorkoutFetchable(postData: _postBody).fetch(completion: { result in
switch result {
case .success(_):
DispatchQueue.main.async {
bridgeModule.resetCurrentWorkout()
dismiss()
completedWorkoutDismissed?(true)
}
case .failure(let failure):
print(failure)
}
})
}
}
//struct CompletedWorkoutView_Previews: PreviewProvider {
// static let postBody = [
// "difficulty": 1,
// "workout_start_time": Date().timeFormatForUpload,
// "workout": 1,
// "total_time": 140
// ] as [String : Any]
//
// static let workout = PreviewWorkout.workout()
//
// static var previews: some View {
// CompletedWorkoutView(postData: CompletedWorkoutView_Previews.postBody, workout: workout)
// }
//}

View File

@@ -12,6 +12,13 @@ struct WorkoutDetailView: View {
var bridgeModule = BridgeModule.shared
@Environment(\.dismiss) var dismiss
enum Sheet: Identifiable {
case completedWorkout([String: Any])
var id: String { return UUID().uuidString }
}
@State var presentedSheet: Sheet?
var body: some View {
ZStack {
switch viewModel.status {
@@ -25,14 +32,45 @@ struct WorkoutDetailView: View {
.padding(.top)
CountdownView()
ExerciseListView(workout: workout)
ActionsView(workout: workout)
ActionsView(completedWorkout: {
if let workoutData = createWorkoutData() {
presentedSheet = .completedWorkout(workoutData)
bridgeModule.resetCurrentWorkout()
}
}, workout: workout)
.frame(height: 44)
}
.sheet(item: $presentedSheet) { item in
switch item {
case .completedWorkout(let data):
CompletedWorkoutView(postData: data, workout: workout, completedWorkoutDismissed: { uploaded in
if uploaded {
dismiss()
}
})
}
}
.interactiveDismissDisabled()
}
}
}
func createWorkoutData() -> [String:Any]? {
guard let workoutid = bridgeModule.currentWorkout?.id,
let startTime = bridgeModule.workoutStartDate?.timeFormatForUpload else {
return nil
}
let postBody = [
"difficulty": 1,
"workout_start_time": startTime,
"workout": workoutid,
"total_time": bridgeModule.currentWorkoutRunTimeInSeconds
] as [String : Any]
return postBody
}
}
struct InfoView: View {
@@ -59,6 +97,8 @@ struct InfoView: View {
struct ActionsView: View {
@ObservedObject var bridgeModule = BridgeModule.shared
var completedWorkout: (() -> Void)?
var workout: Workout
@Environment(\.dismiss) var dismiss
@@ -100,7 +140,7 @@ struct ActionsView: View {
.foregroundColor(.white)
Button(action: {
completeWorkout()
completedWorkout?()
}, label: {
Image(systemName: "checkmark")
.font(.title)
@@ -113,30 +153,7 @@ struct ActionsView: View {
}
}
func 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() {
bridgeModule.nextExercise()