// // ContentView.swift // Map // // Created by Ruben Beltran del Rio on 2/1/21. // import SwiftUI import CoreData struct ContentView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Map.createdAt, ascending: true)], animation: .default) private var maps: FetchedResults var body: some View { NavigationView { List { ForEach(maps) { map in NavigationLink(destination: MapDetailView(map: map)) { HStack { Text(map.title ?? "Untitled Map") Text(map.createdAt!.format()) .font(.footnote) .foregroundColor(Color.accentColor) } } } .onDelete(perform: deleteMaps) } .toolbar { HStack { Button(action: toggleSidebar) { Label("Toggle Sidebar", systemImage: "sidebar.left") } Button(action: addMap) { Label("Add Map", systemImage: "plus") } } } } } private func toggleSidebar() { NSApp.keyWindow?.firstResponder?.tryToPerform(#selector(NSSplitViewController.toggleSidebar(_:)), with: nil) } private func addMap() { withAnimation { let newMap = Map(context: viewContext) newMap.uuid = UUID() newMap.createdAt = Date() newMap.title = "Map \(newMap.createdAt!.format())" newMap.content = "" do { try viewContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } } private func deleteMaps(offsets: IndexSet) { withAnimation { offsets.map { maps[$0] }.forEach(viewContext.delete) do { try viewContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } } } } private let mapFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .medium return formatter }() struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) } }