From e39638be7f598bda04c9c54a8b35e585ef7acc16 Mon Sep 17 00:00:00 2001 From: misha Date: Thu, 5 Mar 2026 13:44:33 +0300 Subject: [PATCH 1/4] feat(notifications): removed unknown notification from layoute --- .../presentation/widgets/notification_widget.dart | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/features/notifications/presentation/widgets/notification_widget.dart b/lib/features/notifications/presentation/widgets/notification_widget.dart index cdde4bbf..7f22f5e7 100644 --- a/lib/features/notifications/presentation/widgets/notification_widget.dart +++ b/lib/features/notifications/presentation/widgets/notification_widget.dart @@ -133,7 +133,7 @@ class NotificationWidget extends StatelessWidget { CommentComplaintNotification() => _CommentComplaintWidget(notification: notification as CommentComplaintNotification), CommentDeletedNotification() => _CommentDeletedWidget(notification: notification as CommentDeletedNotification), UserSubscribedNotification() => _UserSubscribedWidget(notification: notification as UserSubscribedNotification), - UnknownNotification() => _UnknownNotificationWidget(notification: notification as UnknownNotification), + UnknownNotification() => const SizedBox.shrink(), }; } } @@ -594,14 +594,6 @@ class _EntityCommentedWidget extends StatelessWidget { } } -class _UnknownNotificationWidget extends StatelessWidget { - const _UnknownNotificationWidget({required this.notification}); - final UnknownNotification notification; - @override - Widget build(BuildContext context) { - return _BaseNotificationWidget(isRead: false, notificationsText: 'Неизвестное уведомление', createdAt: DateTime.now(), onTap: null); - } -} // Новые виджеты для дополнительных типов уведомлений class _PlanSubscriptionExpiredWidget extends StatelessWidget { From 9d1bedff26f2f1d5d6e86be9bde08a1674aaa49b Mon Sep 17 00:00:00 2001 From: misha Date: Wed, 11 Mar 2026 11:55:10 +0300 Subject: [PATCH 2/4] feat(diary): fixed consultant portion comments and day finishing errors handling --- lib/core/app_router.dart | 2 +- lib/core/routing/auth_routes.dart | 5 +--- .../diary/presentation/bloc/diary_cubit.dart | 16 +++++++++---- .../presentation/pages/diary_screen.dart | 10 +++++--- .../comment_for_consultant_widget.dart | 23 +++++++++++++++++-- .../widgets/finish_day_button_widget.dart | 10 ++++++++ .../widgets/portion_comment_widget.dart | 17 ++++++++++---- 7 files changed, 64 insertions(+), 19 deletions(-) diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart index c98f7af2..4b778cbd 100644 --- a/lib/core/app_router.dart +++ b/lib/core/app_router.dart @@ -15,7 +15,7 @@ class AppRouter { static GlobalKey navigatorKey = GlobalKey(); // Домены для deep links (в т.ч. ссылки из пушей dev2.eatvio.com) - static const List _deepLinkHosts = ['eatvio.ru', 'www.eatvio.ru', 'dev2.eatvio.com', 'www.dev2.eatvio.com']; + static const List _deepLinkHosts = ['eatvio.ru', 'www.eatvio.ru']; static GoRouter appRouter = GoRouter( initialLocation: RouteConstants.updateScreen, diff --git a/lib/core/routing/auth_routes.dart b/lib/core/routing/auth_routes.dart index 772cd2eb..4d46e8de 100644 --- a/lib/core/routing/auth_routes.dart +++ b/lib/core/routing/auth_routes.dart @@ -10,17 +10,14 @@ import 'package:eatvio_app/features/registration/presentation/pages/verify_email import 'package:eatvio_app/features/registration_v2/presentation/pages/registration_v2_page.dart'; import 'package:go_router/go_router.dart'; -/// Маршруты для аутентификации class AuthRoutes { - /// Создание маршрутов аутентификации + static List createRoutes() { return [ GoRoute( path: RouteConstants.authScreen, name: 'authScreen', builder: (context, state) => const AuthScreen(), - // registerAnonymousPushToken вызывается в AuthCubit.initializeUser() - // и не должен блокировать навигацию routes: [ GoRoute(path: RouteConstants.registrationScreen, name: 'registrationScreen', builder: (context, state) => const RegistrationScreen()), GoRoute(path: RouteConstants.registrationScreenV2, name: 'registrationScreenV2', builder: (context, state) => const RegistrationV2Page()), diff --git a/lib/features/diary/presentation/bloc/diary_cubit.dart b/lib/features/diary/presentation/bloc/diary_cubit.dart index 93e24045..39a0a7e7 100644 --- a/lib/features/diary/presentation/bloc/diary_cubit.dart +++ b/lib/features/diary/presentation/bloc/diary_cubit.dart @@ -47,6 +47,7 @@ class DiaryCubit extends Cubit { } String comment = ''; + bool commentNeedsToBeFilled = false; void setInitialDate(DateTime? date) { if (date == null) return; @@ -68,7 +69,7 @@ class DiaryCubit extends Cubit { return canSelect; } - Future fetchDiaryV2({bool needLoading = false, int? diaryId, DateTime? date}) async { + Future fetchDiaryV2({bool needLoading = false, int? diaryId}) async { final currentState = state; try { if (needLoading) { @@ -283,9 +284,15 @@ class DiaryCubit extends Cubit { } } - Future finishDiaryDay({required int diaryId, required String wakeUp, required String retire}) async { - await diaryRepository.finishDiaryDay(diaryId: diaryId, wakeUp: wakeUp, retire: retire, comment: comment.isEmpty ? null : comment); - await updateCurrentDiary(); + Future finishDiaryDay({required int diaryId, required String wakeUp, required String retire}) async { + try { + await diaryRepository.finishDiaryDay(diaryId: diaryId, wakeUp: wakeUp, retire: retire, comment: comment.isEmpty ? null : comment); + await updateCurrentDiary(); + return true; + } catch (e, st) { + log(e.toString(), stackTrace: st); + return false; + } } Future getNutrition(int index) async { @@ -422,6 +429,7 @@ class DiaryCubit extends Cubit { void fillComment(String comment) { this.comment = comment; + commentNeedsToBeFilled = comment.isNotEmpty && comment.length < 3; } } diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 07042f16..01c75db2 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -7,6 +7,7 @@ import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/core/widgets/data_error_widget.dart'; import 'package:eatvio_app/core/widgets/loader.dart'; import 'package:eatvio_app/core/widgets/main_background_bouble.dart'; +import 'package:eatvio_app/core/widgets/show_error_dialog.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/consultant_comments_cubit/consultant_comments_cubit.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; @@ -39,12 +40,12 @@ class UserDiaryScreen extends StatelessWidget { final int diaryId; @override Widget build(BuildContext context) { - return DiaryScreenContent(diaryId: diaryId,); + return DiaryScreenContent(diaryId: diaryId); } } class DiaryScreenContent extends StatefulWidget { - const DiaryScreenContent({super.key, this.diaryId,this.date}); + const DiaryScreenContent({super.key, this.diaryId, this.date}); final int? diaryId; final DateTime? date; @override @@ -134,11 +135,14 @@ class _DiaryScreenContentState extends State { setState(() { _isDiaryFinishing = true; }); - await context.read().finishDiaryDay( + final isFinished = await context.read().finishDiaryDay( diaryId: state.diary.id, wakeUp: state.diary.wakeup.toString(), retire: state.diary.retire.toString(), ); + if (!isFinished && context.mounted) { + showErrorDialog(context); + } setState(() { _isDiaryFinishing = false; }); diff --git a/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart b/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart index 3e311b59..bf73970a 100644 --- a/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart +++ b/lib/features/diary/presentation/widgets/comment_for_consultant_widget.dart @@ -2,6 +2,7 @@ import 'package:easy_debounce/easy_debounce.dart'; import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/features/create_diet/presentation/widgets/error_widget.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -15,10 +16,14 @@ class CommentForConsultantWidget extends StatefulWidget { class _CommentForConsultantWidgetState extends State { final controller = TextEditingController(); + bool _commentNeedsToBeFilled = false; + @override void initState() { super.initState(); - if (widget.comment != null) controller.text = widget.comment ?? ''; + if (widget.comment != null) { + controller.text = widget.comment ?? ''; + } } @override @@ -41,13 +46,27 @@ class _CommentForConsultantWidgetState extends State CustomTextFormField( controller: controller, onChanged: (value) { - EasyDebounce.debounce('client-typing', const Duration(milliseconds: 500), () => context.read().fillComment(value)); + EasyDebounce.debounce( + 'client-typing', + const Duration(milliseconds: 500), + () => context.read().fillComment(value), + ); + if (widget.comment == null) { + setState(() { + _commentNeedsToBeFilled = value.isNotEmpty && value.length < 3; + }); + } }, + hasError: _commentNeedsToBeFilled, hintText: 'Укажите дополнительную информацию', minLines: 4, maxLines: 4, readOnly: widget.comment != null, ), + if (_commentNeedsToBeFilled) ...[ + const SizedBox(height: 4), + const ValidationErrorWidget(error: 'Минимум 3 символа'), + ], ], ), ), diff --git a/lib/features/diary/presentation/widgets/finish_day_button_widget.dart b/lib/features/diary/presentation/widgets/finish_day_button_widget.dart index ba13dd96..d38e32e3 100644 --- a/lib/features/diary/presentation/widgets/finish_day_button_widget.dart +++ b/lib/features/diary/presentation/widgets/finish_day_button_widget.dart @@ -4,7 +4,9 @@ import 'package:eatvio_app/core/widgets/bottom_sheet_handler_bar.dart'; import 'package:eatvio_app/core/widgets/bottom_sheet_with_blur.dart'; import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/core/widgets/show_error_dialog.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; class FinishDayButtonWidget extends StatefulWidget { final Future Function() onPressed; @@ -18,6 +20,14 @@ class FinishDayButtonWidget extends StatefulWidget { class _FinishDayButtonWidgetState extends State { void _onTap() { + if (context.read().commentNeedsToBeFilled) { + showErrorDialog( + context, + title: 'Комментарий слишком короткий', + description: 'Минимум 3 символа в комментарии для консультанта.', + ); + return; + } if (!widget.hasProducts) { showErrorDialog( context, diff --git a/lib/features/diary/presentation/widgets/portion_comment_widget.dart b/lib/features/diary/presentation/widgets/portion_comment_widget.dart index f1acbdc1..8c4c1b13 100644 --- a/lib/features/diary/presentation/widgets/portion_comment_widget.dart +++ b/lib/features/diary/presentation/widgets/portion_comment_widget.dart @@ -22,6 +22,11 @@ class PortionCommentWidget extends StatefulWidget { class _PortionCommentWidgetState extends State { final controller = TextEditingController(); @override + void dispose() { + controller.dispose(); + super.dispose(); + } + @override void didUpdateWidget(PortionCommentWidget oldWidget) { super.didUpdateWidget(oldWidget); if (widget.portionId != oldWidget.portionId) { @@ -57,17 +62,19 @@ class _PortionCommentWidgetState extends State { hintText: s.typePortionComment, hasError: hasError, onChanged: (value) { + final cubit = context.read(); EasyDebounce.debounce( - 'client-typing', + 'portion-comment-${widget.portionId}', const Duration(milliseconds: 500), () { - final hasPortionComment = state.commentsModel.portions.any((portion) => portion.id == widget.portionId); + final currentState = cubit.state; + final hasPortionComment = currentState.commentsModel.portions.any((portion) => portion.id == widget.portionId); if (hasPortionComment) { - final portion = state.commentsModel.portions.firstWhere((portion) => portion.id == widget.portionId); - context.read().updatePortionComment(portion.copyWith(comment: value)); + final portion = currentState.commentsModel.portions.firstWhere((portion) => portion.id == widget.portionId); + cubit.updatePortionComment(portion.copyWith(comment: value)); return; } - context.read().addPortionComment(PortionCommentModel(id: widget.portionId, comment: value)); + cubit.addPortionComment(PortionCommentModel(id: widget.portionId, comment: value)); }, ); }, From 26ae28a7056f36724b0deb903ec9aab9eebb8b7d Mon Sep 17 00:00:00 2001 From: misha Date: Thu, 12 Mar 2026 14:41:16 +0300 Subject: [PATCH 3/4] feat(tests): fixed test errors --- .../presentation/pages/diary_screen_smoke_test.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/features/diary/presentation/pages/diary_screen_smoke_test.dart b/test/features/diary/presentation/pages/diary_screen_smoke_test.dart index 16876e1d..3b595b46 100644 --- a/test/features/diary/presentation/pages/diary_screen_smoke_test.dart +++ b/test/features/diary/presentation/pages/diary_screen_smoke_test.dart @@ -88,7 +88,7 @@ void main() { when(diaryCubit.state).thenReturn(const DiaryState.loading()); when(diaryCubit.stream).thenAnswer((_) => const Stream.empty()); when(diaryCubit.close()).thenAnswer((_) async => Future.value()); - when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'), date: anyNamed('date'))).thenAnswer((_) async => true); + when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'))).thenAnswer((_) async => true); final commentsCubit = MockConsultantCommentsCubit(); when(commentsCubit.state).thenReturn(ConsultantCommentsState(commentsModel: ConsultantCommentModel(comment: ''))); @@ -109,7 +109,7 @@ void main() { when(diaryCubit.state).thenReturn(loadedState(hasChosenPlan: true)); when(diaryCubit.stream).thenAnswer((_) => const Stream.empty()); when(diaryCubit.close()).thenAnswer((_) async => Future.value()); - when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'), date: anyNamed('date'))).thenAnswer((_) async => true); + when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'))).thenAnswer((_) async => true); final commentsCubit = MockConsultantCommentsCubit(); when(commentsCubit.state).thenReturn(ConsultantCommentsState(commentsModel: ConsultantCommentModel(comment: ''), dayCommentNeedsToBeFilled: false)); @@ -132,7 +132,7 @@ void main() { when(diaryCubit.state).thenReturn(const DiaryState.error(errorMessage: 'err')); when(diaryCubit.stream).thenAnswer((_) => const Stream.empty()); when(diaryCubit.close()).thenAnswer((_) async => Future.value()); - when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'), date: anyNamed('date'))).thenAnswer((_) async => true); + when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'))).thenAnswer((_) async => true); final commentsCubit = MockConsultantCommentsCubit(); when(commentsCubit.state).thenReturn(ConsultantCommentsState(commentsModel: ConsultantCommentModel(comment: ''))); @@ -161,7 +161,7 @@ void main() { when(diaryCubit.state).thenReturn(DiaryState.loadedTomorrowWithDiet(diary: futureDiary, selectedDay: DateTime(2025, 1, 2), selectedMeal: 1)); when(diaryCubit.stream).thenAnswer((_) => const Stream.empty()); when(diaryCubit.close()).thenAnswer((_) async => Future.value()); - when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'), date: anyNamed('date'))).thenAnswer((_) async => true); + when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'))).thenAnswer((_) async => true); final commentsCubit = MockConsultantCommentsCubit(); when(commentsCubit.state).thenReturn(ConsultantCommentsState(commentsModel: ConsultantCommentModel(comment: ''))); @@ -193,7 +193,7 @@ void main() { when(diaryCubit.state).thenReturn(state); when(diaryCubit.stream).thenAnswer((_) => const Stream.empty()); when(diaryCubit.close()).thenAnswer((_) async => Future.value()); - when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'), date: anyNamed('date'))).thenAnswer((_) async => true); + when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'))).thenAnswer((_) async => true); final commentsCubit = MockConsultantCommentsCubit(); when(commentsCubit.state).thenReturn(ConsultantCommentsState(commentsModel: ConsultantCommentModel(comment: ''), dayCommentNeedsToBeFilled: false)); @@ -217,7 +217,7 @@ void main() { when(diaryCubit.state).thenReturn(state); when(diaryCubit.stream).thenAnswer((_) => const Stream.empty()); when(diaryCubit.close()).thenAnswer((_) async => Future.value()); - when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'), date: anyNamed('date'))).thenAnswer((_) async => true); + when(diaryCubit.fetchDiaryV2(needLoading: anyNamed('needLoading'), diaryId: anyNamed('diaryId'))).thenAnswer((_) async => true); final commentsCubit = MockConsultantCommentsCubit(); when(commentsCubit.state).thenReturn(ConsultantCommentsState(commentsModel: ConsultantCommentModel(comment: ''))); From 5cb121d7337ed2bbedd23f100cfabb3bee8c5990 Mon Sep 17 00:00:00 2001 From: misha Date: Mon, 16 Mar 2026 10:32:12 +0300 Subject: [PATCH 4/4] fat(recipes, diets): added list refreshing --- .../presentation/create_diet_screen.dart | 10 +++++----- .../pages/recipe_create_screen.dart | 4 ++-- .../my_diets/presentation/my_diets_screen.dart | 12 +++++++++++- .../presentation/widgets/my_diet_widget.dart | 18 +++++++++++++++--- .../presentation/pages/my_recipes_screen.dart | 10 ++++++++-- .../presentation/widgets/my_recipe_widget.dart | 16 ++++++++++++++-- 6 files changed, 55 insertions(+), 15 deletions(-) diff --git a/lib/features/create_diet/presentation/create_diet_screen.dart b/lib/features/create_diet/presentation/create_diet_screen.dart index 5d95e783..c04f1e1c 100644 --- a/lib/features/create_diet/presentation/create_diet_screen.dart +++ b/lib/features/create_diet/presentation/create_diet_screen.dart @@ -103,7 +103,7 @@ class _CreateDietScreenContentState extends State { if (state.published) { Future.delayed(const Duration(milliseconds: 500), () { if (!context.mounted) return; - context.pop(); + context.pop(true); showBottomSheetWithBlur( userRootNavigator: true, context: context, @@ -113,7 +113,7 @@ class _CreateDietScreenContentState extends State { } else if (state.drafted) { Future.delayed(const Duration(milliseconds: 500), () { if (!context.mounted) return; - context.pop(); + context.pop(true); showBottomSheetWithBlur( context: context, child: SuccessPublishedDietOrPlanBottomSheet(title: state.dietData.name ?? 'Диета', isDrafted: true), @@ -231,7 +231,7 @@ class _CreateDietScreenContentState extends State { if (dietState == DietState.draft) { Future.delayed(const Duration(milliseconds: 500), () { if (!context.mounted) return; - context.pop(); + context.pop(true); showBottomSheetWithBlur( userRootNavigator: true, context: context, @@ -241,7 +241,7 @@ class _CreateDietScreenContentState extends State { } else { Future.delayed(const Duration(milliseconds: 500), () { if (!context.mounted) return; - context.pop(); + context.pop(true); showBottomSheetWithBlur( context: context, child: SuccessPublishedDietOrPlanBottomSheet(title: state.dietData.name ?? 'Диета', isDrafted: true), @@ -304,7 +304,7 @@ class _CreateDietScreenContentState extends State { } else { Future.delayed(const Duration(milliseconds: 500), () { if (!context.mounted) return; - context.pop(); + context.pop(true); showBottomSheetWithBlur( userRootNavigator: true, context: context, diff --git a/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart b/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart index a749186d..d4b622aa 100644 --- a/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart +++ b/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart @@ -109,7 +109,7 @@ class _RecipeCreateScreenState extends State { if (isSuccess) { Future.delayed(const Duration(milliseconds: 500), () { if (!context.mounted) return; - context.pop(); + context.pop('active'); showBottomSheetWithBlur( userRootNavigator: true, context: context, @@ -157,7 +157,7 @@ class _RecipeCreateScreenState extends State { }); if (isSuccess) { if (!context.mounted) return; - context.pop(); + context.pop('drafted'); } else { if (!context.mounted) return; showErrorDialog(context, title: 'Не удалось сохранить черновик'); diff --git a/lib/features/my_diets/presentation/my_diets_screen.dart b/lib/features/my_diets/presentation/my_diets_screen.dart index 1c5bad54..25662b1c 100644 --- a/lib/features/my_diets/presentation/my_diets_screen.dart +++ b/lib/features/my_diets/presentation/my_diets_screen.dart @@ -107,7 +107,17 @@ class MyDietsScreenContent extends StatelessWidget { ), ), const SizedBox(width: 12), - AddItemButton(onTap: () => GoRouter.of(context).pushNamed(CreateDietScreen.name, extra: {'isEditing': false})), + AddItemButton( + onTap: () async { + final result = await GoRouter.of(context).pushNamed( + CreateDietScreen.name, + extra: {'isEditing': false}, + ); + if (!context.mounted) return; + if (result == true) { + await context.read().loadAllDiets(); + } + }), const SizedBox(width: 4), ], ), diff --git a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart index 0799fc77..e2236b96 100644 --- a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart +++ b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart @@ -38,9 +38,14 @@ class MyDietWidget extends StatefulWidget { class _MyDietWidgetState extends State { Future _editDiet(Diet diet, BuildContext context) async{ - await GoRouter.of(context).pushNamed(CreateDietScreen.name, extra: {'diet': diet, 'isEditing': true}); + final result = await GoRouter.of(context).pushNamed( + CreateDietScreen.name, + extra: {'diet': diet, 'isEditing': true}, + ); if (!context.mounted) return; - await context.read().loadAllDiets(); + if (result == true) { + await context.read().loadAllDiets(); + } } void _suggestDiet(Diet diet) { @@ -88,7 +93,14 @@ class _MyDietWidgetState extends State { void _createBasedOnChosen(Diet diet, BuildContext context) async { await showErrorDialog(context, title: 'Предупреждение', description: 'Вы переходите к созданию новой диеты на основе скопированной'); if (!context.mounted) return; - GoRouter.of(context).pushNamed(CreateDietScreen.name, extra: {'diet': diet, 'isEditing': false}); + final result = await GoRouter.of(context).pushNamed( + CreateDietScreen.name, + extra: {'diet': diet, 'isEditing': false}, + ); + if (!context.mounted) return; + if (result == true) { + await context.read().loadAllDiets(); + } } void _deleteDiet(Diet diet, BuildContext context) async { diff --git a/lib/features/recipe/presentation/pages/my_recipes_screen.dart b/lib/features/recipe/presentation/pages/my_recipes_screen.dart index f3fc4b36..36359d0b 100644 --- a/lib/features/recipe/presentation/pages/my_recipes_screen.dart +++ b/lib/features/recipe/presentation/pages/my_recipes_screen.dart @@ -74,8 +74,14 @@ class MyRecipesScreen extends StatelessWidget { ), const SizedBox(width: 8), InkWell( - onTap: () { - context.push(RecipeCreateScreen.path); + onTap: () async { + final result = await context.push(RecipeCreateScreen.path); + if (!context.mounted) return; + if (result == MyRecipesCubit.drafted) { + await context.read().setDraftedState(); + } else if (result == MyRecipesCubit.active) { + await context.read().setActiveState(); + } }, borderRadius: BorderRadius.circular(100), child: Container( diff --git a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart index 31c92082..9d0269de 100644 --- a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart +++ b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart @@ -155,7 +155,13 @@ class _MyRecipeWidgetState extends State { final fullRecipe = await context.read().getRecipeById(widget.recipe.slug); if (context.mounted) { Navigator.pop(context); // close dialog - context.push(RecipeCreateScreen.path, extra: fullRecipe); + final result = await context.push(RecipeCreateScreen.path, extra: fullRecipe); + if (!context.mounted) return; + if (result == MyRecipesCubit.drafted) { + await context.read().setDraftedState(); + } else if (result == MyRecipesCubit.active) { + await context.read().setActiveState(); + } } }, height: 52, @@ -236,10 +242,16 @@ class _MyRecipeWidgetState extends State { } else { showErrorToast('Заполните все необходимые поля для публикации рецепта'); if (context.mounted) { - context.push(RecipeCreateScreen.path, extra: { + final result = await context.push(RecipeCreateScreen.path, extra: { 'recipe': fullRecipe, 'autoValidate': true, }); + if (!context.mounted) return; + if (result == MyRecipesCubit.drafted) { + await context.read().setDraftedState(); + } else if (result == MyRecipesCubit.active) { + await context.read().setActiveState(); + } } } await createCubit.close();