diff --git a/assets/icons/play_icon.svg b/assets/icons/play_icon.svg
new file mode 100644
index 00000000..d12618a2
--- /dev/null
+++ b/assets/icons/play_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart
index 646293d0..3c5c98f3 100644
--- a/lib/core/app_router.dart
+++ b/lib/core/app_router.dart
@@ -30,8 +30,8 @@ import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart';
import 'package:eatvio_app/features/plans/presentation/pages/about_plan_screen.dart';
import 'package:eatvio_app/features/profile/presentation/pages/profile_screen.dart';
import 'package:eatvio_app/features/profile/presentation/pages/subs_screen.dart';
-import 'package:eatvio_app/features/recipes/presentation/pages/about_recipes_screen.dart';
-import 'package:eatvio_app/features/recipes/presentation/pages/recipe_create_screen.dart';
+import 'package:eatvio_app/features/recipe/presentation/about_recipe_screen.dart';
+import 'package:eatvio_app/features/create_recipe/presentation/pages/recipe_create_screen.dart';
import 'package:eatvio_app/features/registration/presentation/pages/registration_screen.dart';
import 'package:eatvio_app/features/settings/entities/settings_entity.dart';
import 'package:eatvio_app/features/settings/presentation/pages/change_email_screen.dart';
@@ -58,6 +58,8 @@ class AppRouter {
path: '/auth-screen',
name: 'authScreen',
redirect: (context, state) async {
+ // TokenStorage.removeTokenInStorage();
+ // await TokenStorage.saveTokenInStorage('1|laravel_sanctum_zaU2133RQ0wbxDYdH7IQxTpThmilWtKhzxbSt5X1065fcae3');
if (await TokenStorage.haveTokenInStorage()) {
return '/my-profile-screen';
}
@@ -128,9 +130,14 @@ class AppRouter {
GoRoute(
path: '/about-recipes-screen',
name: 'aboutRecipesScreen',
- builder: (context, state) => AboutRecipesScreen(
- recipes: state.extra as Recipes,
- ),
+ builder: (context, state) {
+ final data = state.extra as Map;
+ return AboutRecipeScreen(
+ recipe: data['recipe'] as Recipe,
+ index: data['index'] as int?,
+ navigateToComments: data['navigateToComments'] as bool,
+ );
+ },
),
GoRoute(
path: RecipeCreateScreen.path,
diff --git a/lib/core/locator_service.dart b/lib/core/locator_service.dart
index e258d702..39f86908 100644
--- a/lib/core/locator_service.dart
+++ b/lib/core/locator_service.dart
@@ -54,9 +54,12 @@ import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/prof
import 'package:eatvio_app/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart';
import 'package:eatvio_app/features/profile/repositories/profile_repository.dart';
import 'package:eatvio_app/features/profile/services/profile_service.dart';
-import 'package:eatvio_app/features/recipes/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
-import 'package:eatvio_app/features/recipes/reporitories/recipe_repository.dart';
-import 'package:eatvio_app/features/recipes/services/recipe_service.dart';
+import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
+import 'package:eatvio_app/features/create_recipe/reporitories/recipe_repository.dart';
+import 'package:eatvio_app/features/create_recipe/services/recipe_service.dart';
+import 'package:eatvio_app/features/recipe/presentation/cubit/about_recipe_cubit.dart';
+import 'package:eatvio_app/features/recipe/repositories/about_recipe_repository.dart';
+import 'package:eatvio_app/features/recipe/services/about_recipe_service.dart';
import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart';
import 'package:eatvio_app/features/registration/repositories/registration_repository.dart';
import 'package:eatvio_app/features/registration/services/registration_service.dart';
@@ -80,7 +83,7 @@ Future init() async {
// Cubit factories
sl.registerFactory(() => RegistrationCubit(registrationRepository: sl()));
sl.registerFactory(() => ChatRoomCubit(chatRepository: sl(), wsManager: sl()));
- sl.registerFactory(() => RecipesCubit(feedRepository: sl(), recipeRepository: sl()));
+ sl.registerFactory(() => RecipesCubit(feedRepository: sl(), recipeRepository: sl(), aboutRecipeRepository: sl()));
sl.registerFactory(() => CalendarCubit(calendarRepository: sl()));
sl.registerFactory(() => ProfileCubit(profileRepository: sl(), chatRepository: sl()));
sl.registerFactory(() => profilePlans.PlansCubit(plansRepository: sl()));
@@ -99,10 +102,11 @@ Future init() async {
sl.registerFactory(() => FeedProfileCubit(profileRepository: sl()));
sl.registerFactory(() => AboutPlanCubit(planRepository: sl()));
sl.registerFactory(() => CreateRecipeCubit(recipeRepository: sl()));
- sl.registerFactory(() => MyDietsCubit(myDietsRepository: sl()));
+ sl.registerFactory(() => MyDietsCubit(myDietsRepository: sl(), createDietRepository: sl()));
sl.registerFactory(() => MyPlansCubit(myPlansRepository: sl()));
sl.registerFactory(() => UserDetailsCubit(profileRepository: sl()));
sl.registerFactory(() => ConsultantsCubit(feedRepository: sl()));
+ sl.registerFactory(() => AboutRecipeCubit(recipeRepository: sl(), profileRepository: sl()));
// Repository
sl.registerLazySingleton(() => ChatRepository(chatService: sl()));
@@ -122,6 +126,7 @@ Future init() async {
sl.registerLazySingleton(() => PlanRepository(planService: sl()));
sl.registerLazySingleton(() => MyDietsRepository(myDietsService: sl()));
sl.registerLazySingleton(() => MyPlansRepository(myPlansService: sl()));
+ sl.registerLazySingleton(() => AboutRecipeRepository(recipeService: sl()));
// Services
sl.registerLazySingleton(() => ChatService(sl()));
@@ -129,7 +134,7 @@ Future init() async {
sl.registerLazySingleton(() => RegistrationService(sl()));
sl.registerLazySingleton(() => CalendarService(sl()));
sl.registerLazySingleton(() => ProfileService(sl()));
- sl.registerLazySingleton(() => RecipeService(sl()));
+ sl.registerLazySingleton(() => CreateRecipeService(sl()));
sl.registerLazySingleton(() => SettingsService(sl()));
sl.registerLazySingleton(() => ConsultantService(sl()));
sl.registerLazySingleton(() => DiaryService(sl()));
@@ -142,6 +147,7 @@ Future init() async {
sl.registerLazySingleton(() => MyDietsService(sl()));
sl.registerLazySingleton(() => MyPlansService(sl()));
sl.registerLazySingleton(() => WsService(sl()));
+ sl.registerLazySingleton(() => AboutRecipeService(sl()));
// External
sl.registerLazySingleton(
diff --git a/lib/core/utils/enums.dart b/lib/core/utils/enums.dart
new file mode 100644
index 00000000..9e6eca73
--- /dev/null
+++ b/lib/core/utils/enums.dart
@@ -0,0 +1,5 @@
+enum ProductType {
+ diet,
+ plan,
+ recipe
+}
diff --git a/lib/core/utils/localization_utils.dart b/lib/core/utils/localization_utils.dart
index 23d846a0..2070f626 100644
--- a/lib/core/utils/localization_utils.dart
+++ b/lib/core/utils/localization_utils.dart
@@ -41,3 +41,33 @@ String getCommentForm(int number, S s) {
return s.comments_plural;
}
}
+
+String getMinuteForm(int number) {
+ if (number % 10 == 1 && number % 100 != 11) {
+ return S.current.minute;
+ } else if ([2, 3, 4].contains(number % 10) && ![12, 13, 14].contains(number % 100)) {
+ return S.current.minutes;
+ } else {
+ return S.current.another_form_of_minute;
+ }
+}
+
+String getHourForm(int number) {
+ if (number % 10 == 1 && number % 100 != 11) {
+ return S.current.hour;
+ } else if ([2, 3, 4].contains(number % 10) && ![12, 13, 14].contains(number % 100)) {
+ return S.current.another_form_of_hour;
+ } else {
+ return S.current.hours;
+ }
+}
+
+String getStepForm(int number) {
+ if (number % 10 == 1 && number % 100 != 11) {
+ return S.current.stage;
+ } else if ([2, 3, 4].contains(number % 10) && ![12, 13, 14].contains(number % 100)) {
+ return S.current.another_form_of_stage;
+ } else {
+ return S.current.stages;
+ }
+}
diff --git a/lib/core/widgets/info_row.dart b/lib/core/widgets/info_row.dart
index 564cf015..7dc1ad73 100644
--- a/lib/core/widgets/info_row.dart
+++ b/lib/core/widgets/info_row.dart
@@ -1,9 +1,11 @@
import 'package:eatvio_app/core/theme/custom_text_style.dart';
+import 'package:eatvio_app/core/utils/enums.dart';
import 'package:eatvio_app/core/utils/localization_utils.dart';
import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart';
import 'package:eatvio_app/features/diets/presentation/widgets/type_badges.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:eatvio_app/features/feed/models/plan_pagination_model.dart';
+import 'package:eatvio_app/features/feed/models/recipes_model.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:flutter/material.dart';
@@ -11,21 +13,35 @@ import 'package:flutter_svg/svg.dart';
class InfoRow extends StatelessWidget {
const InfoRow({
+ required this.type,
super.key,
this.diet,
this.itemsBackgroundColor,
this.disableDescriptionOfTypes = false,
this.plan,
+ this.recipe,
});
+ final ProductType type;
final Color? itemsBackgroundColor;
final Diet? diet;
final PlanModel? plan;
+ final Recipe? recipe;
final bool disableDescriptionOfTypes;
@override
Widget build(BuildContext context) {
final s = S.of(context);
+ String? timeTitle;
+ if (recipe != null) {
+ final hours = recipe!.cookingTime ~/ 60;
+ final minutes = recipe!.cookingTime % 60;
+ if (hours > 0) {
+ timeTitle = '$hours ${getHourForm(hours)} $minutes ${getMinuteForm(minutes)}';
+ } else {
+ timeTitle = '$minutes ${getMinuteForm(minutes)}';
+ }
+ }
return SingleChildScrollView(
padding: const EdgeInsets.symmetric(horizontal: 16),
scrollDirection: Axis.horizontal,
@@ -41,7 +57,11 @@ class InfoRow extends StatelessWidget {
),
SizedBox(width: 4),
Text(
- diet == null ? '${plan?.duration} ${getDayForm(plan?.duration ?? 7, s)}' : '${diet?.duration} ${getDayForm(diet?.duration ?? 7, s)}',
+ switch (type) {
+ ProductType.diet => '${diet?.duration} ${getDayForm(diet?.duration ?? 7, s)}',
+ ProductType.plan => '${plan?.duration} ${getDayForm(plan?.duration ?? 7, s)}',
+ ProductType.recipe => '${timeTitle ?? ''}',
+ },
style: TextStyles.textXSSemibold.copyWith(color: appTheme.black),
),
],
@@ -51,18 +71,42 @@ class InfoRow extends StatelessWidget {
backgroundColor: itemsBackgroundColor,
children: [
SvgPicture.asset(
- 'assets/icons/people.svg',
+ switch (type) {
+ ProductType.diet => 'assets/icons/people.svg',
+ ProductType.plan => 'assets/icons/people.svg',
+ ProductType.recipe => 'assets/icons/calories.svg',
+ },
width: 13.3,
height: 13.3,
),
SizedBox(width: 4),
Text(
- '80 человек прошли',
+ switch (type) {
+ ProductType.diet => '80 человек прошли',
+ ProductType.plan => '80 человек прошли',
+ ProductType.recipe => (recipe?.calories.toStringAsFixed(0) ?? '0') + ' ккал',
+ },
style: TextStyles.textXSSemibold.copyWith(color: appTheme.black),
),
],
),
SizedBox(width: 12),
+ if (type == ProductType.recipe)
+ InfoBouble(
+ backgroundColor: itemsBackgroundColor,
+ children: [
+ SvgPicture.asset(
+ 'assets/icons/steps.svg',
+ width: 13.3,
+ height: 13.3,
+ ),
+ SizedBox(width: 4),
+ Text(
+ '${recipe?.steps?.length ?? 0} ${getStepForm(recipe?.steps?.length ?? 0)}',
+ style: TextStyles.textXSSemibold.copyWith(color: appTheme.black),
+ ),
+ ],
+ ),
if (plan?.type.hasAtLeastOneType() == true || diet?.type.hasAtLeastOneType() == true)
InfoBouble(
backgroundColor: itemsBackgroundColor,
diff --git a/lib/features/create_diet/models/create_diet_model.dart b/lib/features/create_diet/models/create_diet_model.dart
index 84639c77..49f1b752 100644
--- a/lib/features/create_diet/models/create_diet_model.dart
+++ b/lib/features/create_diet/models/create_diet_model.dart
@@ -19,5 +19,3 @@ class CreateDietModel with _$CreateDietModel {
List>>? dailySchedule,
}) = _CreateDietModel;
}
-
-
diff --git a/lib/features/create_diet/presentation/create_diet_screen.dart b/lib/features/create_diet/presentation/create_diet_screen.dart
index cb1cd953..6cd1ea03 100644
--- a/lib/features/create_diet/presentation/create_diet_screen.dart
+++ b/lib/features/create_diet/presentation/create_diet_screen.dart
@@ -233,7 +233,13 @@ class _CreateDietScreenContentState extends State {
else
CustomOutlinedButton(
onPressed: () {
- context.read().publishDiet();
+ if (widget.diet != null) {
+ context.read().updateDiet(
+ widget.diet!.id,
+ );
+ } else {
+ context.read().createDiet();
+ }
},
text: widget.diet != null ? s.save : s.publish,
height: 52,
diff --git a/lib/features/create_diet/presentation/cubit/create_diet_cubit.dart b/lib/features/create_diet/presentation/cubit/create_diet_cubit.dart
index 771e2531..759cfae6 100644
--- a/lib/features/create_diet/presentation/cubit/create_diet_cubit.dart
+++ b/lib/features/create_diet/presentation/cubit/create_diet_cubit.dart
@@ -18,6 +18,7 @@ class CreateDietCubit extends Cubit {
final ProfileRepository profileRepository;
final GlossaryRepository glossaryRepository;
String? tempImagePath;
+ int? dietId;
static const _dietStateValues = DietState.values;
CreateDietCubit({required this.profileRepository, required this.createDietRepository, required this.glossaryRepository}) : super(CreateDietState.initial());
@@ -25,10 +26,12 @@ class CreateDietCubit extends Cubit {
Future setInitialData(Diet? diet) async {
if (diet == null) return;
emit(state.copyWith(isLoading: true, isDietBeingEdited: true));
- final countOfDays = diet.dailySchedule.length;
+ dietId = diet.id;
+ final dailyScheduleWithNutrition = await createDietRepository.getDietPortionsNutrition(diet.id);
+ final countOfDays = dailyScheduleWithNutrition.length;
final List>> dailySchedule = List.generate(countOfDays, (index) => [[], [], [], [], []]);
- for (final dayEntry in diet.dailySchedule.entries) {
+ for (final dayEntry in dailyScheduleWithNutrition.entries) {
for (final mealEntry in dayEntry.value.entries) {
for (final product in mealEntry.value.values) {
dailySchedule[dayEntry.key - 1][mealEntry.key - 1].add(product);
@@ -318,7 +321,7 @@ class CreateDietCubit extends Cubit {
return diet;
}
- Future publishDiet() async {
+ Future createDiet() async {
emit(state.copyWith(isDietPublishing: true));
if (!_isFromValid()) return null;
try {
@@ -347,6 +350,33 @@ class CreateDietCubit extends Cubit {
return null;
}
+ Future updateDiet(int dietId) async {
+ if (!_isFromValid()) return null;
+ try {
+ File? image;
+ if (state.dietData.image != null) {
+ image = await ImageCompressUtility.compressFile(File(state.dietData.image!.path));
+ }
+ await createDietRepository.updateDiet(
+ dietId: dietId,
+ name: state.dietData.name,
+ duration: state.dietData.duration,
+ state: state.dietData.state ?? DietState.active,
+ image: image,
+ meatType: state.dietData.type['meat'] == true ? '1' : '0',
+ carbType: state.dietData.type['carb'] == true ? '1' : '0',
+ vegType: state.dietData.type['veg'] == true ? '1' : '0',
+ lightType: state.dietData.type['light'] == true ? '1' : '0',
+ details: state.dietData.details,
+ dailySchedule: state.dietData.dailySchedule,
+ );
+ return null;
+ } catch (e, st) {
+ log(e.toString(), stackTrace: st);
+ return 'Произошла непредвиденная ошибка';
+ }
+ }
+
bool _isFromValid() {
bool result = true;
if ((state.dietData.name?.length ?? 0) < 3) {
diff --git a/lib/features/create_diet/presentation/diet_preview_screen.dart b/lib/features/create_diet/presentation/diet_preview_screen.dart
index 879e5446..5a385a16 100644
--- a/lib/features/create_diet/presentation/diet_preview_screen.dart
+++ b/lib/features/create_diet/presentation/diet_preview_screen.dart
@@ -1,6 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
+import 'package:eatvio_app/core/utils/enums.dart';
import 'package:eatvio_app/core/utils/localization_utils.dart';
import 'package:eatvio_app/core/utils/string_extentions.dart';
import 'package:eatvio_app/core/widgets/bookmark_button.dart';
@@ -300,7 +301,7 @@ class _DietPreviewScreenState extends State {
),
),
SizedBox(height: 12),
- InfoRow(diet: widget.diet),
+ InfoRow(diet: widget.diet, type: ProductType.diet,),
ExpandableText(
text: widget.diet.details,
),
diff --git a/lib/features/create_diet/presentation/widgets/add_meal_widget.dart b/lib/features/create_diet/presentation/widgets/add_meal_widget.dart
index c0c76b03..2e79416e 100644
--- a/lib/features/create_diet/presentation/widgets/add_meal_widget.dart
+++ b/lib/features/create_diet/presentation/widgets/add_meal_widget.dart
@@ -1,5 +1,7 @@
+import 'package:easy_debounce/easy_debounce.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/core/widgets/custom_divider.dart';
import 'package:eatvio_app/core/widgets/custom_text_form_field.dart';
import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart';
@@ -33,6 +35,7 @@ class _AddMealWidgetState extends State {
GlossaryModel? selectedGlossary;
final productNameController = TextEditingController();
final quantityController = TextEditingController();
+ List glossariesList = [];
@override
void initState() {
@@ -66,47 +69,27 @@ class _AddMealWidgetState extends State {
children: [
SizedBox(
width: MediaQuery.of(context).size.width * 0.8 - 32,
- child: TypeAheadField(
+ child: CustomTextFormField(
controller: productNameController,
- itemBuilder: (context, glossary) {
- return Padding(
- padding: const EdgeInsets.all(8.0),
- child: Text(
- glossary.name,
- style: TextStyle(
- height: 1,
- fontSize: 16,
- ),
- ),
+ autofocus: true,
+ hintText: 'Введите название продукта/блюда',
+ onChanged: (query) {
+ EasyDebounce.debounce(
+ 'glossary-search',
+ Duration(milliseconds: 250),
+ () async {
+ selectedGlossary = null;
+ if (query.isEmpty) {
+ glossariesList = [];
+ selectedGlossary = null;
+ setState(() {});
+ return;
+ }
+ glossariesList = await widget.createDietCubit.getGlossaryListByQuery(query);
+ setState(() {});
+ },
);
},
- itemSeparatorBuilder: (context, index) => _divider(context),
- onSelected: (newSelectedGlossary) async {
- setState(() {
- selectedGlossary = newSelectedGlossary;
- productNameController.text = selectedGlossary!.name;
- });
- },
- suggestionsCallback: (query) async {
- if (query.length < 1) return [];
- final suggestionsList = await widget.createDietCubit.getGlossaryListByQuery(query);
- return suggestionsList;
- },
- builder: (context, controller, focusNode) {
- return CustomTextFormField(
- controller: controller,
- autofocus: true,
- focusNode: focusNode,
- hintText: 'Введите название продукта/блюда',
- );
- },
- emptyBuilder: (context) {
- return const SizedBox.shrink();
- },
- errorBuilder: (context, object) => Padding(
- padding: const EdgeInsets.all(8.0),
- child: Text('Нет подходящих вариантов'),
- ),
),
),
const SizedBox(width: 4),
@@ -129,7 +112,56 @@ class _AddMealWidgetState extends State {
),
],
),
- const SizedBox(height: 16),
+ glossariesList.isEmpty ? const SizedBox(height: 16) : const SizedBox.shrink(),
+ Container(
+ constraints: BoxConstraints(
+ maxHeight: 256,
+ ),
+ child: ListView.separated(
+ physics: const BouncingScrollPhysics(),
+ shrinkWrap: true,
+ itemBuilder: (context, i) {
+ return ListTile(
+ onTap: () async {
+ setState(() {
+ selectedGlossary = glossariesList[i];
+ productNameController.text = selectedGlossary!.name;
+ });
+ glossariesList = [];
+ setState(() {});
+ FocusManager.instance.primaryFocus?.nextFocus();
+ },
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(20),
+ ),
+ title: Text(
+ glossariesList[i].name,
+ style: TextStyle(
+ height: 1,
+ ),
+ ),
+ subtitle: glossariesList[i].grInPortion == 0
+ ? null
+ : Text(
+ '${glossariesList[i].grInPortion} г',
+ style: TextStyle(
+ height: 1,
+ color: Colors.grey.shade600,
+ ),
+ ),
+ trailing: Icon(
+ Icons.add_rounded,
+ color: Colors.grey.shade400,
+ ),
+ contentPadding: EdgeInsets.only(left: 12),
+ );
+ },
+ itemCount: glossariesList.length,
+ separatorBuilder: (BuildContext context, int index) {
+ return CustomDivider();
+ },
+ ),
+ ),
Row(
children: [
if (widget.portionIndex != null)
@@ -188,7 +220,7 @@ class _AddMealWidgetState extends State {
Future addPortion() async {
final portionIndex = widget.portionIndex;
- final measurementUnits = selectedGlossary?.grInPortion == null
+ var measurementUnits = selectedGlossary?.grInPortion == null
? Portion.PCS
: selectedGlossary?.grInPortion == 0
? Portion.GRAMS
@@ -199,7 +231,7 @@ class _AddMealWidgetState extends State {
final portion = DailySchedule(
dailyNutrition: DailyNutrition(energy: calories, proteins: proteins, fats: fats, carbohydrates: carbohydrates),
quantity: int.parse(quantityController.text),
- name: glossary.name,
+ name: glossary.name,
productNutritionalValueId: glossary.id.toString(),
portion: measurementUnits,
);
@@ -234,7 +266,8 @@ class _AddMealWidgetState extends State {
),
);
if (newGlossary != null) {
- final [calories, carbohydrates, proteins, fats] = _getCPFC(newGlossary, Portion.GRAMS);
+ measurementUnits = Portion.GRAMS;
+ final [calories, carbohydrates, proteins, fats] = _getCPFC(newGlossary, measurementUnits);
final portion = DailySchedule(
dailyNutrition: DailyNutrition(energy: calories, proteins: proteins, fats: fats, carbohydrates: carbohydrates),
quantity: int.parse(quantityController.text),
diff --git a/lib/features/create_diet/repositories/create_diet_repository.dart b/lib/features/create_diet/repositories/create_diet_repository.dart
index ba9a6fa4..19e14ea6 100644
--- a/lib/features/create_diet/repositories/create_diet_repository.dart
+++ b/lib/features/create_diet/repositories/create_diet_repository.dart
@@ -58,4 +58,97 @@ class CreateDietRepository {
return createDietService.createPersonalDiet(formData: formData);
}
}
+
+ Future