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

@ -0,0 +1,94 @@
//
// 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: Exercise.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)])
}
}