aboutsummaryrefslogtreecommitdiff
path: root/Map/Views/ContentView.swift
diff options
context:
space:
mode:
Diffstat (limited to 'Map/Views/ContentView.swift')
-rw-r--r--Map/Views/ContentView.swift104
1 files changed, 104 insertions, 0 deletions
diff --git a/Map/Views/ContentView.swift b/Map/Views/ContentView.swift
new file mode 100644
index 0000000..4f55c27
--- /dev/null
+++ b/Map/Views/ContentView.swift
@@ -0,0 +1,104 @@
+//
+// ContentView.swift
+// Map
+//
+// Created by Ruben Beltran del Rio on 2/1/21.
+//
+
+import CoreData
+import SwiftUI
+
+struct ContentView: View {
+ @Environment(\.managedObjectContext) private var viewContext
+
+ @FetchRequest(
+ sortDescriptors: [NSSortDescriptor(keyPath: \Map.createdAt, ascending: true)],
+ animation: .default)
+ private var maps: FetchedResults<Map>
+
+ var body: some View {
+ NavigationView {
+ List {
+ if maps.count == 0 {
+ DefaultMapView()
+ }
+ ForEach(maps) { map in
+ NavigationLink(destination: MapDetailView(map: map)) {
+ HStack {
+ Text(map.title ?? "Untitled Map")
+ Spacer()
+ Text(mapFormatter.string(from: (map.createdAt ?? Date())))
+ .font(.caption)
+ .padding(.vertical, 2.0)
+ .padding(.horizontal, 4.0)
+ .background(Color.accentColor)
+ .foregroundColor(Color.black)
+ .cornerRadius(2.0)
+ }.padding(.leading, 8.0)
+ }
+ }
+ .onDelete(perform: deleteMaps)
+ }.frame(minWidth: 250.0, alignment: .leading)
+ .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 {
+ 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 {
+ let nsError = error as NSError
+ fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
+ }
+ }
+ }
+}
+
+private let mapFormatter: DateFormatter = {
+ let formatter = DateFormatter()
+ formatter.dateStyle = .short
+ formatter.timeStyle = .none
+ return formatter
+}()
+
+struct ContentView_Previews: PreviewProvider {
+ static var previews: some View {
+ ContentView().environment(
+ \.managedObjectContext, PersistenceController.preview.container.viewContext)
+ }
+}