Consolidate extension data providers and add side effects catch-up

- Create unified ExtensionDataProvider for Widget and Watch targets
- Remove duplicate WatchDataProvider and WatchConnectivityManager from Watch App
- Add side effects catch-up mechanism in MoodLogger for widget votes
- Process pending side effects on app launch and midnight background task
- Reduce ~450 lines of duplicated code across targets

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-21 22:50:23 -06:00
parent 83aad66f26
commit f7da61d6ca
12 changed files with 306 additions and 530 deletions

View File

@@ -4,50 +4,13 @@
//
// Interactive widget for mood voting (iOS 17+)
//
// Note: VoteMoodIntent is defined in Shared/SharedMoodIntent.swift
//
import WidgetKit
import SwiftUI
import AppIntents
// MARK: - App Intent for Mood Voting
struct VoteMoodIntent: AppIntent {
static var title: LocalizedStringResource = "Vote Mood"
static var description = IntentDescription("Record your mood for today")
// Run directly in widget extension for immediate feedback
static var openAppWhenRun: Bool = false
@Parameter(title: "Mood")
var moodValue: Int
init() {
self.moodValue = 2
}
init(mood: Mood) {
self.moodValue = mood.rawValue
}
@MainActor
func perform() async throws -> some IntentResult {
let mood = Mood(rawValue: moodValue) ?? .average
let votingDate = ShowBasedOnVoteLogics.getCurrentVotingDate(onboardingData: UserDefaultsStore.getOnboarding())
// Save mood via WidgetDataProvider (uses shared App Group container)
WidgetDataProvider.shared.add(mood: mood, forDate: votingDate, entryType: .widget)
// Store last voted date
let dateString = ISO8601DateFormatter().string(from: Calendar.current.startOfDay(for: votingDate))
GroupUserDefaults.groupDefaults.set(dateString, forKey: UserDefaultsStore.Keys.lastVotedDate.rawValue)
// Reload all widget timelines to show updated state
WidgetCenter.shared.reloadAllTimelines()
return .result()
}
}
// MARK: - Vote Widget Provider
struct VoteWidgetProvider: TimelineProvider {