2.0: weekly shopping list from planned dishes
- ShoppingItem model (per-week lines; dish-derived or free-text) + schema. - ShoppingListService.reconcile mirrors planned dishes' ingredients into the list, preserving check-off state and user items; plain-text export helper. - ShoppingListView: grouped by dish, check-off, swipe-delete, free-text adds, clear-checked, ShareLink export, and inline on-device "Generate" for planned dishes without ingredients (paywall after 3 free generations, source=ingredient_generation). - Home toolbar: cart entry point (all users) + sheet. - Analytics: shopping_list_opened, shopping_item_added, ingredients_generated. - Localized in all 6 languages. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BkanrydYtrme8wipTzWssG
This commit is contained in:
@@ -23,6 +23,11 @@ enum AnalyticsEvent {
|
||||
static let autoAssignUsed = "auto_assign_used"
|
||||
static let weekCopiedPrevious = "week_copied_previous"
|
||||
|
||||
// Shopping list (2.0)
|
||||
static let shoppingListOpened = "shopping_list_opened"
|
||||
static let shoppingItemAdded = "shopping_item_added"
|
||||
static let ingredientsGenerated = "ingredients_generated"
|
||||
|
||||
// Onboarding
|
||||
static let onboardingStepViewed = "onboarding_step_viewed"
|
||||
|
||||
@@ -120,6 +125,24 @@ enum AnalyticsService {
|
||||
])
|
||||
}
|
||||
|
||||
static func logShoppingListOpened(itemCount: Int, missingDishes: Int) {
|
||||
logEvent(AnalyticsEvent.shoppingListOpened, parameters: [
|
||||
"item_count": itemCount,
|
||||
"missing_dishes": missingDishes
|
||||
])
|
||||
}
|
||||
|
||||
static func logShoppingItemAdded() {
|
||||
logEvent(AnalyticsEvent.shoppingItemAdded)
|
||||
}
|
||||
|
||||
static func logIngredientsGenerated(lineCount: Int, source: String) {
|
||||
logEvent(AnalyticsEvent.ingredientsGenerated, parameters: [
|
||||
"line_count": lineCount,
|
||||
"source": source
|
||||
])
|
||||
}
|
||||
|
||||
static func logICloudSyncToggled(enabled: Bool) {
|
||||
logEvent(AnalyticsEvent.iCloudSyncToggled, parameters: ["enabled": enabled])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user