- Migrate from SwiftData to CoreData with CloudKit sync - Add core models: Split, Exercise, Workout, WorkoutLog - Implement tab-based UI: Workout Logs, Splits, Settings - Add SF Symbols picker for split icons - Add exercise picker filtered by split with exclusion of added exercises - Integrate IndieAbout for settings/about section - Add Yams for YAML exercise definition parsing - Include starter exercise libraries (bodyweight, Planet Fitness) - Add Date extensions for formatting (formattedTime, isSameDay) - Format workout date ranges to show time-only for same-day end dates - Add build number update script - Add app icons
72 lines
2.0 KiB
Swift
72 lines
2.0 KiB
Swift
//
|
|
// SplitListView.swift
|
|
// Workouts
|
|
//
|
|
// Created by rzen on 7/25/25 at 6:24 PM.
|
|
//
|
|
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
import CoreData
|
|
|
|
struct SplitListView: View {
|
|
@Environment(\.managedObjectContext) private var viewContext
|
|
|
|
@FetchRequest(
|
|
sortDescriptors: [
|
|
NSSortDescriptor(keyPath: \Split.order, ascending: true),
|
|
NSSortDescriptor(keyPath: \Split.name, ascending: true)
|
|
],
|
|
animation: .default
|
|
)
|
|
private var fetchedSplits: FetchedResults<Split>
|
|
|
|
@State private var splits: [Split] = []
|
|
@State private var allowSorting: Bool = true
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
LazyVGrid(columns: [GridItem(.flexible()), GridItem(.flexible())], spacing: 16) {
|
|
SortableForEach($splits, allowReordering: $allowSorting) { split, dragging in
|
|
NavigationLink {
|
|
SplitDetailView(split: split)
|
|
} label: {
|
|
SplitItem(split: split)
|
|
.overlay(dragging ? Color.white.opacity(0.8) : Color.clear)
|
|
}
|
|
}
|
|
}
|
|
.padding()
|
|
}
|
|
.overlay {
|
|
if fetchedSplits.isEmpty {
|
|
ContentUnavailableView(
|
|
"No Splits Yet",
|
|
systemImage: "dumbbell.fill",
|
|
description: Text("Create a split to organize your workout routine.")
|
|
)
|
|
}
|
|
}
|
|
.onAppear {
|
|
splits = Array(fetchedSplits)
|
|
}
|
|
.onChange(of: fetchedSplits.count) { _, _ in
|
|
splits = Array(fetchedSplits)
|
|
}
|
|
.onChange(of: splits) { _, _ in
|
|
saveContext()
|
|
}
|
|
}
|
|
|
|
private func saveContext() {
|
|
if viewContext.hasChanges {
|
|
do {
|
|
try viewContext.save()
|
|
} catch {
|
|
print("Error saving after reorder: \(error)")
|
|
}
|
|
}
|
|
}
|
|
}
|