Skip to content

Instantly share code, notes, and snippets.

@productinfo
Forked from jnewc/NotesApp.swift
Created July 2, 2019 21:06
Show Gist options
  • Save productinfo/c31558fd556e77f7097c23ff743e2c16 to your computer and use it in GitHub Desktop.
Save productinfo/c31558fd556e77f7097c23ff743e2c16 to your computer and use it in GitHub Desktop.
A notes app written in >100 lines of swift using SwiftUI
//
// ContentView.swift
// Listomania
//
// Created by Jack Newcombe on 05/06/2019.
// Copyright © 2019 Jack Newcombe. All rights reserved.
//
import SwiftUI
let dateFormatter = DateFormatter()
struct NoteItem: Codable, Hashable, Identifiable {
let id: Int
let text: String
private let date = Date()
var dateText: String {
dateFormatter.dateFormat = "MMM d yyyy, h:mm a"
return dateFormatter.string(from: date)
}
}
struct ContentView : View {
@State var items: [NoteItem] = {
guard let data = UserDefaults.standard.data(forKey: "notes") else { return [] }
if let json = try? JSONDecoder().decode([NoteItem].self, from: data) {
return json
}
return []
}()
@State var taskText: String = ""
@State var showAlert = false
@State var itemToDelete: NoteItem?
var alert: Alert {
Alert(title: Text("Hey!"),
message: Text("Are you sure you want to delete this item?"),
primaryButton: .destructive(Text("Delete"), onTrigger: deleteNote),
secondaryButton: .cancel())
}
var inputView: some View {
HStack {
TextField($taskText, placeholder: Text("Write a note ..."))
.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
.clipped()
Button(action: didTapAddTask, label: { Text("Add") }).padding(8)
}
}
var body: some View {
VStack {
inputView
Divider()
List(items) { item in
VStack(alignment: .leading) {
Text(item.dateText).font(.headline)
Text(item.text).lineLimit(nil).multilineTextAlignment(.leading)
}
.longPressAction({
self.itemToDelete = item
self.showAlert = true
})
}
.presentation($showAlert) { alert }
}
}
func didTapAddTask() {
let id = items.reduce(0) { max($0.id, $1.id) } + 1
items.insert(NoteItem(id: id, text: taskText), at: 0)
taskText = ""
save()
}
func deleteNote() {
guard let itemToDelete = itemToDelete else { return }
items = items.filter { $0 != itemToDelete }
save()
}
func save() {
guard let data = try? JSONEncoder().encode(items) else { return }
UserDefaults.standard.set(data, forKey: "notes")
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment