Fix boundary bugs, route side effects through MoodLogger, add data listeners

- Fix ExtensionDataProvider <= boundary to < in date queries (prevented cross-day leaks)
- Replace force-unwraps with guards and add error logging in DataControllerGET and ExtensionDataProvider
- Route DayViewViewModel update/delete through MoodLogger.shared (was duplicating side effects)
- Add data listeners to InsightsViewModel and YearViewModel for cross-tab refresh
- Add HealthKitManager.deleteMood(for:) for single-date cleanup
- Add SharedModelContainer.isUsingInMemoryFallback flag with critical logging
- Add analytics events: entryDeleted, allDataCleared, duplicatesRemoved, storageFallbackActivated

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-14 23:34:09 -06:00
parent 0e8738794b
commit 7c142568be
8 changed files with 157 additions and 39 deletions

View File

@@ -377,6 +377,9 @@ extension AnalyticsManager {
case photoAdded
case photoDeleted
case missingEntriesFilled(count: Int)
case entryDeleted(mood: Int)
case allDataCleared
case duplicatesRemoved(count: Int)
// MARK: Customization
case themeChanged(themeId: String)
@@ -448,6 +451,9 @@ extension AnalyticsManager {
// MARK: Sharing
case shareTemplateViewed(template: String)
// MARK: Error
case storageFallbackActivated
// MARK: Legal
case eulaViewed
case privacyPolicyViewed
@@ -468,6 +474,12 @@ extension AnalyticsManager {
return ("photo_deleted", nil)
case .missingEntriesFilled(let count):
return ("missing_entries_filled", ["count": count])
case .entryDeleted(let mood):
return ("entry_deleted", ["mood": mood])
case .allDataCleared:
return ("all_data_cleared", nil)
case .duplicatesRemoved(let count):
return ("duplicates_removed", ["count": count])
// Customization
case .themeChanged(let id):
@@ -591,6 +603,10 @@ extension AnalyticsManager {
case .shareTemplateViewed(let template):
return ("share_template_viewed", ["template": template])
// Error
case .storageFallbackActivated:
return ("storage_fallback_activated", nil)
// Legal
case .eulaViewed:
return ("eula_viewed", nil)