Widget Extension Fixes: - Create standalone WidgetDataProvider for widget data isolation - Add WIDGET_EXTENSION compiler flag for conditional compilation - Fix DataController references in widget-shared files - Sync widget version numbers with main app (23, 1.0.2) - Add WidgetBackground color to asset catalog Warning Resolutions: - Fix UIScreen.main deprecation in BGView and SharingListView - Fix Text '+' concatenation deprecation in PurchaseButtonView and SettingsTabView - Fix exhaustive switch in BiometricAuthManager (add .none case) - Fix var to let in ExportService (3 instances) - Fix unused result warning in NoteEditorView - Fix ForEach duplicate ID warnings in MonthView and YearView Code Quality Improvements: - Wrap bypassSubscription in #if DEBUG for security - Rename StupidAssCustomWidgetObservableObject to CustomWidgetStateViewModel - Add @MainActor to IconViewModel - Replace fatalError with graceful fallback in SharedModelContainer - Add [weak self] to closures in DayViewViewModel - Add OSLog-based AppLogger for production logging - Add ImageCache with NSCache for memory efficiency - Add AccessibilityHelpers with Reduce Motion support - Create DataControllerProtocol for dependency injection - Update .gitignore with secrets exclusions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
116 lines
4.5 KiB
Swift
116 lines
4.5 KiB
Swift
//
|
|
// ShowBasedOnVoteLogics.swift
|
|
// Feels (iOS)
|
|
//
|
|
// Created by Trey Tartt on 2/17/22.
|
|
//
|
|
|
|
import SwiftUI
|
|
import SwiftData
|
|
|
|
|
|
/*
|
|
current day 3/5/22
|
|
|
|
..... before time | after time .....
|
|
|
|
day option = .today
|
|
-------
|
|
voting for 3/4 | voting for 3/5
|
|
------------------------*-------------------------
|
|
db should contain 3/3 | db should contain 3/4
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
day option = .yesterday
|
|
--------
|
|
voting for 3/3 | voting for 3/4
|
|
------------------------*-------------------------
|
|
db should contain 3/2 | db should contain 3/3
|
|
|
|
*/
|
|
@MainActor
|
|
class ShowBasedOnVoteLogics {
|
|
static private func returnCurrentVoteStatus(onboardingData: OnboardingData) -> (passedTimeToVote: Bool, inputDay: DayOptions) {
|
|
let passedTimeToVote = ShowBasedOnVoteLogics.passedTodaysVotingUnlock(voteDate: onboardingData.date)
|
|
let inputDay: DayOptions = onboardingData.inputDay
|
|
|
|
return (passedTimeToVote, inputDay)
|
|
}
|
|
|
|
static public func passedTodaysVotingUnlock(voteDate: Date) -> Bool {
|
|
let currentDateComp = Calendar.current.dateComponents([.hour, .minute], from: Date())
|
|
let savedDateComp = Calendar.current.dateComponents([.hour, .minute], from: voteDate)
|
|
|
|
if let currentHour = currentDateComp.hour,
|
|
let currentMin = currentDateComp.minute,
|
|
let savedHour = savedDateComp.hour,
|
|
let savedMin = savedDateComp.minute {
|
|
|
|
if currentHour > savedHour {
|
|
return true
|
|
}
|
|
|
|
if currentHour == savedHour {
|
|
return currentMin >= savedMin
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
static public func isMissingCurrentVote(onboardingData: OnboardingData) -> Bool {
|
|
let startDate = ShowBasedOnVoteLogics.getCurrentVotingDate(onboardingData: onboardingData).startOfDay
|
|
#if WIDGET_EXTENSION
|
|
let entry = WidgetDataProvider.shared.getEntry(byDate: startDate)
|
|
#else
|
|
let entry = DataController.shared.getEntry(byDate: startDate)
|
|
#endif
|
|
return entry == nil || entry?.mood == .missing
|
|
}
|
|
|
|
static public func getCurrentVotingDate(onboardingData: OnboardingData) -> Date {
|
|
var date: Date?
|
|
let currentVoteStatus = ShowBasedOnVoteLogics.returnCurrentVoteStatus(onboardingData: onboardingData)
|
|
// note to future self, this should account for midnight until next voting unlock
|
|
// the vote at 12:03 am will not be passed time, and will be for yesterday
|
|
switch (currentVoteStatus.passedTimeToVote, currentVoteStatus.inputDay) {
|
|
case (false, .Today):
|
|
// if we're passed time to vote and the voting type is previous - last vote should be -1
|
|
date = Calendar.current.date(byAdding: .day, value: -1, to: Date())
|
|
case (true, .Today):
|
|
// if we're passed time to vote and the voting type is previous - last vote should be today
|
|
date = Date()
|
|
|
|
case (false, .Previous):
|
|
// if we're passed time to vote and the voting type is previous - last vote should be -2
|
|
date = Calendar.current.date(byAdding: .day, value: -2, to: Date())
|
|
case (true, .Previous):
|
|
// if we're passed time to vote and the voting type is previous - last vote should be -1
|
|
date = Calendar.current.date(byAdding: .day, value: -1, to: Date())
|
|
}
|
|
|
|
guard let date = date else {
|
|
fatalError("missing getCurrentVotingDate")
|
|
}
|
|
|
|
return date
|
|
}
|
|
|
|
static public func getVotingTitle(onboardingData: OnboardingData) -> String {
|
|
let currentVoteStatus = ShowBasedOnVoteLogics.returnCurrentVoteStatus(onboardingData: onboardingData)
|
|
switch (currentVoteStatus.passedTimeToVote, currentVoteStatus.inputDay) {
|
|
case (false, .Today):
|
|
return String(localized: "add_mood_header_view_title_yesterday")
|
|
case (true, .Today):
|
|
return String(localized: "add_mood_header_view_title_today")
|
|
|
|
case (false, .Previous):
|
|
let date = Calendar.current.date(byAdding: .day, value: -2, to: Date())!
|
|
return String(format: String(localized: "add_mood_header_view_title"), Random.weekdayName(fromDate: date))
|
|
case (true, .Previous):
|
|
return String(localized: "add_mood_header_view_title_yesterday")
|
|
}
|
|
}
|
|
}
|