This commit is contained in:
2025-07-19 16:42:47 -04:00
parent 6e46775f58
commit e3c3f2c6f0
38 changed files with 556 additions and 367 deletions

View File

@ -1,94 +0,0 @@
//
// SettingsView.swift
// Workouts
//
// Created by rzen on 7/13/25 at 10:24AM.
//
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
//
import SwiftUI
import SwiftData
import CloudKit
enum AppStorageKeys {
static let iCloudSyncEnabled = "iCloudSyncEnabled"
}
struct SettingsView: View {
@Environment(\.modelContext) private var modelContext
@State private var showingClearAllDataConfirmation = false
var splitsCount: Int? { try? modelContext.fetchCount(FetchDescriptor<Split>()) }
var body: some View {
NavigationStack {
Form {
Section (header: Text("Lists")) {
NavigationLink(destination: SplitsListView()) {
HStack {
Text("Splits")
Spacer()
Text("\(splitsCount ?? 0)")
.font(.caption)
.foregroundColor(.gray)
}
}
}
Section(header: Text("Developer")) {
Button(action: {
showingClearAllDataConfirmation = true
}) {
HStack {
Label("Clear All Data", systemImage: "trash")
Spacer()
}
}
.foregroundColor(.red)
.confirmationDialog(
"Clear All Data?",
isPresented: $showingClearAllDataConfirmation,
titleVisibility: .visible
) {
Button("Clear All Data", role: .destructive) {
clearAllData()
}
Button("Cancel", role: .cancel) {}
} message: {
Text("This action cannot be undone. All data will be permanently deleted.")
}
}
}
.navigationTitle("Settings")
}
}
func deleteAllObjects<T: PersistentModel>(ofType type: T.Type, from context: ModelContext) throws {
let descriptor = FetchDescriptor<T>()
let allObjects = try context.fetch(descriptor)
for object in allObjects {
context.delete(object)
}
try context.save()
}
private func clearAllData () {
do {
try deleteAllObjects(ofType: Split.self, from: modelContext)
try deleteAllObjects(ofType: SplitExerciseAssignment.self, from: modelContext)
try deleteAllObjects(ofType: Workout.self, from: modelContext)
try deleteAllObjects(ofType: WorkoutLog.self, from: modelContext)
try modelContext.save()
} catch {
print("Failed to clear all data: \(error)")
}
}
}
struct SplitsListView: View {
var body: some View {
EntityListView<Split>(sort: [SortDescriptor(\Split.name)])
}
}

View File

@ -1,78 +0,0 @@
//
// SplitExerciseAssignment.swift
// Workouts
//
// Created by rzen on 7/15/25 at 7:12AM.
//
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
//
import SwiftUI
struct SplitExerciseAssignmentAddEditView: View {
@Environment(\.modelContext) private var modelContext
@Environment(\.dismiss) private var dismiss
@State private var showingExercisePicker = false
@State var model: SplitExerciseAssignment
var body: some View {
NavigationStack {
Form {
Section(header: Text("Exercise")) {
Button(action: {
showingExercisePicker = true
}) {
HStack {
Text(model.exerciseName.isEmpty ? "Select Exercise" : model.exerciseName)
Spacer()
Image(systemName: "chevron.right")
.foregroundColor(.gray)
}
}
}
Section (header: Text("Sets/Reps")) {
Stepper("Sets: \(model.sets)", value: $model.sets, in: 1...10)
Stepper("Reps: \(model.reps)", value: $model.reps, in: 1...50)
}
// Weight section
Section (header: Text("Weight")) {
HStack {
VStack(alignment: .center) {
Text("\(model.weight) lbs")
.font(.headline)
}
Spacer()
VStack(alignment: .trailing) {
Stepper("±1", value: $model.weight, in: 0...1000)
Stepper("±5", value: $model.weight, in: 0...1000, step: 5)
}
.frame(width: 130)
}
}
}
.sheet(isPresented: $showingExercisePicker) {
ExercisePickerView { exerciseName in
model.exerciseName = exerciseName
}
}
.navigationTitle(model.exerciseName.isEmpty ? "New Exercise" : model.exerciseName)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("Cancel") {
dismiss()
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save") {
try? modelContext.save()
dismiss()
}
}
}
}
}
}