ContentView.swift
//
// ContentView.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct ContentView: View {
@StateObject var notes = Notes()
@State private var sheetIsShowing = false
var body: some View {
NavigationView {
VStack {
NoteView()
.sheet(isPresented: $sheetIsShowing) {
AddNew()
}
}
.navigationTitle("Notes")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
withAnimation {
self.sheetIsShowing.toggle()
}
} label: {
Label("Add Note", systemImage: "plus.circle.fill")
}
}
}
}
.environmentObject(notes)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
NotesData.swift
//
// NotesData.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import Foundation
import SwiftUI
struct Note : Codable, Identifiable {
var id = UUID()
var title: String
var content: String
var timeStamp: String
}
@MainActor class Notes : ObservableObject {
private let NOTES_KEY = "cairocodersnoteskey"
let date = Date()
var notes: [Note] {
didSet {
saveData()
objectWillChange.send()
}
}
init() {
// Load saved data
if let data = UserDefaults.standard.data(forKey: NOTES_KEY) {
if let decodedNotes = try? JSONDecoder().decode([Note].self, from: data) {
notes = decodedNotes
return
}
}
// Tutorial Note
notes = [Note(title: "Test Note", content: "Tap add button. You can delete any note by swiping to the left!", timeStamp: date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss"))]
}
func addNote(title: String, content: String) {
let tempNote = Note(title: title, content: content, timeStamp: date.getFormattedDate(format: "yyyy-MM-dd HH:mm:ss"))
notes.insert(tempNote, at: 0)
saveData()
}
// Save data
private func saveData() {
if let encodedNotes = try? JSONEncoder().encode(notes) {
UserDefaults.standard.set(encodedNotes, forKey: NOTES_KEY)
}
}
}
extension Date {
func getFormattedDate(format: String) -> String {
let dateformat = DateFormatter()
dateformat.dateFormat = format
return dateformat.string(from: self)
}
}
NoteView.swift
//
// NoteView.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct NoteView: View {
@EnvironmentObject var notes: Notes
var body: some View {
List {
ForEach(notes.notes) { note in
VStack(alignment: .leading) {
Text(note.title)
.foregroundColor(.blue)
.font(.headline)
Text(note.content)
.font(.body)
.padding(.vertical)
HStack {
Spacer()
Text("\(note.timeStamp)")
.foregroundColor(.gray)
.italic()
}
}
}
.onDelete(perform: deleteNote)
}
}
func deleteNote(at offsets: IndexSet) {
notes.notes.remove(atOffsets: offsets)
}
}
struct NoteView_Previews: PreviewProvider {
static var previews: some View {
NoteView()
.environmentObject(Notes())
}
}
AddNew.swift
//
// AddNew.swift
// SwiftUIProject
//
// Created by Cairocoders
//
import SwiftUI
struct AddNew: View {
@State private var title = ""
@State private var content = ""
@EnvironmentObject var notes: Notes
@Environment(\.dismiss) var dismiss
var body: some View {
Form {
Section {
TextField("Give your note a title", text: $title)
ZStack {
TextEditor(text: $content)
.frame(height: 200)
VStack {
Spacer()
HStack {
Spacer()
Text("\(content.count)/120")
.foregroundColor(.gray)
.padding()
}
}
}
HStack {
Spacer()
Button("Add note!") {
notes.addNote(title: title, content: content)
dismiss()
}
Spacer()
}
}
}
}
}
struct AddNew_Previews: PreviewProvider {
static var previews: some View {
AddNew()
.environmentObject(Notes())
}
}
