110807d239
- Eating out: tap any empty slot → "Mark as eating out"; shows teal indicator, skipped by auto-assign, counts as complete, tap again to unmark - Rule violations panel: access via wand long-press context menu when conflicts exist; shows all isRuleOverridden slots with Fix (clear) or Ignore (acknowledge) actions - Firebase Crashlytics integrated: CrashlyticsService + dSYM upload build phase, isPremium property tracked per session - PremiumSyncService: extracted premium state machine, StoreKit Transaction.updates listener, isPremium no longer synced via iCloud to avoid stale state - StoreManager: analytics on purchase/restore, bundle ID fallback for product ID lookup - Search bar contrast bug fixed: TextField now has explicit foreground color for dark mode - WelcomeStepView: redesigned onboarding welcome screen with week preview - Version bump: 1.0.5 build 22 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
37 lines
846 B
Swift
37 lines
846 B
Swift
import SwiftUI
|
|
import SwiftData
|
|
import FirebaseCore
|
|
import FirebaseCrashlytics
|
|
#if canImport(GoogleMobileAds)
|
|
import GoogleMobileAds
|
|
#endif
|
|
|
|
@main
|
|
struct MealMoodApp: App {
|
|
private let modelContainer: ModelContainer = {
|
|
let schema = Schema([
|
|
AppSettings.self,
|
|
Tag.self,
|
|
Dish.self,
|
|
WeekPlan.self,
|
|
MealSlot.self
|
|
])
|
|
let configuration = ModelConfiguration(cloudKitDatabase: .none)
|
|
return try! ModelContainer(for: schema, configurations: [configuration])
|
|
}()
|
|
|
|
init() {
|
|
FirebaseApp.configure()
|
|
#if canImport(GoogleMobileAds)
|
|
GADMobileAds.sharedInstance().start(completionHandler: nil)
|
|
#endif
|
|
}
|
|
|
|
var body: some Scene {
|
|
WindowGroup {
|
|
ContentView()
|
|
}
|
|
.modelContainer(modelContainer)
|
|
}
|
|
}
|