diff --git a/Shared/Models/ContentModeViewModel.swift b/Shared/Models/ContentModeViewModel.swift index 49157b8..05c3a77 100644 --- a/Shared/Models/ContentModeViewModel.swift +++ b/Shared/Models/ContentModeViewModel.swift @@ -49,7 +49,11 @@ class ContentModeViewModel: ObservableObject { } public func shouldShowVotingHeader() -> Bool { - isMissingCurrentVote() && savedOnboardingData.ableToVoteBasedOnCurentTime() ? true : false + if isMissingCurrentVote() { + return true + } + + return savedOnboardingData.ableToVoteBasedOnCurentTime() ? true : false } public func updateOnboardingData(onboardingData: OnboardingData) { @@ -58,23 +62,29 @@ class ContentModeViewModel: ObservableObject { } private func isMissingCurrentVote() -> Bool { - let fetchRequest = NSFetchRequest(entityName: "MoodEntry") + let latestVoteUnLocked = UserDefaultsStore.getOnboarding().ableToVoteBasedOnCurentTime() + let inputDay = UserDefaultsStore.getOnboarding().inputDay - var calendar = Calendar.current - calendar.timeZone = NSTimeZone.local + var startDate: Date? - var dateFrom: Date - switch savedOnboardingData.inputDay { - case .Today: - dateFrom = calendar.startOfDay(for: Date()) - case .Previous: - dateFrom = calendar.startOfDay(for: Date()) - dateFrom = calendar.date(byAdding: .day, value: -1, to: dateFrom)! + switch (latestVoteUnLocked, inputDay) { + case (true, .Previous): + startDate = Calendar.current.date(byAdding: .day, value: -1, to: Date())! + case (true, .Today): + startDate = Date() + case (false, .Previous): + startDate = Calendar.current.date(byAdding: .day, value: -2, to: Date())! + case (false, .Today): + startDate = Calendar.current.date(byAdding: .day, value: -1, to: Date())! } - let dateTo = calendar.date(byAdding: .day, value: 1, to: dateFrom)! - let fromPredicate = NSPredicate(format: "%@ <= %K", dateFrom as NSDate, #keyPath(MoodEntry.forDate)) - let toPredicate = NSPredicate(format: "%K < %@", #keyPath(MoodEntry.forDate), dateTo as NSDate) + startDate = Calendar.current.startOfDay(for: startDate!) + let endDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate!)! + + let fetchRequest = NSFetchRequest(entityName: "MoodEntry") + let fromPredicate = NSPredicate(format: "%@ <= %K", startDate! + as NSDate, #keyPath(MoodEntry.forDate)) + let toPredicate = NSPredicate(format: "%K < %@", #keyPath(MoodEntry.forDate), endDate as NSDate) let datePredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [fromPredicate, toPredicate]) fetchRequest.predicate = datePredicate let entries = try! PersistenceController.shared.viewContext.count(for: fetchRequest) diff --git a/Shared/Persistence.swift b/Shared/Persistence.swift index 226d09e..3eb6f0c 100644 --- a/Shared/Persistence.swift +++ b/Shared/Persistence.swift @@ -146,13 +146,28 @@ class PersistenceController { } func fillInMissingDates() { + let latestVoteUnLocked = UserDefaultsStore.getOnboarding().ableToVoteBasedOnCurentTime() + let inputDay = UserDefaultsStore.getOnboarding().inputDay + + var endDate: Date? + + switch (latestVoteUnLocked, inputDay) { + case (true, .Previous): + endDate = Calendar.current.date(byAdding: .day, value: -1, to: Date())! + case (true, .Today): + endDate = Date() + case (false, .Previous): + endDate = Calendar.current.date(byAdding: .day, value: -2, to: Date())! + case (false, .Today): + endDate = Calendar.current.date(byAdding: .day, value: -1, to: Date())! + } + let fetchRequest = NSFetchRequest(entityName: "MoodEntry") fetchRequest.sortDescriptors = [NSSortDescriptor(key: "forDate", ascending: false)] let entries = try! viewContext.fetch(fetchRequest) if let firstEntry = entries.last?.forDate { - let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date())! - let allDates: [Date] = Date.dates(from: firstEntry, to: yesterday).map({ + let allDates: [Date] = Date.dates(from: firstEntry, to: endDate!).map({ let zeroDate = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: $0)! return zeroDate }) diff --git a/Shared/views/AddMoodHeaderView.swift b/Shared/views/AddMoodHeaderView.swift index 4886dd6..e83fe9f 100644 --- a/Shared/views/AddMoodHeaderView.swift +++ b/Shared/views/AddMoodHeaderView.swift @@ -16,7 +16,9 @@ struct AddMoodHeaderView: View { let addItemHeaderClosure: ((Mood, Date) -> Void) - var overrideDay: DayOptions? + init(addItemHeaderClosure: @escaping ((Mood, Date) -> Void)) { + self.addItemHeaderClosure = addItemHeaderClosure + } var body: some View { ZStack { @@ -55,40 +57,48 @@ struct AddMoodHeaderView: View { } private func getTitle() -> String { - if let overrideDay = overrideDay { - switch overrideDay { - case .Today: - return String(localized: "add_mood_header_view_title_today") - case .Previous: - return String(localized: "add_mood_header_view_title_yesterday") - } - } else { - switch savedOnboardingData.inputDay { - case .Today: - return String(localized: "add_mood_header_view_title_today") - case .Previous: - return String(localized: "add_mood_header_view_title_yesterday") - } + //if this is being shown we're missing an entry + // voting time is noon + // vote for current day + // today at 11 am -> How as yesterday + // today at 1 pm -> How is today + // vote for previous day + // today at 11 am -> How as 2 days ago + // today at 1 pm -> How was yesterday + + let latestVoteUnLocked = UserDefaultsStore.getOnboarding().ableToVoteBasedOnCurentTime() + let inputDay = UserDefaultsStore.getOnboarding().inputDay + + switch (latestVoteUnLocked, inputDay) { + case (true, .Previous): + return "how was yesterday" + case (true, .Today): + return "how is today" + case (false, .Previous): + return "how was two days ago" + case (false, .Today): + return "how as yesterday" } } private func addItem(withMood mood: Mood) { - if let overrideDay = overrideDay { - switch overrideDay { - case .Today: - addItemHeaderClosure(mood, Date()) - case .Previous: - let date = Calendar.current.date(byAdding: .day, value: -1, to: Date())! - addItemHeaderClosure(mood, date) - } - } else { - switch savedOnboardingData.inputDay { - case .Today: - addItemHeaderClosure(mood, Date()) - case .Previous: - let date = Calendar.current.date(byAdding: .day, value: -1, to: Date())! - addItemHeaderClosure(mood, date) - } + let latestVoteUnLocked = UserDefaultsStore.getOnboarding().ableToVoteBasedOnCurentTime() + let inputDay = UserDefaultsStore.getOnboarding().inputDay + + var date: Date? + + switch (latestVoteUnLocked, inputDay) { + case (true, .Previous): + date = Calendar.current.date(byAdding: .day, value: -1, to: Date())! + case (true, .Today): + date = Date() + case (false, .Previous): + date = Calendar.current.date(byAdding: .day, value: -2, to: Date())! + case (false, .Today): + date = Calendar.current.date(byAdding: .day, value: -1, to: Date())! + } + if let date = date { + addItemHeaderClosure(mood, date) } } } diff --git a/Shared/views/EmptyView.swift b/Shared/views/EmptyView.swift index ea502cd..7ddcbd3 100644 --- a/Shared/views/EmptyView.swift +++ b/Shared/views/EmptyView.swift @@ -30,7 +30,7 @@ struct EmptyContentView: View { withAnimation { viewModel.add(mood: mood, forDate: date, entryType: .header) } - }, overrideDay: viewModel.shouldShowVotingHeader() ? .Today : .Previous) + }) } } .fixedSize(horizontal: false, vertical: true)