Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement