Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.62 KB | None | 0 0
  1. //
  2. // ContentView.swift
  3. // Listomania
  4. //
  5. // Created by Jack Newcombe on 05/06/2019.
  6. // Copyright © 2019 Jack Newcombe. All rights reserved.
  7. //
  8.  
  9. import SwiftUI
  10.  
  11. let dateFormatter = DateFormatter()
  12.  
  13. struct NoteItem: Codable, Hashable, Identifiable {
  14. let id: Int
  15. let text: String
  16. private let date = Date()
  17. var dateText: String {
  18. dateFormatter.dateFormat = "MMM d yyyy, h:mm a"
  19. return dateFormatter.string(from: date)
  20. }
  21. }
  22.  
  23. struct ContentView : View {
  24.  
  25. @State var items: [NoteItem] = {
  26. guard let data = UserDefaults.standard.data(forKey: "notes") else { return [] }
  27. if let json = try? JSONDecoder().decode([NoteItem].self, from: data) {
  28. return json
  29. }
  30. return []
  31. }()
  32.  
  33. @State var taskText: String = ""
  34.  
  35. @State var showAlert = false
  36.  
  37. @State var itemToDelete: NoteItem?
  38.  
  39. var alert: Alert {
  40. Alert(title: Text("Hey!"),
  41. message: Text("Are you sure you want to delete this item?"),
  42. primaryButton: .destructive(Text("Delete"), onTrigger: deleteNote),
  43. secondaryButton: .cancel())
  44. }
  45.  
  46. var inputView: some View {
  47. HStack {
  48. TextField($taskText, placeholder: Text("Write a note ..."))
  49. .padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
  50. .clipped()
  51. Button(action: didTapAddTask, label: { Text("Add") }).padding(8)
  52. }
  53. }
  54.  
  55. var body: some View {
  56. VStack {
  57. inputView
  58. Divider()
  59. List(items) { item in
  60. VStack(alignment: .leading) {
  61. Text(item.dateText).font(.headline)
  62. Text(item.text).lineLimit(nil).multilineTextAlignment(.leading)
  63. }
  64. .longPressAction({
  65. self.itemToDelete = item
  66. self.showAlert = true
  67. })
  68. }
  69. .presentation($showAlert) { alert }
  70. }
  71. }
  72.  
  73. func didTapAddTask() {
  74. let id = items.reduce(0) { max($0.id, $1.id) } + 1
  75. items.insert(NoteItem(id: id, text: taskText), at: 0)
  76. taskText = ""
  77. save()
  78. }
  79.  
  80. func deleteNote() {
  81. guard let itemToDelete = itemToDelete else { return }
  82. items = items.filter { $0 != itemToDelete }
  83. save()
  84. }
  85.  
  86. func save() {
  87. guard let data = try? JSONEncoder().encode(items) else { return }
  88. UserDefaults.standard.set(data, forKey: "notes")
  89. }
  90. }
  91.  
  92. #if DEBUG
  93. struct ContentView_Previews : PreviewProvider {
  94. static var previews: some View {
  95. ContentView()
  96. }
  97. }
  98. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement