137 lines
4.1 KiB
Swift
137 lines
4.1 KiB
Swift
import SwiftUI
|
|
|
|
struct AddEditSessionView: View {
|
|
let sessionId: UUID?
|
|
@EnvironmentObject var dataManager: ClimbingDataManager
|
|
@Environment(\.dismiss) private var dismiss
|
|
|
|
@State private var selectedGym: Gym?
|
|
@State private var sessionDate = Date()
|
|
@State private var notes = ""
|
|
@State private var isEditing = false
|
|
|
|
private var existingSession: ClimbSession? {
|
|
guard let sessionId = sessionId else { return nil }
|
|
return dataManager.session(withId: sessionId)
|
|
}
|
|
|
|
init(sessionId: UUID? = nil) {
|
|
self.sessionId = sessionId
|
|
}
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
GymSelectionSection()
|
|
SessionDetailsSection()
|
|
}
|
|
.navigationTitle(isEditing ? "Edit Session" : "New Session")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .navigationBarLeading) {
|
|
Button("Cancel") {
|
|
dismiss()
|
|
}
|
|
}
|
|
|
|
ToolbarItem(placement: .navigationBarTrailing) {
|
|
Button("Save") {
|
|
saveSession()
|
|
}
|
|
.disabled(selectedGym == nil)
|
|
}
|
|
}
|
|
}
|
|
.onAppear {
|
|
loadExistingSession()
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func GymSelectionSection() -> some View {
|
|
Section("Select Gym") {
|
|
if dataManager.gyms.isEmpty {
|
|
Text("No gyms available. Add a gym first.")
|
|
.foregroundColor(.secondary)
|
|
} else {
|
|
ForEach(dataManager.gyms, id: \.id) { gym in
|
|
HStack {
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text(gym.name)
|
|
.font(.headline)
|
|
|
|
if let location = gym.location, !location.isEmpty {
|
|
Text(location)
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
}
|
|
|
|
Spacer()
|
|
|
|
if selectedGym?.id == gym.id {
|
|
Image(systemName: "checkmark.circle.fill")
|
|
.foregroundColor(.blue)
|
|
}
|
|
}
|
|
.contentShape(Rectangle())
|
|
.onTapGesture {
|
|
selectedGym = gym
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func SessionDetailsSection() -> some View {
|
|
Section("Session Details") {
|
|
DatePicker(
|
|
"Date",
|
|
selection: $sessionDate,
|
|
displayedComponents: [.date]
|
|
)
|
|
|
|
VStack(alignment: .leading, spacing: 8) {
|
|
Text("Notes (Optional)")
|
|
.font(.headline)
|
|
|
|
TextEditor(text: $notes)
|
|
.frame(minHeight: 100)
|
|
.padding(8)
|
|
.background(
|
|
RoundedRectangle(cornerRadius: 8)
|
|
.fill(.quaternary)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
private func loadExistingSession() {
|
|
if let session = existingSession {
|
|
isEditing = true
|
|
selectedGym = dataManager.gym(withId: session.gymId)
|
|
sessionDate = session.date
|
|
notes = session.notes ?? ""
|
|
}
|
|
}
|
|
|
|
private func saveSession() {
|
|
guard let gym = selectedGym else { return }
|
|
|
|
if isEditing, let session = existingSession {
|
|
let updatedSession = session.updated(notes: notes.isEmpty ? nil : notes)
|
|
dataManager.updateSession(updatedSession)
|
|
} else {
|
|
dataManager.startSession(gymId: gym.id, notes: notes.isEmpty ? nil : notes)
|
|
}
|
|
|
|
dismiss()
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
AddEditSessionView()
|
|
.environmentObject(ClimbingDataManager.preview)
|
|
}
|