split views into subview

This commit is contained in:
Trey t
2024-06-18 14:31:27 -05:00
parent 7d2b6b3e6e
commit 48cc22b3e2
7 changed files with 226 additions and 136 deletions

View File

@@ -50,6 +50,10 @@
1CC092FD2C20B0A30004E1E6 /* ExtCountdownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC092FC2C20B0A30004E1E6 /* ExtCountdownView.swift */; }; 1CC092FD2C20B0A30004E1E6 /* ExtCountdownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC092FC2C20B0A30004E1E6 /* ExtCountdownView.swift */; };
1CC092FF2C20B0C80004E1E6 /* ExtExerciseList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC092FE2C20B0C80004E1E6 /* ExtExerciseList.swift */; }; 1CC092FF2C20B0C80004E1E6 /* ExtExerciseList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC092FE2C20B0C80004E1E6 /* ExtExerciseList.swift */; };
1CC093012C20B0E90004E1E6 /* TitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC093002C20B0E90004E1E6 /* TitleView.swift */; }; 1CC093012C20B0E90004E1E6 /* TitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC093002C20B0E90004E1E6 /* TitleView.swift */; };
1CC7CBD52C221159001614B8 /* CaloriesBurnedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC7CBD42C221159001614B8 /* CaloriesBurnedView.swift */; };
1CC7CBD72C2211F0001614B8 /* RateWorkoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC7CBD62C2211F0001614B8 /* RateWorkoutView.swift */; };
1CC7CBD92C221286001614B8 /* WorkoutInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC7CBD82C221286001614B8 /* WorkoutInfoView.swift */; };
1CC7CBDB2C221666001614B8 /* PlannedWorkoutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC7CBDA2C221666001614B8 /* PlannedWorkoutView.swift */; };
1CD0C6632A5AF62900970E52 /* WorkoutOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD0C6622A5AF62900970E52 /* WorkoutOverviewView.swift */; }; 1CD0C6632A5AF62900970E52 /* WorkoutOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD0C6622A5AF62900970E52 /* WorkoutOverviewView.swift */; };
1CD0C6672A5CA19600970E52 /* BaseURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD0C6662A5CA19600970E52 /* BaseURLs.swift */; }; 1CD0C6672A5CA19600970E52 /* BaseURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD0C6662A5CA19600970E52 /* BaseURLs.swift */; };
1CD0C6682A5CA1A200970E52 /* BaseURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD0C6662A5CA19600970E52 /* BaseURLs.swift */; }; 1CD0C6682A5CA1A200970E52 /* BaseURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD0C6662A5CA19600970E52 /* BaseURLs.swift */; };
@@ -180,6 +184,10 @@
1CC092FC2C20B0A30004E1E6 /* ExtCountdownView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtCountdownView.swift; sourceTree = "<group>"; }; 1CC092FC2C20B0A30004E1E6 /* ExtCountdownView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtCountdownView.swift; sourceTree = "<group>"; };
1CC092FE2C20B0C80004E1E6 /* ExtExerciseList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtExerciseList.swift; sourceTree = "<group>"; }; 1CC092FE2C20B0C80004E1E6 /* ExtExerciseList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtExerciseList.swift; sourceTree = "<group>"; };
1CC093002C20B0E90004E1E6 /* TitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleView.swift; sourceTree = "<group>"; }; 1CC093002C20B0E90004E1E6 /* TitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleView.swift; sourceTree = "<group>"; };
1CC7CBD42C221159001614B8 /* CaloriesBurnedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaloriesBurnedView.swift; sourceTree = "<group>"; };
1CC7CBD62C2211F0001614B8 /* RateWorkoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RateWorkoutView.swift; sourceTree = "<group>"; };
1CC7CBD82C221286001614B8 /* WorkoutInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutInfoView.swift; sourceTree = "<group>"; };
1CC7CBDA2C221666001614B8 /* PlannedWorkoutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlannedWorkoutView.swift; sourceTree = "<group>"; };
1CD0C6622A5AF62900970E52 /* WorkoutOverviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutOverviewView.swift; sourceTree = "<group>"; }; 1CD0C6622A5AF62900970E52 /* WorkoutOverviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkoutOverviewView.swift; sourceTree = "<group>"; };
1CD0C6662A5CA19600970E52 /* BaseURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseURLs.swift; sourceTree = "<group>"; }; 1CD0C6662A5CA19600970E52 /* BaseURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseURLs.swift; sourceTree = "<group>"; };
1CD0C66B2A5E4EA100970E52 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; }; 1CD0C66B2A5E4EA100970E52 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
@@ -275,24 +283,28 @@
1CC092EB2C1FAC2A0004E1E6 /* subview */ = { 1CC092EB2C1FAC2A0004E1E6 /* subview */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
1C31C8862A55B2CC00350540 /* PlayerUIView.swift */,
1C5190C12A57CA5F00885849 /* OvalTextFieldStyle.swift */,
1CC092F62C1FAFD50004E1E6 /* AllMusclesView.swift */,
1CC092EC2C1FAC730004E1E6 /* Logoutview.swift */,
1CC092EE2C1FACFC0004E1E6 /* NameView.swift */,
1CC092F02C1FAD1E0004E1E6 /* CompletedWorkoutsView.swift */,
1CC092F22C1FADDA0004E1E6 /* ThotPreferenceView.swift */,
1CC092F42C1FAE7B0004E1E6 /* ShowNextUpView.swift */,
1CC092F82C1FB1420004E1E6 /* AllExerciseView.swift */,
1CC092FA2C1FB3320004E1E6 /* AllEquipmentView.swift */,
1CD0C6622A5AF62900970E52 /* WorkoutOverviewView.swift */,
1C5190CD2A589D4100885849 /* AllWorkoutPickerView.swift */,
1C5190C52A589CC100885849 /* ActionsView.swift */, 1C5190C52A589CC100885849 /* ActionsView.swift */,
1C5190C32A589CAC00885849 /* InfoView.swift */, 1CC092FA2C1FB3320004E1E6 /* AllEquipmentView.swift */,
1CC092F82C1FB1420004E1E6 /* AllExerciseView.swift */,
1CC092F62C1FAFD50004E1E6 /* AllMusclesView.swift */,
1C5190CD2A589D4100885849 /* AllWorkoutPickerView.swift */,
1CC7CBD42C221159001614B8 /* CaloriesBurnedView.swift */,
1CC092F02C1FAD1E0004E1E6 /* CompletedWorkoutsView.swift */,
1C5190CB2A589D0000885849 /* CountdownView.swift */, 1C5190CB2A589D0000885849 /* CountdownView.swift */,
1CC092FC2C20B0A30004E1E6 /* ExtCountdownView.swift */, 1CC092FC2C20B0A30004E1E6 /* ExtCountdownView.swift */,
1CC092FE2C20B0C80004E1E6 /* ExtExerciseList.swift */, 1CC092FE2C20B0C80004E1E6 /* ExtExerciseList.swift */,
1C5190C32A589CAC00885849 /* InfoView.swift */,
1CC092EC2C1FAC730004E1E6 /* Logoutview.swift */,
1CC092EE2C1FACFC0004E1E6 /* NameView.swift */,
1C5190C12A57CA5F00885849 /* OvalTextFieldStyle.swift */,
1CC7CBDA2C221666001614B8 /* PlannedWorkoutView.swift */,
1C31C8862A55B2CC00350540 /* PlayerUIView.swift */,
1CC7CBD62C2211F0001614B8 /* RateWorkoutView.swift */,
1CC092F42C1FAE7B0004E1E6 /* ShowNextUpView.swift */,
1CC092F22C1FADDA0004E1E6 /* ThotPreferenceView.swift */,
1CC093002C20B0E90004E1E6 /* TitleView.swift */, 1CC093002C20B0E90004E1E6 /* TitleView.swift */,
1CC7CBD82C221286001614B8 /* WorkoutInfoView.swift */,
1CD0C6622A5AF62900970E52 /* WorkoutOverviewView.swift */,
); );
path = subview; path = subview;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -652,8 +664,10 @@
1CF65A432A39FB410042FFBD /* Workout.swift in Sources */, 1CF65A432A39FB410042FFBD /* Workout.swift in Sources */,
1CF65A502A3A1EA90042FFBD /* BridgeModule.swift in Sources */, 1CF65A502A3A1EA90042FFBD /* BridgeModule.swift in Sources */,
1CF65A592A3BF4B60042FFBD /* Muscle.swift in Sources */, 1CF65A592A3BF4B60042FFBD /* Muscle.swift in Sources */,
1CC7CBD92C221286001614B8 /* WorkoutInfoView.swift in Sources */,
1CC092F32C1FADDA0004E1E6 /* ThotPreferenceView.swift in Sources */, 1CC092F32C1FADDA0004E1E6 /* ThotPreferenceView.swift in Sources */,
1C4AFF1E2A7579410027710B /* NSFWVideo.swift in Sources */, 1C4AFF1E2A7579410027710B /* NSFWVideo.swift in Sources */,
1CC7CBD52C221159001614B8 /* CaloriesBurnedView.swift in Sources */,
1CC092F72C1FAFD50004E1E6 /* AllMusclesView.swift in Sources */, 1CC092F72C1FAFD50004E1E6 /* AllMusclesView.swift in Sources */,
1C5190D02A589D5F00885849 /* AllWorkoutsListView.swift in Sources */, 1C5190D02A589D5F00885849 /* AllWorkoutsListView.swift in Sources */,
1C5190CA2A589CEC00885849 /* ExerciseListView.swift in Sources */, 1C5190CA2A589CEC00885849 /* ExerciseListView.swift in Sources */,
@@ -665,6 +679,7 @@
1C31C8872A55B2CC00350540 /* PlayerUIView.swift in Sources */, 1C31C8872A55B2CC00350540 /* PlayerUIView.swift in Sources */,
1CEF74AB2A89937800C1AE6A /* HealthKitHelper.swift in Sources */, 1CEF74AB2A89937800C1AE6A /* HealthKitHelper.swift in Sources */,
1CF65A2D2A3972840042FFBD /* MainView.swift in Sources */, 1CF65A2D2A3972840042FFBD /* MainView.swift in Sources */,
1CC7CBDB2C221666001614B8 /* PlannedWorkoutView.swift in Sources */,
1CF65A7D2A41275D0042FFBD /* Network.swift in Sources */, 1CF65A7D2A41275D0042FFBD /* Network.swift in Sources */,
1C485C8A2A492BB400A6F896 /* LoginView.swift in Sources */, 1C485C8A2A492BB400A6F896 /* LoginView.swift in Sources */,
1C4AFF1B2A65FB190027710B /* CurrentWorkoutInfo.swift in Sources */, 1C4AFF1B2A65FB190027710B /* CurrentWorkoutInfo.swift in Sources */,
@@ -682,6 +697,7 @@
1C5190C82A589CDA00885849 /* CurrentWorkoutElapsedTimeView.swift in Sources */, 1C5190C82A589CDA00885849 /* CurrentWorkoutElapsedTimeView.swift in Sources */,
1CC092F92C1FB1420004E1E6 /* AllExerciseView.swift in Sources */, 1CC092F92C1FB1420004E1E6 /* AllExerciseView.swift in Sources */,
1CC093012C20B0E90004E1E6 /* TitleView.swift in Sources */, 1CC093012C20B0E90004E1E6 /* TitleView.swift in Sources */,
1CC7CBD72C2211F0001614B8 /* RateWorkoutView.swift in Sources */,
1CF65A452A39FB550042FFBD /* Exercise.swift in Sources */, 1CF65A452A39FB550042FFBD /* Exercise.swift in Sources */,
1CF65A612A3BF6020042FFBD /* AddExerciseView.swift in Sources */, 1CF65A612A3BF6020042FFBD /* AddExerciseView.swift in Sources */,
1C485C872A4915C400A6F896 /* CreateWorkoutItemPickerView.swift in Sources */, 1C485C872A4915C400A6F896 /* CreateWorkoutItemPickerView.swift in Sources */,

View File

@@ -81,7 +81,8 @@ struct AllWorkoutsView: View {
}) })
Divider() Divider()
case .MyWorkouts: case .MyWorkouts:
plannedWorkout(workouts: UserStore.shared.plannedWorkouts) PlannedWorkoutView(workouts: UserStore.shared.plannedWorkouts,
selectedPlannedWorkout: $selectedPlannedWorkout)
} }
} }
} else { } else {
@@ -93,7 +94,7 @@ struct AllWorkoutsView: View {
maybeUpdateShit() maybeUpdateShit()
} }
.sheet(item: $selectedWorkout) { item in .sheet(item: $selectedWorkout) { item in
var isPreview = item.id == bridgeModule.currentExerciseInfo.workout?.id let isPreview = item.id == bridgeModule.currentExerciseInfo.workout?.id
let viewModel = WorkoutDetailViewModel(workout: item, isPreview: isPreview) let viewModel = WorkoutDetailViewModel(workout: item, isPreview: isPreview)
WorkoutDetailView(viewModel: viewModel) WorkoutDetailView(viewModel: viewModel)
} }
@@ -114,45 +115,6 @@ struct AllWorkoutsView: View {
} }
} }
func plannedWorkout(workouts: [PlannedWorkout]) -> some View {
List {
ForEach(workouts, id:\.workout.name) { plannedWorkout in
HStack {
VStack(alignment: .leading) {
Text(plannedWorkout.onDate.plannedDate?.weekDay ?? "-")
.font(.title)
Text(plannedWorkout.onDate.plannedDate?.monthString ?? "-")
.font(.title)
Text(plannedWorkout.onDate.plannedDate?.dateString ?? "-")
.font(.title)
}
Divider()
VStack {
Text(plannedWorkout.workout.name)
.font(.title)
.frame(maxWidth: .infinity, alignment: .leading)
Text(plannedWorkout.workout.description ?? "")
.font(.body)
.frame(maxWidth: .infinity, alignment: .leading)
Text(plannedWorkout.onDate)
.font(.footnote)
.frame(maxWidth: .infinity, alignment: .leading)
}
.contentShape(Rectangle())
.onTapGesture {
selectedPlannedWorkout = plannedWorkout.workout
}
}
}
}
}
func maybeUpdateShit() { func maybeUpdateShit() {
if UserStore.shared.token != nil{ if UserStore.shared.token != nil{
if UserStore.shared.plannedWorkouts.isEmpty { if UserStore.shared.plannedWorkouts.isEmpty {

View File

@@ -29,48 +29,18 @@ struct CompletedWorkoutView: View {
ProgressView("Uploading") ProgressView("Uploading")
} }
VStack { VStack {
topViews() WorkoutInfoView(workout: workout)
Divider() Divider()
HStack { HStack {
if let calsBurned = healthKitWorkoutData?.caloriesBurned { if let calsBurned = healthKitWorkoutData?.caloriesBurned {
HStack { CaloriesBurnedView(healthKitWorkoutData: $healthKitWorkoutData,
HStack { calsBurned: calsBurned)
Image(systemName: "flame.fill")
.foregroundColor(.orange)
.font(.title)
VStack {
Text("\(calsBurned, specifier: "%.0f")")
}
}
.frame(maxWidth: .infinity)
}
if let minHeart = healthKitWorkoutData?.minHeartRate,
let maxHeart = healthKitWorkoutData?.maxHeartRate,
let avgHeart = healthKitWorkoutData?.avgHeartRate {
VStack {
HStack {
Image(systemName: "heart")
.foregroundColor(.red)
.font(.title)
VStack {
HStack {
Text("\(minHeart, specifier: "%.0f")")
Text("-")
Text("\(maxHeart, specifier: "%.0f")")
}
Text("\(avgHeart, specifier: "%.0f")")
}
}
}
.frame(maxWidth: .infinity)
}
} }
} }
rateWorkout() RateWorkoutView(difficulty: $difficulty)
.frame(maxHeight: 88) .frame(maxHeight: 88)
Divider() Divider()
@@ -118,53 +88,6 @@ struct CompletedWorkoutView: View {
}) })
} }
func topViews() -> 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)
}
}
}
func rateWorkout() -> some View {
VStack {
Divider()
HStack {
Text("No Rate")
.foregroundColor(.black)
Text("Easy")
.foregroundColor(.green)
Spacer()
Text("Death")
.foregroundColor(.red)
}
ZStack {
LinearGradient(
gradient: Gradient(colors: [.black, .green, .red]),
startPoint: .leading,
endPoint: .trailing
)
.mask(Slider(value: $difficulty, in: 0...5, step: 1))
// Dummy replicated slider, to allow sliding
Slider(value: $difficulty, in: 0...5, step: 1)
.opacity(0.05) // Opacity is the trick here.
.accentColor(.clear)
}
}
}
func upload(postBody: [String: Any]) { func upload(postBody: [String: Any]) {
var _postBody = postBody var _postBody = postBody
_postBody["difficulty"] = difficulty _postBody["difficulty"] = difficulty

View File

@@ -0,0 +1,54 @@
//
// CaloriesBurnedView.swift
// Werkout_ios
//
// Created by Trey Tartt on 6/18/24.
//
import SwiftUI
struct CaloriesBurnedView: View {
@Binding var healthKitWorkoutData: HealthKitWorkoutData?
let calsBurned: Double
var body: some View {
VStack {
HStack {
HStack {
Image(systemName: "flame.fill")
.foregroundColor(.orange)
.font(.title)
VStack {
Text("\(calsBurned, specifier: "%.0f")")
}
}
.frame(maxWidth: .infinity)
}
if let minHeart = healthKitWorkoutData?.minHeartRate,
let maxHeart = healthKitWorkoutData?.maxHeartRate,
let avgHeart = healthKitWorkoutData?.avgHeartRate {
VStack {
HStack {
Image(systemName: "heart")
.foregroundColor(.red)
.font(.title)
VStack {
HStack {
Text("\(minHeart, specifier: "%.0f")")
Text("-")
Text("\(maxHeart, specifier: "%.0f")")
}
Text("\(avgHeart, specifier: "%.0f")")
}
}
}
.frame(maxWidth: .infinity)
}
}
}
}
//#Preview {
// CaloriesBurnedView()
//}

View File

@@ -0,0 +1,56 @@
//
// PlannedWorkoutView.swift
// Werkout_ios
//
// Created by Trey Tartt on 6/18/24.
//
import SwiftUI
struct PlannedWorkoutView: View {
let workouts: [PlannedWorkout]
@Binding var selectedPlannedWorkout: Workout?
var body: some View {
List {
ForEach(workouts, id:\.workout.name) { plannedWorkout in
HStack {
VStack(alignment: .leading) {
Text(plannedWorkout.onDate.plannedDate?.weekDay ?? "-")
.font(.title)
Text(plannedWorkout.onDate.plannedDate?.monthString ?? "-")
.font(.title)
Text(plannedWorkout.onDate.plannedDate?.dateString ?? "-")
.font(.title)
}
Divider()
VStack {
Text(plannedWorkout.workout.name)
.font(.title)
.frame(maxWidth: .infinity, alignment: .leading)
Text(plannedWorkout.workout.description ?? "")
.font(.body)
.frame(maxWidth: .infinity, alignment: .leading)
Text(plannedWorkout.onDate)
.font(.footnote)
.frame(maxWidth: .infinity, alignment: .leading)
}
.contentShape(Rectangle())
.onTapGesture {
selectedPlannedWorkout = plannedWorkout.workout
}
}
}
}
}
}
//#Preview {
// PlannedWorkoutView()
//}

View File

@@ -0,0 +1,46 @@
//
// RateWorkoutView.swift
// Werkout_ios
//
// Created by Trey Tartt on 6/18/24.
//
import SwiftUI
struct RateWorkoutView: View {
@Binding var difficulty: Float
var body: some View {
VStack {
Divider()
HStack {
Text("No Rate")
.foregroundColor(.black)
Text("Easy")
.foregroundColor(.green)
Spacer()
Text("Death")
.foregroundColor(.red)
}
ZStack {
LinearGradient(
gradient: Gradient(colors: [.black, .green, .red]),
startPoint: .leading,
endPoint: .trailing
)
.mask(Slider(value: $difficulty, in: 0...5, step: 1))
// Dummy replicated slider, to allow sliding
Slider(value: $difficulty, in: 0...5, step: 1)
.opacity(0.05) // Opacity is the trick here.
.accentColor(.clear)
}
}
}
}
//#Preview {
// RateWorkoutView()
//}

View File

@@ -0,0 +1,33 @@
//
// WorkoutInfoView.swift
// Werkout_ios
//
// Created by Trey Tartt on 6/18/24.
//
import SwiftUI
struct WorkoutInfoView: View {
let workout: Workout
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)
}
}
}
}
//#Preview {
// WorkoutInfoView()
//}