feat: implement Iteration 4 — menu planning, shopping list, diary
Backend: - Migrations 007 (menu_plans, menu_items, shopping_lists) and 008 (meal_diary) - gemini/menu.go: GenerateMenu — 7-day × 3-meal plan via one Groq call - internal/menu: model, repository (GetByWeek, SaveMenuInTx, shopping list CRUD), handler (GET/PUT/DELETE /menu, POST /ai/generate-menu, shopping list endpoints) - internal/diary: model, repository, handler (GET/POST/DELETE /diary) - Increase server WriteTimeout to 120s for long AI calls - api_client.go: add patch() and postList() helpers Flutter: - shared/models: menu.dart, shopping_item.dart, diary_entry.dart - features/menu: menu_service.dart, menu_provider.dart (MenuNotifier, ShoppingListNotifier, DiaryNotifier with family) - MenuScreen: 7-day view, week nav, skeleton on generation, generate FAB with confirmation dialog - ShoppingListScreen: items by category, optimistic checkbox toggle - DiaryScreen: daily entries with swipe-to-delete, add-entry sheet - Router: /menu/shopping-list and /menu/diary routes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -12,7 +12,9 @@ import '../../features/scan/scan_screen.dart';
|
||||
import '../../features/scan/recognition_confirm_screen.dart';
|
||||
import '../../features/scan/dish_result_screen.dart';
|
||||
import '../../features/scan/recognition_service.dart';
|
||||
import '../../features/menu/diary_screen.dart';
|
||||
import '../../features/menu/menu_screen.dart';
|
||||
import '../../features/menu/shopping_list_screen.dart';
|
||||
import '../../features/recipes/recipe_detail_screen.dart';
|
||||
import '../../features/recipes/recipes_screen.dart';
|
||||
import '../../features/profile/profile_screen.dart';
|
||||
@@ -62,6 +64,22 @@ final routerProvider = Provider<GoRouter>((ref) {
|
||||
path: '/products/add',
|
||||
builder: (_, __) => const AddProductScreen(),
|
||||
),
|
||||
// Shopping list — full-screen, no bottom nav.
|
||||
GoRoute(
|
||||
path: '/menu/shopping-list',
|
||||
builder: (context, state) {
|
||||
final week = state.extra as String? ?? '';
|
||||
return ShoppingListScreen(week: week);
|
||||
},
|
||||
),
|
||||
// Diary — full-screen, no bottom nav.
|
||||
GoRoute(
|
||||
path: '/menu/diary',
|
||||
builder: (context, state) {
|
||||
final date = state.extra as String? ?? '';
|
||||
return DiaryScreen(date: date);
|
||||
},
|
||||
),
|
||||
// Scan / recognition flow — all without bottom nav.
|
||||
GoRoute(
|
||||
path: '/scan',
|
||||
|
||||
Reference in New Issue
Block a user