@@ -11,11 +11,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
1111import 'package:intl/intl.dart' ;
1212import 'package:flutter_hooks/flutter_hooks.dart' ;
1313import 'package:model/enums/meal.dart' ;
14- import 'package:model/menu.dart' ;
14+ import 'package:model/daily_menu.dart' ;
15+ import 'package:common/date.dart' ;
16+ import 'package:common/log.dart' ;
1517import 'package:model/recipe.dart' ;
1618import 'package:common/utils.dart' ;
1719import 'package:collection/collection.dart' ;
1820import 'package:weekly_menu_app/providers/user_preferences.dart' ;
21+ import 'package:flutter_data/flutter_data.dart' hide Repository;
1922
2023import '../../shared/flutter_data_state_builder.dart' ;
2124import '../recipe_screen/screen.dart' ;
@@ -31,6 +34,29 @@ final _appBarMonthParser = DateFormat('MMM');
3134final _dragOriginDailyMenuNotifierProvider =
3235 StateProvider <DailyMenuNotifier ?>((_) => null );
3336
37+ class DailyMenuSectionStreamWrapper extends HookConsumerWidget {
38+ final Date date;
39+ const DailyMenuSectionStreamWrapper (this .date, {Key ? key}) : super (key: key);
40+
41+ @override
42+ Widget build (BuildContext context, WidgetRef ref) {
43+ return RepositoryStreamBuilder <DailyMenu >(
44+ stream: ref.dailyMenu.streamOne (date.formatId ()),
45+ errorBuilder: (context, error) {
46+ if (error != null &&
47+ error is DataException &&
48+ error.statusCode == 404 ) {
49+ return DailyMenuSection (
50+ DailyMenuNotifier (DailyMenu .empty (date), ref.dailyMenu));
51+ }
52+ },
53+ builder: (ctx, dailyMenu) {
54+ return DailyMenuSection (DailyMenuNotifier (dailyMenu, ref.dailyMenu));
55+ },
56+ );
57+ }
58+ }
59+
3460class DailyMenuSection extends HookConsumerWidget {
3561 final DailyMenuNotifier dailyMenuNotifier;
3662 final void Function ()? onTap;
@@ -42,7 +68,7 @@ class DailyMenuSection extends HookConsumerWidget {
4268
4369 @override
4470 Widget build (BuildContext context, WidgetRef ref) {
45- log ('build day: ${dailyMenuNotifier .dailyMenu .day } : ${dailyMenuNotifier .dailyMenu }' );
71+ log ('build day: ${dailyMenuNotifier .dailyMenu .date } : ${dailyMenuNotifier .dailyMenu }' );
4672
4773 final padding = const EdgeInsets .fromLTRB (10 , 5 , 0 , 0 );
4874
@@ -55,31 +81,21 @@ class DailyMenuSection extends HookConsumerWidget {
5581 final displayEnterNewRecipeCard = useState (false );
5682
5783 final draggingOverThisWidget = ref.watch (pointerOverWidgetIndexStateProvider
58- .select ((v) => v == dailyMenuNotifier.dailyMenu.day ));
84+ .select ((v) => v == dailyMenuNotifier.dailyMenu.date ));
5985
60- Widget buildMenuContainer (Meal meal, Menu ? menu ,
86+ Widget buildMenuContainer (Meal meal, List < String > recipeIds ,
6187 {bool displayPlaceholder = false }) {
6288 return _MenuContainer (
6389 meal,
6490 key: ValueKey ('$meal ' ),
65- menu : menu ,
91+ recipeIds : recipeIds ,
6692 dailyMenuNotifier: dailyMenuNotifier,
6793 displayRecipePlaceholder: displayPlaceholder,
6894 );
6995 }
7096
71- Future <void > addRecipeToMeal (Meal meal, Recipe recipe) async {
72- if (dailyMenuNotifier.dailyMenu.getMenuByMeal (meal) == null ) {
73- final recipeId = recipe.idx;
74- final menu = Menu (
75- date: dailyMenuNotifier.dailyMenu.day,
76- recipes: [recipeId],
77- meal: meal,
78- );
79- await dailyMenuNotifier.addMenu (menu);
80- } else {
81- await dailyMenuNotifier.addRecipeToMeal (meal, recipe);
82- }
97+ Future <void > addRecipeToMeal (Meal meal, String recipeId) async {
98+ await dailyMenuNotifier.addRecipeToMeal (meal, recipeId);
8399 }
84100
85101 Future <void > addNewRecipeToMeal (Meal meal, String recipeName) async {
@@ -89,7 +105,7 @@ class DailyMenuSection extends HookConsumerWidget {
89105 Recipe recipe = await ref.recipes.save (
90106 Recipe (name: recipeName.trim (), language: language),
91107 params: {UPDATE_PARAM : false });
92- await addRecipeToMeal (meal, recipe);
108+ await addRecipeToMeal (meal, recipe.idx );
93109 } else {
94110 print ("can't create a recipe with empty name" );
95111 }
@@ -104,7 +120,7 @@ class DailyMenuSection extends HookConsumerWidget {
104120 if (recipe == null ) {
105121 await addNewRecipeToMeal (meal, recipeName);
106122 } else {
107- await addRecipeToMeal (meal, recipe);
123+ await addRecipeToMeal (meal, recipe.idx );
108124 }
109125 }
110126
@@ -126,9 +142,9 @@ class DailyMenuSection extends HookConsumerWidget {
126142 },
127143 ),
128144 ...Meal .values.map ((m) {
129- final menu = dailyMenuNotifier.dailyMenu.getMenuByMeal (m);
145+ final recipeIds = dailyMenuNotifier.dailyMenu.getRecipesByMeal (m);
130146
131- return buildMenuContainer (m, menu ,
147+ return buildMenuContainer (m, recipeIds ,
132148 displayPlaceholder: draggingOverThisWidget);
133149 }).toList ()
134150 ],
@@ -191,8 +207,8 @@ class _DailyMenuSectionTitle extends HookConsumerWidget {
191207 softWrap: false ,
192208 textAlign: TextAlign .start,
193209 text: TextSpan (
194- text:
195- dailyMenuNotifier.dailyMenu.day. format (_appBarDateParser) + ' ' ,
210+ text: dailyMenuNotifier.dailyMenu.date. format (_appBarDateParser) +
211+ ' ' ,
196212 style: GoogleFonts .b612Mono ().copyWith (
197213 fontSize: 16 ,
198214 fontWeight: FontWeight .w700,
@@ -204,7 +220,7 @@ class _DailyMenuSectionTitle extends HookConsumerWidget {
204220 children: < TextSpan > [
205221 TextSpan (
206222 text:
207- dailyMenuNotifier.dailyMenu.day .format (_appBarMonthParser),
223+ dailyMenuNotifier.dailyMenu.date .format (_appBarMonthParser),
208224 style: GoogleFonts .b612Mono ().copyWith (
209225 fontSize: 13 ,
210226 fontWeight: FontWeight .w200,
@@ -284,28 +300,25 @@ class _MealRecipeCardContainer extends HookConsumerWidget {
284300
285301class _MenuContainer extends HookConsumerWidget {
286302 final Meal meal;
287- final Menu ? menu ;
303+ final List < String > recipeIds ;
288304 final DailyMenuNotifier dailyMenuNotifier;
289305 final bool displayRecipePlaceholder;
290306
291307 _MenuContainer (
292308 this .meal, {
293309 Key ? key,
294- this .menu ,
310+ this .recipeIds = const [] ,
295311 required this .dailyMenuNotifier,
296312 this .displayRecipePlaceholder = false ,
297- }) : assert (menu == null || meal == menu.meal),
298- super (key: key);
313+ }) : super (key: key);
299314
300315 @override
301316 Widget build (BuildContext context, WidgetRef ref) {
302- final recipeIds = menu? .recipes ?? [];
303-
304317 final isDragging = ref.read (isDraggingMenuStateProvider);
305318
306319 Widget buildDragTargetPlaceholder ({bool displayLeadingMealIcon = false }) {
307320 return _MenuRecipeDragTarget (
308- menu : menu ,
321+ recipeIds : recipeIds ,
309322 meal: meal,
310323 dailyMenuNotifier: dailyMenuNotifier,
311324 child: Row (
@@ -353,7 +366,8 @@ class _MenuContainer extends HookConsumerWidget {
353366 )
354367 .toList (),
355368 if (isDragging && displayRecipePlaceholder)
356- buildDragTargetPlaceholder (displayLeadingMealIcon: menu == null ),
369+ buildDragTargetPlaceholder (
370+ displayLeadingMealIcon: dailyMenuNotifier.dailyMenu.isEmpty),
357371 if (recipeIds.isNotEmpty) SizedBox (height: 20 ),
358372 ],
359373 );
@@ -363,17 +377,17 @@ class _MenuContainer extends HookConsumerWidget {
363377class _MenuRecipeDragTarget extends HookConsumerWidget {
364378 final Widget child;
365379 final DailyMenuNotifier dailyMenuNotifier;
366- final Menu ? menu ;
367- final Meal ? meal;
380+ final List < String > recipeIds ;
381+ final Meal meal;
368382
369383 final void Function ()? onEnter;
370384 final void Function ()? onLeave;
371385
372386 _MenuRecipeDragTarget ({
373387 required this .child,
374388 required this .dailyMenuNotifier,
375- this .menu ,
376- this .meal ,
389+ required this .meal ,
390+ this .recipeIds = const [] ,
377391 this .onEnter,
378392 this .onLeave,
379393 Key ? key,
@@ -383,18 +397,14 @@ class _MenuRecipeDragTarget extends HookConsumerWidget {
383397 Widget build (BuildContext context, WidgetRef ref) {
384398 final dailyMenu = dailyMenuNotifier.dailyMenu;
385399
386- final meal = menu? .meal ?? this .meal! ;
387-
388400 final originalDailyMenuNotifier =
389401 ref.watch (_dragOriginDailyMenuNotifierProvider);
390402
391403 return DragTarget <MealRecipe >(
392404 hitTestBehavior: HitTestBehavior .deferToChild,
393405 onWillAccept: (mealRecipe) {
394- final menu = dailyMenu.getMenuByMeal (meal);
395- final ret =
396- (menu? .recipes.contains (mealRecipe? .recipe.idx) ?? false ) ==
397- false ;
406+ final recipes = dailyMenu.getRecipesByMeal (meal);
407+ final ret = (recipes.contains (mealRecipe? .recipe.idx)) == false ;
398408 print ('on will accept: $ret ' );
399409 onEnter? .call ();
400410 return ret;
@@ -405,21 +415,11 @@ class _MenuRecipeDragTarget extends HookConsumerWidget {
405415 onAccept: (mealRecipe) {
406416 print ('onAccept - $mealRecipe ' );
407417
408- final recipeIds = [mealRecipe.recipe.idx];
409-
410- final destinationMenu = dailyMenu.getMenuByMeal (meal);
411- if (destinationMenu == null ) {
412- final menu =
413- Menu (date: dailyMenu.day, meal: meal, recipes: recipeIds);
414- dailyMenuNotifier.addMenu (menu);
415- } else {
416- final newMenu = destinationMenu
417- .copyWith (recipes: [...destinationMenu.recipes, ...recipeIds]);
418- dailyMenuNotifier.updateMenu (newMenu);
419- }
418+ dailyMenuNotifier.addRecipeToMeal (
419+ mealRecipe.meal, mealRecipe.recipe.idx);
420420
421- originalDailyMenuNotifier? .removeRecipesFromMeal (
422- mealRecipe.meal, recipeIds );
421+ originalDailyMenuNotifier? .removeRecipeFromMeal (
422+ mealRecipe.meal, mealRecipe.recipe.idx );
423423
424424 ref.read (_dragOriginDailyMenuNotifierProvider.notifier).state = null ;
425425 },
@@ -551,11 +551,12 @@ class _MenuRecipeCard extends HookConsumerWidget {
551551 Recipe (name: recipeName.trim (), language: language),
552552 params: {UPDATE_PARAM : false });
553553 } else {
554- print ("can't create a recipe with empty name" );
554+ logWarn ("can't create a recipe with empty name" );
555+ return ;
555556 }
556557 }
557- await dailyMenuNotifier.replaceRecipeInMeal (meal,
558- oldRecipeId : this .recipe.idx, newRecipeId : recipe! .idx);
558+ await dailyMenuNotifier.replaceRecipeInMeal (
559+ meal, this .recipe.idx, recipe.idx);
559560 }
560561 }
561562
0 commit comments