Files
FamilyMealPlanner/MealMood/Services/AnalyticsService.swift
T
alexandrev-tibco 6c7e12b41f 1.0.4: Smarter auto-assign, quick dish entry, calendar fix, frictionless onboarding
- AutocompleteEngine: no-repeat rule now applies to all dishes (not just tagless ones); fallback still allows repeats when no alternative exists
- CalendarService: update existing events instead of delete+create to prevent duplicates; fix weekStartDate using plan date instead of currentWeekStart
- DishFormView: form stays open after saving in create mode for quick multi-dish entry; Done button to close; saved feedback banner
- OnboardingViewModel/FirstDishesStepView: dishes are now optional during onboarding; Finish button always enabled
- AnalyticsService: new events — onboarding_step_viewed(step) and auto_assign_used(filled, unfilled)
- Localization: dish_done and first_dishes_optional_hint added in 6 languages; release notes updated in all 6 languages
- Version bump: 1.0.3 → 1.0.4 (build 19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 11:35:50 +02:00

107 lines
3.1 KiB
Swift

import FirebaseAnalytics
enum AnalyticsEvent {
// Onboarding
static let onboardingCompleted = "onboarding_completed"
// Dishes
static let dishAdded = "dish_added"
static let dishDeleted = "dish_deleted"
// Planner
static let mealAssigned = "meal_assigned"
static let mealCleared = "meal_cleared"
static let weekReset = "week_reset"
static let weekPlanShared = "week_plan_shared"
// Premium
static let premiumUpgradeTapped = "premium_upgrade_tapped"
static let premiumPurchased = "premium_purchased"
static let premiumRestored = "premium_restored"
// Planner
static let autoAssignUsed = "auto_assign_used"
// Onboarding
static let onboardingStepViewed = "onboarding_step_viewed"
// Settings
static let iCloudSyncToggled = "icloud_sync_toggled"
static let notificationsToggled = "notifications_toggled"
static let languageChanged = "language_changed"
}
enum AnalyticsService {
static func logEvent(_ name: String, parameters: [String: Any]? = nil) {
Analytics.logEvent(name, parameters: parameters)
}
static func logScreenView(_ screenName: String) {
Analytics.logEvent(AnalyticsEventScreenView, parameters: [
AnalyticsParameterScreenName: screenName,
AnalyticsParameterScreenClass: screenName
])
}
// MARK: - Convenience methods
static func logDishAdded(tagCount: Int) {
logEvent(AnalyticsEvent.dishAdded, parameters: ["tag_count": tagCount])
}
static func logDishDeleted() {
logEvent(AnalyticsEvent.dishDeleted)
}
static func logMealAssigned() {
logEvent(AnalyticsEvent.mealAssigned)
}
static func logMealCleared() {
logEvent(AnalyticsEvent.mealCleared)
}
static func logWeekReset() {
logEvent(AnalyticsEvent.weekReset)
}
static func logWeekPlanShared(format: String) {
logEvent(AnalyticsEvent.weekPlanShared, parameters: ["format": format])
}
static func logPremiumUpgradeTapped(source: String) {
logEvent(AnalyticsEvent.premiumUpgradeTapped, parameters: ["source": source])
}
static func logPremiumPurchased() {
logEvent(AnalyticsEvent.premiumPurchased)
}
static func logPremiumRestored() {
logEvent(AnalyticsEvent.premiumRestored)
}
static func logOnboardingCompleted() {
logEvent(AnalyticsEvent.onboardingCompleted)
}
static func logOnboardingStepViewed(step: Int) {
logEvent(AnalyticsEvent.onboardingStepViewed, parameters: ["step": step])
}
static func logAutoAssignUsed(filledSlots: Int, unfilledSlots: Int) {
logEvent(AnalyticsEvent.autoAssignUsed, parameters: [
"filled_slots": filledSlots,
"unfilled_slots": unfilledSlots
])
}
static func logICloudSyncToggled(enabled: Bool) {
logEvent(AnalyticsEvent.iCloudSyncToggled, parameters: ["enabled": enabled])
}
static func logNotificationsToggled(enabled: Bool) {
logEvent(AnalyticsEvent.notificationsToggled, parameters: ["enabled": enabled])
}
}