49 lines
1.6 KiB
Swift
49 lines
1.6 KiB
Swift
import SwiftUI
|
|
import SwiftData
|
|
|
|
struct EntityAddEditView<T: EditableEntity, Content: View>: View {
|
|
@Environment(\.dismiss) private var dismiss
|
|
@Environment(\.modelContext) private var modelContext
|
|
|
|
@State var model: T
|
|
private let content: (Binding<T>) -> Content
|
|
|
|
init(model: T, @ViewBuilder content: @escaping (Binding<T>) -> Content) {
|
|
_model = State(initialValue: model)
|
|
self.content = content
|
|
}
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
Form {
|
|
content($model)
|
|
}
|
|
.toolbar {
|
|
ToolbarItem(placement: .navigationBarLeading) {
|
|
Button("Cancel") {
|
|
dismiss()
|
|
}
|
|
}
|
|
|
|
ToolbarItem(placement: .navigationBarTrailing) {
|
|
Button("Save") {
|
|
// If the model is not in a context, it's a new one.
|
|
if model.modelContext == nil {
|
|
modelContext.insert(model)
|
|
}
|
|
// The save is in a do-catch block to handle potential errors,
|
|
// such as constraint violations.
|
|
do {
|
|
try modelContext.save()
|
|
dismiss()
|
|
} catch {
|
|
// In a real app, you'd want to present this error to the user.
|
|
print("Failed to save model: \(error.localizedDescription)")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|