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:
alexandrev-tibco
2026-07-12 17:47:41 +02:00
parent a5c304e209
commit ce88d7b265
14 changed files with 513 additions and 1 deletions
@@ -384,3 +384,16 @@
/* Offer codes + share link (1.2.0) */
"premium_redeem_code" = "Canjear código promocional";
"share_link_text" = "Nuestra semana, planificada con MealMood → https://mealmood.app";
// Shopping list (2.0)
"shopping_list_title" = "Lista de la compra";
"shopping_done" = "Hecho";
"shopping_missing_ingredients" = "Aún sin ingredientes";
"shopping_other_items" = "Otros artículos";
"shopping_add_item_placeholder" = "Añadir artículo…";
"shopping_generate" = "Generar";
"shopping_clear_checked" = "Borrar los marcados";
"shopping_delete" = "Eliminar";
"shopping_empty_title" = "Nada que comprar todavía";
"shopping_empty_message" = "Planifica platos para esta semana y sus ingredientes aparecerán aquí.";
"shopping_share_header" = "🛒 Lista de la compra — MealMood";