diff --git a/WordAX.xcodeproj/project.pbxproj b/WordAX.xcodeproj/project.pbxproj index cf6985b..76767c3 100644 --- a/WordAX.xcodeproj/project.pbxproj +++ b/WordAX.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 6C8185002B88C9660033CF46 /* WordAXModelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8184FF2B88C9660033CF46 /* WordAXModelView.swift */; }; 6C8185022B88C9FB0033CF46 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8185012B88C9FB0033CF46 /* SettingsView.swift */; }; 6C8185042B88CA210033CF46 /* AnkiView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8185032B88CA210033CF46 /* AnkiView.swift */; }; + 6C8185062B8A537F0033CF46 /* WordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C8185052B8A537F0033CF46 /* WordView.swift */; }; 6CF439522B83541D004C3543 /* WordAXApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF439512B83541D004C3543 /* WordAXApp.swift */; }; 6CF439542B83541D004C3543 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CF439532B83541D004C3543 /* MainView.swift */; }; 6CF439562B83541E004C3543 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6CF439552B83541E004C3543 /* Assets.xcassets */; }; @@ -22,6 +23,7 @@ 6C8184FF2B88C9660033CF46 /* WordAXModelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordAXModelView.swift; sourceTree = ""; }; 6C8185012B88C9FB0033CF46 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; 6C8185032B88CA210033CF46 /* AnkiView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnkiView.swift; sourceTree = ""; }; + 6C8185052B8A537F0033CF46 /* WordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordView.swift; sourceTree = ""; }; 6CF4394E2B83541D004C3543 /* WordAX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WordAX.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6CF439512B83541D004C3543 /* WordAXApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordAXApp.swift; sourceTree = ""; }; 6CF439532B83541D004C3543 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; @@ -63,6 +65,7 @@ 6CF439532B83541D004C3543 /* MainView.swift */, 6C8185012B88C9FB0033CF46 /* SettingsView.swift */, 6C8185032B88CA210033CF46 /* AnkiView.swift */, + 6C8185052B8A537F0033CF46 /* WordView.swift */, 6C8184FD2B88C9580033CF46 /* WordAX.swift */, 6C8184FF2B88C9660033CF46 /* WordAXModelView.swift */, 6CF439552B83541E004C3543 /* Assets.xcassets */, @@ -151,6 +154,7 @@ files = ( 6C8185022B88C9FB0033CF46 /* SettingsView.swift in Sources */, 6CF439542B83541D004C3543 /* MainView.swift in Sources */, + 6C8185062B8A537F0033CF46 /* WordView.swift in Sources */, 6C8185002B88C9660033CF46 /* WordAXModelView.swift in Sources */, 6C8185042B88CA210033CF46 /* AnkiView.swift in Sources */, 6CF439522B83541D004C3543 /* WordAXApp.swift in Sources */, diff --git a/WordAX/AnkiView.swift b/WordAX/AnkiView.swift index 3d3772e..cfd594e 100644 --- a/WordAX/AnkiView.swift +++ b/WordAX/AnkiView.swift @@ -9,8 +9,15 @@ import SwiftUI struct AnkiView: View { @EnvironmentObject var model: WordAXModelView + var word: WordAX.Word? { + model.getWordToDisplay() + } var body: some View { - Text("This is Anki View") + if word != nil { + WordView(word: word!) + } else { + Text("There is no word to display, come back later") + } } } diff --git a/WordAX/WordAX.swift b/WordAX/WordAX.swift index a768be2..3342746 100644 --- a/WordAX/WordAX.swift +++ b/WordAX/WordAX.swift @@ -14,7 +14,7 @@ struct WordAX { var description: String var shown: Bool var nextSpacedRepetitionMilestone: SpacedRepetitionMilestoneEnum? - var displayOn: Date? + var lastSeenOn: Date? } enum FrequencyEnum: Int { case Daily = 1 @@ -35,11 +35,21 @@ struct WordAX { static var allCasesSorted: [SpacedRepetitionMilestoneEnum] { allCases.sorted {$0.rawValue < $1.rawValue } } + + func getNext() -> SpacedRepetitionMilestoneEnum? { + let sorted = WordAX.SpacedRepetitionMilestoneEnum.allCasesSorted + let milestoneIndex = sorted.firstIndex(where: {$0.rawValue == self.rawValue})! + if milestoneIndex < WordAX.SpacedRepetitionMilestoneEnum.allCasesSorted.count { + return sorted[milestoneIndex + 1] + } + return nil + } } struct Settings { var frequency: FrequencyEnum = .Daily var lastShownNew: Date? + var dateFormatter: DateFormatter } private mutating func setNextSpacedRepetitionMilestone(word: Word) { @@ -59,8 +69,10 @@ struct WordAX { init() { self.words = [] - self.settings = Settings() - self.words.append(Word(id: 0, name: "Magnificent", description: "When something is awesome", shown: false)) + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "dd/mm/YYYY" + self.settings = Settings(dateFormatter: dateFormatter) + self.words.append(Word(id: 0, name: "Magnificent", description: "When something is awesome. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.", shown: false)) self.words.append(Word(id: 1, name: "Mesmerising", description: "When something is beautiful", shown: false)) } diff --git a/WordAX/WordAXModelView.swift b/WordAX/WordAXModelView.swift index 8851a00..727a440 100644 --- a/WordAX/WordAXModelView.swift +++ b/WordAX/WordAXModelView.swift @@ -14,12 +14,17 @@ class WordAXModelView: ObservableObject { model = WordAX() } + public func getDateFormatter() -> DateFormatter { + model.settings.dateFormatter + } + public func getWordToDisplay() -> Word? { let words = model.words if words.count > 0 { // if today is the date they're supposed to be shown - let displayToday = words.filter({ $0.displayOn != nil && $0.displayOn!.isToday()}) + + let displayToday = words.filter({ $0.lastSeenOn != nil && $0.lastSeenOn!.add}) if displayToday.count > 0 { return displayToday.first! } @@ -33,7 +38,7 @@ class WordAXModelView: ObservableObject { let settings = model.settings if shownWords.count == 0 || settings.lastShownNew == nil || - settings.lastShownNew!.addingTimeInterval(TimeInterval(settings.frequency.rawValue * 24 * 60 * 60)).isAfterToday() { + settings.lastShownNew!.addFrequency(frequency: settings.frequency).isAfterToday() { return words.first! } } @@ -63,6 +68,10 @@ extension Date { return selfDate.year! > paramDate.year! || selfDate.month! > paramDate.month! || selfDate.day! > paramDate.day! } + func addFrequency(frequency: WordAX.FrequencyEnum) -> Date { + self.addingTimeInterval(TimeInterval(frequency.rawValue * 24 * 60 * 60)) + } + func isAfterToday() -> Bool { self.isAfter(Date()) } diff --git a/WordAX/WordView.swift b/WordAX/WordView.swift new file mode 100644 index 0000000..1ef89d9 --- /dev/null +++ b/WordAX/WordView.swift @@ -0,0 +1,40 @@ +// +// WordView.swift +// WordAX +// +// Created by Oliver Hnát on 24.02.2024. +// + +import SwiftUI +import UIKit + +struct WordView: View { + var word: WordAX.Word + var showDescription: Bool = true + @EnvironmentObject var model: WordAXModelView + @Environment(\.colorScheme) var colorScheme + + var body: some View { + VStack { + Text(word.name) + .font(.title) + .bold() + if word.shown && word.lastSeenOn != nil { + Text(model.getDateFormatter().string(from: word.lastSeenOn!)) + } + if showDescription { + Divider() + .background(colorScheme == .light ? Color.black : Color.white) + .padding(.horizontal) + Text(word.description) + .multilineTextAlignment(.center) + } + } + .padding([.horizontal, .top]) + } +} + +#Preview { + WordView(word: WordAXModelView().getWordToDisplay()!) + .environmentObject(WordAXModelView()) +}