diff --git a/WordAX/Model/DataController.swift b/WordAX/Model/DataController.swift index 9b991a2..a544a47 100644 --- a/WordAX/Model/DataController.swift +++ b/WordAX/Model/DataController.swift @@ -23,16 +23,19 @@ class DataController: ObservableObject { var deck = Deck(context: viewContext) deck.id = UUID() deck.name = "This is a deck name" + deck.dateAdded = Date() decks.append(deck) deck = Deck(context: viewContext) deck.id = UUID() deck.name = "Another Deck" + deck.dateAdded = Date().addingTimeInterval(-86400) decks.append(deck) deck = Deck(context: viewContext) deck.id = UUID() deck.name = "Deck" + deck.dateAdded = Date().addingTimeInterval(-86400 * 2) decks.append(deck) for _ in 0..<10 { @@ -49,7 +52,7 @@ class DataController: ObservableObject { flashcard.shownCount = [0, 1, 2, 3, 4, 5].randomElement()! flashcard.dateAdded = [Date(), Date().addingTimeInterval(-86400), Date().addingTimeInterval(-172800)].randomElement()! flashcard.favorite = [true, false].randomElement()! -// flashcard.deck = decks.randomElement() + flashcard.deck = decks.randomElement() } do { try viewContext.save() diff --git a/WordAX/Model/Deck/Deck+CoreDataProperties.swift b/WordAX/Model/Deck/Deck+CoreDataProperties.swift index eb83d29..ce9f4b4 100644 --- a/WordAX/Model/Deck/Deck+CoreDataProperties.swift +++ b/WordAX/Model/Deck/Deck+CoreDataProperties.swift @@ -18,6 +18,7 @@ extension Deck { @NSManaged public var id: UUID? @NSManaged public var name: String? + @NSManaged public var dateAdded: Date? @NSManaged public var flashcards: NSSet? } diff --git a/WordAX/Model/WordAXCD.xcdatamodeld/WordAX0.0.4.xcdatamodel/contents b/WordAX/Model/WordAXCD.xcdatamodeld/WordAX0.0.4.xcdatamodel/contents index fba7178..ed23f40 100644 --- a/WordAX/Model/WordAXCD.xcdatamodeld/WordAX0.0.4.xcdatamodel/contents +++ b/WordAX/Model/WordAXCD.xcdatamodeld/WordAX0.0.4.xcdatamodel/contents @@ -1,17 +1,18 @@ + - + - + - + diff --git a/WordAX/Views/Deck/AddDeckView.swift b/WordAX/Views/Deck/AddDeckView.swift index 7587a53..8a52c75 100644 --- a/WordAX/Views/Deck/AddDeckView.swift +++ b/WordAX/Views/Deck/AddDeckView.swift @@ -30,6 +30,7 @@ struct AddDeckView: View { let deck = Deck(context: moc) deck.id = UUID() deck.name = name + deck.dateAdded = Date() do { try moc.save() self.isShowing = false diff --git a/WordAX/Views/Deck/DeckListView.swift b/WordAX/Views/Deck/DeckListView.swift index 2ea0b68..2b258f5 100644 --- a/WordAX/Views/Deck/DeckListView.swift +++ b/WordAX/Views/Deck/DeckListView.swift @@ -8,14 +8,19 @@ import SwiftUI struct DeckListView: View { - @FetchRequest(sortDescriptors: []) var decks: FetchedResults + @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "dateAdded", ascending: false)]) var decks: FetchedResults @State var addDeck = false @Environment(\.managedObjectContext) var moc + @State var addFlashcard = false var body: some View { - NavigationSplitView { + NavigationStack { List { ForEach(decks) { deck in - Text(deck.name ?? "Unknown deck name") + NavigationLink { + FlashCardListView(deck: deck) + } label: { + Text(deck.name ?? "Unknown deck name") + } } .onDelete(perform: { offsets in for index in offsets { @@ -43,8 +48,6 @@ struct DeckListView: View { } } .navigationTitle("All decks") - } detail: { - Text("Select deck to get details about") } .sheet(isPresented: $addDeck, content: { AddDeckView(isShowing: $addDeck) diff --git a/WordAX/Views/Flashcards/FlashCardListView.swift b/WordAX/Views/Flashcards/FlashCardListView.swift index a73ae2a..68833c0 100644 --- a/WordAX/Views/Flashcards/FlashCardListView.swift +++ b/WordAX/Views/Flashcards/FlashCardListView.swift @@ -6,15 +6,18 @@ // import SwiftUI +import CoreData struct FlashCardListView: View { @State var showDescription = true - @State var addFlashcard = false - @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "favorite", ascending: false), NSSortDescriptor(key: "dateAdded", ascending: false)]) var flashcards: FetchedResults + @State var addFlashcard: Bool = false + @State var flashcards: [Flashcard] = [] + var deck: Deck? @Environment(\.managedObjectContext) var moc + var body: some View { GeometryReader { geometry in - NavigationSplitView { + NavigationStack { Group { if !flashcards.isEmpty { List { @@ -29,6 +32,7 @@ struct FlashCardListView: View { for index in offsets { let flashcard = flashcards[index] moc.delete(flashcard) + flashcards.remove(at: index) } do { @@ -39,16 +43,27 @@ struct FlashCardListView: View { }) } } else { - Text("You currently don't have any flashcards. To add flashcards, either click at the '+' button at the top or you can download them from the store (coming soon)") - .padding() - .background(.purple) - .clipShape(.buttonBorder) - .frame(maxWidth: geometry.size.width - 30) + Group { + Text("You currently don't have any flashcards. To add flashcards, either click at the '+' button at the top or you can download them from the store (coming soon)") + .padding() + .background(.purple) + .clipShape(.buttonBorder) + } + .frame(maxHeight: .infinity) + .padding(.horizontal) } } - .navigationTitle("All Flashcards") + .onAppear { + refreshFlashcards() + } + .onChange(of: addFlashcard, { oldValue, newValue in + if oldValue { + refreshFlashcards() + } + }) + .navigationBarTitle(deck?.name ?? "All Flashcards", displayMode: deck != nil ? .inline : .automatic) .toolbar { - ToolbarItemGroup(placement: .topBarLeading) { + ToolbarItemGroup(placement: .topBarTrailing) { EditButton() } ToolbarItemGroup(placement: .topBarTrailing) { @@ -59,14 +74,29 @@ struct FlashCardListView: View { } } } - } detail: { - Text("Select flashcard to get details about") } .sheet(isPresented: $addFlashcard, content: { - AddFlashCardView(isShowing: $addFlashcard) + AddFlashCardView(isShowing: $addFlashcard, selectedDeck: deck) }) } } + + private func refreshFlashcards() { + let request = NSFetchRequest(entityName: "Flashcard") + request.sortDescriptors = [NSSortDescriptor(key: "favorite", ascending: false), NSSortDescriptor(key: "dateAdded", ascending: false)] + if deck != nil { + request.predicate = NSPredicate(format: "deck == %@", deck!) + // flashcards = deck?.flashcards?.allObjects as? [Flashcard] ?? [] + } + do { + flashcards = try moc.fetch(request) + print(flashcards) + } catch { + print("Something went wrong while fetching the flashcards") + flashcards = [] + } + } + } #Preview {