Skip to content

Commit 5b79ef0

Browse files
committed
drop menu in favor of daily menu
1 parent cfd1702 commit 5b79ef0

File tree

23 files changed

+588
-809
lines changed

23 files changed

+588
-809
lines changed

apps/weekly_menu_app/ios/Podfile.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ PODS:
99
- Firebase/RemoteConfig (10.22.0):
1010
- Firebase/CoreOnly
1111
- FirebaseRemoteConfig (~> 10.22.0)
12-
- firebase_analytics (10.10.1):
12+
- firebase_analytics (10.8.9):
1313
- Firebase/Analytics (= 10.22.0)
1414
- firebase_core
1515
- Flutter
16-
- firebase_core (2.29.0):
16+
- firebase_core (2.27.0):
1717
- Firebase/CoreOnly (= 10.22.0)
1818
- Flutter
19-
- firebase_remote_config (4.4.1):
19+
- firebase_remote_config (4.3.17):
2020
- Firebase/RemoteConfig (= 10.22.0)
2121
- firebase_core
2222
- Flutter
@@ -176,17 +176,17 @@ EXTERNAL SOURCES:
176176

177177
SPEC CHECKSUMS:
178178
Firebase: 797fd7297b7e1be954432743a0b3f90038e45a71
179-
firebase_analytics: 8e6cecb9b9541db49ac40a46eec7c0f519de7252
180-
firebase_core: aaadbddb3cb2ee3792b9804f9dbb63e5f6f7b55c
181-
firebase_remote_config: 13cdfde7862e4cee3b9e97cf3f9e2f1ea2b98c8e
179+
firebase_analytics: b9ce200bfc2c54629076bb22d6a510f31c296ab8
180+
firebase_core: 100945864b4aedce3cfef0c62ab864858bf013cf
181+
firebase_remote_config: 5ebb1bf2503404f6b24e64f117dc6c22c0498d4c
182182
FirebaseABTesting: 4431c2c56ac6e56f463b9cab05cc111078639f99
183183
FirebaseAnalytics: 8d0ff929c63b7f72260f332b86ccf569776b75d3
184184
FirebaseCore: 0326ec9b05fbed8f8716cddbf0e36894a13837f7
185185
FirebaseCoreInternal: bcb5acffd4ea05e12a783ecf835f2210ce3dc6af
186186
FirebaseInstallations: 8f581fca6478a50705d2bd2abd66d306e0f5736e
187187
FirebaseRemoteConfig: e1b992a94d3674dddbcaf5d0d31a0312156ceb1c
188188
FirebaseSharedSwift: 76e1529c32101d80e4f1ca2fba7c39d59f0a390a
189-
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
189+
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
190190
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
191191
GoogleAppMeasurement: ccefe3eac9b0aa27f96066809fb1a7fe4b462626
192192
GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152
@@ -195,7 +195,7 @@ SPEC CHECKSUMS:
195195
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
196196
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
197197
sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
198-
url_launcher_ios: 6116280ddcfe98ab8820085d8d76ae7449447586
198+
url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
199199

200200
PODFILE CHECKSUM: cc1f88378b4bfcf93a6ce00d2c587857c6008d3b
201201

apps/weekly_menu_app/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
97C146E61CF9000F007C117D /* Project object */ = {
168168
isa = PBXProject;
169169
attributes = {
170-
LastUpgradeCheck = 1510;
170+
LastUpgradeCheck = 1430;
171171
ORGANIZATIONNAME = "The Chromium Authors";
172172
TargetAttributes = {
173173
97C146ED1CF9000F007C117D = {

apps/weekly_menu_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1510"
3+
LastUpgradeVersion = "1430"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

apps/weekly_menu_app/lib/widgets/screens/menu_page/daily_menu_section.dart

Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
1111
import 'package:intl/intl.dart';
1212
import 'package:flutter_hooks/flutter_hooks.dart';
1313
import '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';
1517
import 'package:model/recipe.dart';
1618
import 'package:common/utils.dart';
1719
import 'package:collection/collection.dart';
1820
import 'package:weekly_menu_app/providers/user_preferences.dart';
21+
import 'package:flutter_data/flutter_data.dart' hide Repository;
1922

2023
import '../../shared/flutter_data_state_builder.dart';
2124
import '../recipe_screen/screen.dart';
@@ -31,6 +34,29 @@ final _appBarMonthParser = DateFormat('MMM');
3134
final _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+
3460
class 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

285301
class _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 {
363377
class _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

Comments
 (0)