MikeMaus
MikeMaus

Reputation: 405

Model to search notes by date

How to model notes, so I can search them ,after, by dates? like on the picture.

Firstly, I thought about dictionary with key of type Date; but it didn't work to me. So I've tried the following String format:

"04-28-2020" - US calendar

"28-04-2020" - Other calendar

One of the issues - if the telephone changes date style(region dependent), keys remain in dictionary, but aren't accessed any more...

My intuition that it should be the dictionary, but what are the sustainable way to make such a model? Can it be an array of notes [Note], without keys?

enter image description here

struct Note: Codable, Identifiable {
    let id = UUID()
    var date: Date
    var title: String
    var description: String
    
    var dateString: String {
        let df = DateFormatter()
        df.dateStyle = .short
        df.timeStyle = .medium
        return df.string(from: date)
    }
    
    // method returns "key" to be used in dictionary
    static func dateKey(for date: Date) -> String {
        let df = DateFormatter()
        df.dateStyle = .short
        return df.string(from: date)
    }
}

class NotesOrganizer: ObservableObject {
    
    // @Published var notes = [Note]() - tried initially
    @Published var notesDictionary = [String : [Note]]()
}

struct ContentView: View {
    @State private var title = ""
    @State private var description = ""
    @ObservedObject var notesOrganizer = NotesOrganizer()
    
    var body: some View {
        NavigationView {
            VStack {
                Button("Save note") {
                   
                        let key = Note.dateKey(for: Date())
                        notesOrganizer.notesDictionary[key]?.append(Note(date: Date(), title: title, description: description)) 
?? (notesOrganizer.notesDictionary[key] = [Note(date: Date(), title: title, description: description)])
                        
                        print("Date Key: \(Note.dateKey(for: Date()))")    
                }
                
                
                NavigationLink(destination: DetailView(notesOrganizer: notesOrganizer)) 
                {
                    
                    Text("Log history ->")
                        .foregroundColor(.purple)
                        .underline()
                }
            }
            .navigationBarHidden(true)

        }
        
    }
    
    init() {
        UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
        UINavigationBar.appearance().shadowImage = UIImage()
    }

}

DetailView()

extension Date {
        var tomorrow: Date? {
            return Calendar.current.date(byAdding: .day, value: 1, to: self)
        }
        
        var yesterday: Date? {
            return Calendar.current.date(byAdding: .day, value: -1, to: self)
        }
}

struct DetailView: View {
    @ObservedObject var notesOrganizer: NotesOrganizer
    @State private var dayLabel: String = Note.dateKey(for: Date())
    @State private var chosenDate = Date()
    

    var body: some View {
        VStack {
            HStack {
                Button(action: {
                    chosenDate = chosenDate.yesterday!
                    dayLabel = Note.dateKey(for: chosenDate)
                }, label: {
                    Image(systemName: "chevron.left")
                })
                
                Text(dayLabel)
                
                Spacer()
                
                Button(action: {
                    chosenDate = chosenDate.tomorrow!
                    dayLabel = Note.dateKey(for: chosenDate)
                }, label: {
                    Image(systemName: "chevron.right")
                })
                
            }
            .padding([.horizontal,.bottom])
            
            List{
                ForEach(notesOrganizer.notesDictionary[day] ?? []) { note in
                    HStack {
                        VStack(alignment:.leading) {
                            Text(note.title)
                            Text(note.description)
                        }.multilineTextAlignment(.leading)
                        Spacer()
                        Text(note.dateString)
                    }
                }.onDelete(perform: removeItems)
            }
            .navigationBarTitle("", displayMode: .inline)
                
            
            Spacer()
        }

Upvotes: 1

Views: 64

Answers (0)

Related Questions