diff --git a/assets/icons/eatvio_logo.svg b/assets/icons/eatvio_logo.svg
new file mode 100644
index 00000000..e6ed7018
--- /dev/null
+++ b/assets/icons/eatvio_logo.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/paste2.svg b/assets/icons/paste2.svg
new file mode 100644
index 00000000..e4e5ac12
--- /dev/null
+++ b/assets/icons/paste2.svg
@@ -0,0 +1,12 @@
+
diff --git a/lib/core/const.dart b/lib/core/const.dart
index 396c2dce..f7dba8dd 100644
--- a/lib/core/const.dart
+++ b/lib/core/const.dart
@@ -1 +1,5 @@
const String baseUrl = 'https://dev2.eatvio.com';
+
+const List durationValues = [7, 14, 21];
+
+const List typeValues = ['veg', 'light', 'carb', 'meat'];
diff --git a/lib/core/locator_service.dart b/lib/core/locator_service.dart
index 44378eb1..39d837db 100644
--- a/lib/core/locator_service.dart
+++ b/lib/core/locator_service.dart
@@ -1,5 +1,8 @@
import 'package:dio/dio.dart';
import 'package:eatvio_app/core/const.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/repositories/create_diet_repository.dart';
+import 'package:eatvio_app/features/create_diet/services/create_diet_service.dart';
import 'package:eatvio_app/features/diets/repositories/diet_repository.dart';
import 'package:eatvio_app/features/diets/services/diet_service.dart';
import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart';
@@ -74,6 +77,8 @@ Future init() async {
sl.registerFactory(() => DiaryCubit(diaryRepository: sl(), glossaryRepository: sl()));
sl.registerFactory(() => AboutDietCubit(dietsRepository: sl()));
sl.registerFactory(() => BlogPostCreateCubit(blogPostRepository: sl()));
+ sl.registerFactory(() => CreateDietCubit(createDietRepository: sl()));
+
// Repository
sl.registerLazySingleton(() => ChatRepository(chatService: sl()));
@@ -89,6 +94,7 @@ Future init() async {
sl.registerLazySingleton(() => GlossaryRepository(glossaryService: sl()));
sl.registerLazySingleton(() => DietRepository(dietsService: sl()));
sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl()));
+ sl.registerLazySingleton(() => CreateDietRepository(createDietService: sl()));
// Services
sl.registerLazySingleton(() => ChatService(sl()));
@@ -104,6 +110,7 @@ Future init() async {
sl.registerLazySingleton(() => GlossaryService(sl()));
sl.registerLazySingleton(() => DietService(sl()));
sl.registerLazySingleton(() => BlogPostService(sl()));
+ sl.registerLazySingleton(() => CreateDietService(sl()));
// External
sl.registerLazySingleton(
diff --git a/lib/core/theme/theme_helper.dart b/lib/core/theme/theme_helper.dart
index 63675d02..77f7595e 100644
--- a/lib/core/theme/theme_helper.dart
+++ b/lib/core/theme/theme_helper.dart
@@ -178,6 +178,10 @@ class PrimaryColors {
Color get transparentBlue => Color(0xFF2F80ED).withOpacity(0.1);
Color get lightGray0 => Color(0xFFF6F6F6);
+
+ Color get lightGray00 => Color(0xFFE9E9EA);
+
+ Color get dottedBorder => Color(0xFFE6E6E6);
}
PrimaryColors get appTheme => ThemeHelper().themeColor();
diff --git a/lib/core/widgets/custom_drop_down_button.dart b/lib/core/widgets/custom_drop_down_button.dart
new file mode 100644
index 00000000..843d6730
--- /dev/null
+++ b/lib/core/widgets/custom_drop_down_button.dart
@@ -0,0 +1,41 @@
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.dart';
+
+class CustomDropDownButton extends StatelessWidget {
+ const CustomDropDownButton({
+ super.key,
+ required this.items,
+ required this.onChanged,
+ this.value,
+ this.hint,
+ });
+ final T? value;
+ final List> items;
+ final void Function(T?)? onChanged;
+ final Widget? hint;
+ @override
+ Widget build(BuildContext context) {
+ return DropdownButtonFormField(
+ hint: hint,
+ icon: SvgPicture.asset(
+ 'assets/icons/arrow_down2.svg',
+ width: 12,
+ height: 8,
+ ),
+ borderRadius: BorderRadius.circular(20),
+ dropdownColor: appTheme.lightGray0,
+ decoration: InputDecoration(
+ border: OutlineInputBorder(
+ borderRadius: const BorderRadius.all(Radius.circular(20)),
+ borderSide: BorderSide.none,
+ ),
+ fillColor: appTheme.lightGray0,
+ filled: true,
+ ),
+ value: value,
+ items: items,
+ onChanged: onChanged,
+ );
+ }
+}
diff --git a/lib/core/widgets/custom_text_form_field.dart b/lib/core/widgets/custom_text_form_field.dart
index 2ce5a525..17e961a2 100644
--- a/lib/core/widgets/custom_text_form_field.dart
+++ b/lib/core/widgets/custom_text_form_field.dart
@@ -13,7 +13,7 @@ class CustomTextFormField extends StatelessWidget {
this.obscureText = false,
this.textInputAction,
this.textInputType,
- this.maxLines,
+ this.maxLines = 1,
this.hintText,
this.hintStyle,
this.prefix,
@@ -35,6 +35,8 @@ class CustomTextFormField extends StatelessWidget {
this.onEditingComplete,
this.minLines = 1,
this.maxLength,
+ this.expands = false,
+ this.textAlignVertical,
super.key,
});
@@ -49,7 +51,7 @@ class CustomTextFormField extends StatelessWidget {
final TextInputAction? textInputAction;
final TextInputType? textInputType;
final int? maxLines;
- final int minLines;
+ final int? minLines;
final String? hintText;
final TextStyle? hintStyle;
final Widget? prefix;
@@ -69,12 +71,15 @@ class CustomTextFormField extends StatelessWidget {
final void Function(String?)? onSaved;
final void Function(String)? onChanged;
final int? maxLength;
-
+ final bool expands;
+ final TextAlignVertical? textAlignVertical;
@override
Widget build(BuildContext context) {
return Align(
alignment: alignment ?? Alignment.center,
child: TextFormField(
+ textAlignVertical: textAlignVertical,
+ expands: expands,
minLines: minLines,
maxLength: maxLength,
onChanged: onChanged,
@@ -88,7 +93,7 @@ class CustomTextFormField extends StatelessWidget {
),
obscureText: obscureText!,
textInputAction: textInputAction,
- maxLines: maxLines ?? 1,
+ maxLines: maxLines,
initialValue: initialValue,
cursorColor: appTheme.blueA400,
decoration: InputDecoration(
diff --git a/lib/features/diets/presentation/widgets/main_background_bouble.dart b/lib/core/widgets/main_background_bouble.dart
similarity index 100%
rename from lib/features/diets/presentation/widgets/main_background_bouble.dart
rename to lib/core/widgets/main_background_bouble.dart
diff --git a/lib/features/consultant/become_consultant/models/consultant_profile_model.g.dart b/lib/features/consultant/become_consultant/models/consultant_profile_model.g.dart
index e611c201..e66c2cee 100644
--- a/lib/features/consultant/become_consultant/models/consultant_profile_model.g.dart
+++ b/lib/features/consultant/become_consultant/models/consultant_profile_model.g.dart
@@ -23,21 +23,14 @@ _$ConsultantProfileModelImpl _$$ConsultantProfileModelImplFromJson(
);
Map _$$ConsultantProfileModelImplToJson(
- _$ConsultantProfileModelImpl instance) {
- final val = {};
-
- void writeNotNull(String key, dynamic value) {
- if (value != null) {
- val[key] = value;
- }
- }
-
- writeNotNull('has_medical_education', instance.hasMedicalEducation);
- writeNotNull('social_links', instance.socialLinks);
- writeNotNull('cert_photos', instance.photos);
- writeNotNull('completed_courses', instance.certificates);
- return val;
-}
+ _$ConsultantProfileModelImpl instance) =>
+ {
+ if (instance.hasMedicalEducation case final value?)
+ 'has_medical_education': value,
+ if (instance.socialLinks case final value?) 'social_links': value,
+ if (instance.photos case final value?) 'cert_photos': value,
+ if (instance.certificates case final value?) 'completed_courses': value,
+ };
_$SocialLinksModelImpl _$$SocialLinksModelImplFromJson(
Map json) =>
@@ -50,22 +43,15 @@ _$SocialLinksModelImpl _$$SocialLinksModelImplFromJson(
);
Map _$$SocialLinksModelImplToJson(
- _$SocialLinksModelImpl instance) {
- final val = {};
-
- void writeNotNull(String key, dynamic value) {
- if (value != null) {
- val[key] = value;
- }
- }
-
- writeNotNull('vk_link', instance.vkLink);
- writeNotNull('tg_link', instance.tgLink);
- writeNotNull('fb_link', instance.fbLink);
- writeNotNull('insta_link', instance.instaLink);
- writeNotNull('personal_site_link', instance.personalSiteLink);
- return val;
-}
+ _$SocialLinksModelImpl instance) =>
+ {
+ if (instance.vkLink case final value?) 'vk_link': value,
+ if (instance.tgLink case final value?) 'tg_link': value,
+ if (instance.fbLink case final value?) 'fb_link': value,
+ if (instance.instaLink case final value?) 'insta_link': value,
+ if (instance.personalSiteLink case final value?)
+ 'personal_site_link': value,
+ };
_$CertificatesModelImpl _$$CertificatesModelImplFromJson(
Map json) =>
diff --git a/lib/features/create_diet/models/create_diet_model.dart b/lib/features/create_diet/models/create_diet_model.dart
index 6517e784..35635552 100644
--- a/lib/features/create_diet/models/create_diet_model.dart
+++ b/lib/features/create_diet/models/create_diet_model.dart
@@ -1,7 +1,9 @@
import 'dart:io';
+import 'package:dio/dio.dart';
import 'package:eatvio_app/core/image_compressing/image_compress_utility.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
+import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'create_diet_model.freezed.dart';
@@ -15,8 +17,8 @@ class CreateDietModel with _$CreateDietModel{
String? details,
String? state,
int? duration,
- List? type,
- File? image,
+ required List type,
+ XFile? image,
List>>? dailySchedule,
}) = _CreateDietModel;
@@ -26,7 +28,7 @@ class CreateDietModel with _$CreateDietModel{
'state': state,
'type': type,
'details': details,
- 'image': image != null ? await ImageCompressUtility.compressFile(image!) : null,
+ 'image': image != null ? await MultipartFile.fromFile((await ImageCompressUtility.compressFile(File(image!.path))).path, filename: image!.name) : null,
};
Map toDailyScheduleCreationJson() => {
diff --git a/lib/features/create_diet/models/create_diet_model.freezed.dart b/lib/features/create_diet/models/create_diet_model.freezed.dart
index bc3eccbb..05001e64 100644
--- a/lib/features/create_diet/models/create_diet_model.freezed.dart
+++ b/lib/features/create_diet/models/create_diet_model.freezed.dart
@@ -20,8 +20,8 @@ mixin _$CreateDietModel {
String? get details => throw _privateConstructorUsedError;
String? get state => throw _privateConstructorUsedError;
int? get duration => throw _privateConstructorUsedError;
- List? get type => throw _privateConstructorUsedError;
- File? get image => throw _privateConstructorUsedError;
+ List get type => throw _privateConstructorUsedError;
+ XFile? get image => throw _privateConstructorUsedError;
List>>? get dailySchedule =>
throw _privateConstructorUsedError;
@@ -43,8 +43,8 @@ abstract class $CreateDietModelCopyWith<$Res> {
String? details,
String? state,
int? duration,
- List? type,
- File? image,
+ List type,
+ XFile? image,
List>>? dailySchedule});
}
@@ -67,7 +67,7 @@ class _$CreateDietModelCopyWithImpl<$Res, $Val extends CreateDietModel>
Object? details = freezed,
Object? state = freezed,
Object? duration = freezed,
- Object? type = freezed,
+ Object? type = null,
Object? image = freezed,
Object? dailySchedule = freezed,
}) {
@@ -88,14 +88,14 @@ class _$CreateDietModelCopyWithImpl<$Res, $Val extends CreateDietModel>
? _value.duration
: duration // ignore: cast_nullable_to_non_nullable
as int?,
- type: freezed == type
+ type: null == type
? _value.type
: type // ignore: cast_nullable_to_non_nullable
- as List?,
+ as List,
image: freezed == image
? _value.image
: image // ignore: cast_nullable_to_non_nullable
- as File?,
+ as XFile?,
dailySchedule: freezed == dailySchedule
? _value.dailySchedule
: dailySchedule // ignore: cast_nullable_to_non_nullable
@@ -117,8 +117,8 @@ abstract class _$$CreateDietModelImplCopyWith<$Res>
String? details,
String? state,
int? duration,
- List? type,
- File? image,
+ List type,
+ XFile? image,
List>>? dailySchedule});
}
@@ -139,7 +139,7 @@ class __$$CreateDietModelImplCopyWithImpl<$Res>
Object? details = freezed,
Object? state = freezed,
Object? duration = freezed,
- Object? type = freezed,
+ Object? type = null,
Object? image = freezed,
Object? dailySchedule = freezed,
}) {
@@ -160,14 +160,14 @@ class __$$CreateDietModelImplCopyWithImpl<$Res>
? _value.duration
: duration // ignore: cast_nullable_to_non_nullable
as int?,
- type: freezed == type
+ type: null == type
? _value._type
: type // ignore: cast_nullable_to_non_nullable
- as List?,
+ as List,
image: freezed == image
? _value.image
: image // ignore: cast_nullable_to_non_nullable
- as File?,
+ as XFile?,
dailySchedule: freezed == dailySchedule
? _value._dailySchedule
: dailySchedule // ignore: cast_nullable_to_non_nullable
@@ -184,7 +184,7 @@ class _$CreateDietModelImpl extends _CreateDietModel {
this.details,
this.state,
this.duration,
- final List? type,
+ required final List type,
this.image,
final List>>? dailySchedule})
: _type = type,
@@ -199,18 +199,16 @@ class _$CreateDietModelImpl extends _CreateDietModel {
final String? state;
@override
final int? duration;
- final List? _type;
+ final List _type;
@override
- List? get type {
- final value = _type;
- if (value == null) return null;
+ List get type {
if (_type is EqualUnmodifiableListView) return _type;
// ignore: implicit_dynamic_type
- return EqualUnmodifiableListView(value);
+ return EqualUnmodifiableListView(_type);
}
@override
- final File? image;
+ final XFile? image;
final List>>? _dailySchedule;
@override
List>>? get dailySchedule {
@@ -269,8 +267,8 @@ abstract class _CreateDietModel extends CreateDietModel {
final String? details,
final String? state,
final int? duration,
- final List? type,
- final File? image,
+ required final List type,
+ final XFile? image,
final List>>? dailySchedule}) =
_$CreateDietModelImpl;
const _CreateDietModel._() : super._();
@@ -284,9 +282,9 @@ abstract class _CreateDietModel extends CreateDietModel {
@override
int? get duration;
@override
- List? get type;
+ List get type;
@override
- File? get image;
+ XFile? get image;
@override
List>>? get dailySchedule;
diff --git a/lib/features/create_diet/presentation/create_diet_screen.dart b/lib/features/create_diet/presentation/create_diet_screen.dart
index 81db4990..1b882176 100644
--- a/lib/features/create_diet/presentation/create_diet_screen.dart
+++ b/lib/features/create_diet/presentation/create_diet_screen.dart
@@ -1,4 +1,20 @@
-import 'package:flutter/widgets.dart';
+import 'package:eatvio_app/core/locator_service.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/utils/localization_utils.dart';
+import 'package:eatvio_app/core/widgets/custom_text_form_field.dart';
+import 'package:eatvio_app/core/widgets/main_background_bouble.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/features/create_diet/presentation/widgets/day_widget.dart';
+import 'package:eatvio_app/features/create_diet/presentation/widgets/duration_drop_down_widget.dart';
+import 'package:eatvio_app/features/create_diet/presentation/widgets/image_picker_widget.dart';
+import 'package:eatvio_app/features/create_diet/presentation/widgets/status_drop_down_widget.dart';
+import 'package:eatvio_app/features/create_diet/presentation/widgets/type_choice_widget.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/flutter_svg.dart';
class CreateDietScreen extends StatelessWidget {
static const name = 'createDietScreen';
@@ -7,6 +23,97 @@ class CreateDietScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return const Placeholder();
+ return BlocProvider(
+ create: (context) => sl(),
+ child: const CreateDietScreenContent(),
+ );
}
-}
\ No newline at end of file
+}
+
+class CreateDietScreenContent extends StatelessWidget {
+ const CreateDietScreenContent({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return Scaffold(
+ backgroundColor: appTheme.gray100,
+ appBar: AppBar(
+ centerTitle: true,
+ title: Text(
+ s.create_diet,
+ textAlign: TextAlign.center,
+ overflow: TextOverflow.ellipsis,
+ softWrap: true,
+ style: TextStyles.headingXLSemibold.copyWith(color: appTheme.black),
+ ),
+ ),
+ body: SingleChildScrollView(
+ child: Column(
+ children: [
+ SizedBox(height: 8),
+ MainBackgroundBouble(
+ padding: const EdgeInsets.symmetric(horizontal: 16),
+ child: Column(
+ children: [
+ SizedBox(height: 16),
+ CustomTextFormField(
+ hintText: s.enter_diet_name,
+ onChanged: (value) {
+ context.read().setName(value);
+ },
+ ),
+ SizedBox(height: 12),
+ SizedBox(
+ height: 132,
+ child: CustomTextFormField(
+ textAlignVertical: TextAlignVertical.top,
+ maxLines: null,
+ minLines: null,
+ expands: true,
+ hintText: s.enter_diet_description,
+ onChanged: (value) {
+ context.read().setDetails(value);
+ },
+ ),
+ ),
+ SizedBox(height: 12),
+ DurationDropDownWidget(),
+ SizedBox(height: 12),
+ StatusDropDownWidget(),
+ SizedBox(height: 16),
+ TypeChoiceWidget(),
+ SizedBox(height: 16),
+ ImagePickerWidget(),
+ SizedBox(height: 16),
+ ],
+ ),
+ ),
+ SizedBox(height: 16),
+ BlocBuilder(
+ builder: (context, state) {
+ return MainBackgroundBouble(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 16.0),
+ child: Center(
+ child: Text(
+ s.diet_plan + ' (${state.dietData.duration ?? 0} ' + getDayForm(state.dietData.duration ?? 0, s) + ')',
+ style: TextStyles.headingXLSemibold.copyWith(
+ color: appTheme.black,
+ ),
+ ),
+ ),
+ ),
+ );
+ },
+ ),
+ SizedBox(height: 8),
+ DayWidget(
+ index: 0,
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
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 bc093d41..2e27e729 100644
--- a/lib/features/create_diet/presentation/cubit/create_diet_cubit.dart
+++ b/lib/features/create_diet/presentation/cubit/create_diet_cubit.dart
@@ -1,11 +1,14 @@
-import 'dart:io';
-
+import 'package:eatvio_app/core/const.dart';
import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/features/create_diet/repositories/create_diet_repository.dart';
import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_image_compress/flutter_image_compress.dart';
class CreateDietCubit extends Cubit {
- CreateDietCubit() : super(CreateDietState.initial());
+ final CreateDietRepository createDietRepository;
+ static const _dietStateValues = ['active', 'draft', 'personal'];
+ CreateDietCubit({required this.createDietRepository}) : super(CreateDietState.initial());
void setDetails(String text) {
emit(state.copyWith(dietData: state.dietData.copyWith(details: text)));
@@ -15,11 +18,18 @@ class CreateDietCubit extends Cubit {
emit(state.copyWith(dietData: state.dietData.copyWith(name: name)));
}
- void setDuration(int duration) {
- emit(state.copyWith(dietData: state.dietData.copyWith(duration: duration)));
+ void setDuration(int index) {
+ emit(
+ state.copyWith(
+ durationIndex: index,
+ dietData: state.dietData.copyWith(
+ duration: durationValues[index],
+ ),
+ ),
+ );
}
- void setImage(File image) {
+ void setImage(XFile? image) {
emit(state.copyWith(dietData: state.dietData.copyWith(image: image)));
}
@@ -27,11 +37,11 @@ class CreateDietCubit extends Cubit {
emit(state.copyWith(dietData: state.dietData.copyWith(dailySchedule: dailySchedule)));
}
- void setDietState(String dietState) {
- emit(state.copyWith(dietData: state.dietData.copyWith(state: dietState)));
+ void setDietState(int index) {
+ emit(state.copyWith(dietStateIndex: index, dietData: state.dietData.copyWith(state: _dietStateValues[index])));
}
- void setDietType(List type) {
+ void setDietType(List type) {
emit(state.copyWith(dietData: state.dietData.copyWith(type: type)));
}
}
diff --git a/lib/features/create_diet/presentation/cubit/create_diet_state.dart b/lib/features/create_diet/presentation/cubit/create_diet_state.dart
index 61ac70e9..8fdcaee6 100644
--- a/lib/features/create_diet/presentation/cubit/create_diet_state.dart
+++ b/lib/features/create_diet/presentation/cubit/create_diet_state.dart
@@ -9,7 +9,9 @@ class CreateDietState with _$CreateDietState {
required bool isLoading,
required String? errorMessage,
required CreateDietModel dietData,
+ int? durationIndex,
+ int? dietStateIndex,
}) = _CreateDietState;
- factory CreateDietState.initial() => CreateDietState(isLoading: false, errorMessage: null, dietData: CreateDietModel());
+ factory CreateDietState.initial() => CreateDietState(isLoading: false, errorMessage: null, dietData: CreateDietModel(type: [false, false, false, false]));
}
diff --git a/lib/features/create_diet/presentation/cubit/create_diet_state.freezed.dart b/lib/features/create_diet/presentation/cubit/create_diet_state.freezed.dart
index 0a540986..8f6182d8 100644
--- a/lib/features/create_diet/presentation/cubit/create_diet_state.freezed.dart
+++ b/lib/features/create_diet/presentation/cubit/create_diet_state.freezed.dart
@@ -19,6 +19,8 @@ mixin _$CreateDietState {
bool get isLoading => throw _privateConstructorUsedError;
String? get errorMessage => throw _privateConstructorUsedError;
CreateDietModel get dietData => throw _privateConstructorUsedError;
+ int? get durationIndex => throw _privateConstructorUsedError;
+ int? get dietStateIndex => throw _privateConstructorUsedError;
/// Create a copy of CreateDietState
/// with the given fields replaced by the non-null parameter values.
@@ -33,7 +35,12 @@ abstract class $CreateDietStateCopyWith<$Res> {
CreateDietState value, $Res Function(CreateDietState) then) =
_$CreateDietStateCopyWithImpl<$Res, CreateDietState>;
@useResult
- $Res call({bool isLoading, String? errorMessage, CreateDietModel dietData});
+ $Res call(
+ {bool isLoading,
+ String? errorMessage,
+ CreateDietModel dietData,
+ int? durationIndex,
+ int? dietStateIndex});
$CreateDietModelCopyWith<$Res> get dietData;
}
@@ -56,6 +63,8 @@ class _$CreateDietStateCopyWithImpl<$Res, $Val extends CreateDietState>
Object? isLoading = null,
Object? errorMessage = freezed,
Object? dietData = null,
+ Object? durationIndex = freezed,
+ Object? dietStateIndex = freezed,
}) {
return _then(_value.copyWith(
isLoading: null == isLoading
@@ -70,6 +79,14 @@ class _$CreateDietStateCopyWithImpl<$Res, $Val extends CreateDietState>
? _value.dietData
: dietData // ignore: cast_nullable_to_non_nullable
as CreateDietModel,
+ durationIndex: freezed == durationIndex
+ ? _value.durationIndex
+ : durationIndex // ignore: cast_nullable_to_non_nullable
+ as int?,
+ dietStateIndex: freezed == dietStateIndex
+ ? _value.dietStateIndex
+ : dietStateIndex // ignore: cast_nullable_to_non_nullable
+ as int?,
) as $Val);
}
@@ -92,7 +109,12 @@ abstract class _$$CreateDietStateImplCopyWith<$Res>
__$$CreateDietStateImplCopyWithImpl<$Res>;
@override
@useResult
- $Res call({bool isLoading, String? errorMessage, CreateDietModel dietData});
+ $Res call(
+ {bool isLoading,
+ String? errorMessage,
+ CreateDietModel dietData,
+ int? durationIndex,
+ int? dietStateIndex});
@override
$CreateDietModelCopyWith<$Res> get dietData;
@@ -114,6 +136,8 @@ class __$$CreateDietStateImplCopyWithImpl<$Res>
Object? isLoading = null,
Object? errorMessage = freezed,
Object? dietData = null,
+ Object? durationIndex = freezed,
+ Object? dietStateIndex = freezed,
}) {
return _then(_$CreateDietStateImpl(
isLoading: null == isLoading
@@ -128,6 +152,14 @@ class __$$CreateDietStateImplCopyWithImpl<$Res>
? _value.dietData
: dietData // ignore: cast_nullable_to_non_nullable
as CreateDietModel,
+ durationIndex: freezed == durationIndex
+ ? _value.durationIndex
+ : durationIndex // ignore: cast_nullable_to_non_nullable
+ as int?,
+ dietStateIndex: freezed == dietStateIndex
+ ? _value.dietStateIndex
+ : dietStateIndex // ignore: cast_nullable_to_non_nullable
+ as int?,
));
}
}
@@ -138,7 +170,9 @@ class _$CreateDietStateImpl implements _CreateDietState {
const _$CreateDietStateImpl(
{required this.isLoading,
required this.errorMessage,
- required this.dietData});
+ required this.dietData,
+ this.durationIndex,
+ this.dietStateIndex});
@override
final bool isLoading;
@@ -146,10 +180,14 @@ class _$CreateDietStateImpl implements _CreateDietState {
final String? errorMessage;
@override
final CreateDietModel dietData;
+ @override
+ final int? durationIndex;
+ @override
+ final int? dietStateIndex;
@override
String toString() {
- return 'CreateDietState(isLoading: $isLoading, errorMessage: $errorMessage, dietData: $dietData)';
+ return 'CreateDietState(isLoading: $isLoading, errorMessage: $errorMessage, dietData: $dietData, durationIndex: $durationIndex, dietStateIndex: $dietStateIndex)';
}
@override
@@ -162,12 +200,16 @@ class _$CreateDietStateImpl implements _CreateDietState {
(identical(other.errorMessage, errorMessage) ||
other.errorMessage == errorMessage) &&
(identical(other.dietData, dietData) ||
- other.dietData == dietData));
+ other.dietData == dietData) &&
+ (identical(other.durationIndex, durationIndex) ||
+ other.durationIndex == durationIndex) &&
+ (identical(other.dietStateIndex, dietStateIndex) ||
+ other.dietStateIndex == dietStateIndex));
}
@override
- int get hashCode =>
- Object.hash(runtimeType, isLoading, errorMessage, dietData);
+ int get hashCode => Object.hash(runtimeType, isLoading, errorMessage,
+ dietData, durationIndex, dietStateIndex);
/// Create a copy of CreateDietState
/// with the given fields replaced by the non-null parameter values.
@@ -183,7 +225,9 @@ abstract class _CreateDietState implements CreateDietState {
const factory _CreateDietState(
{required final bool isLoading,
required final String? errorMessage,
- required final CreateDietModel dietData}) = _$CreateDietStateImpl;
+ required final CreateDietModel dietData,
+ final int? durationIndex,
+ final int? dietStateIndex}) = _$CreateDietStateImpl;
@override
bool get isLoading;
@@ -191,6 +235,10 @@ abstract class _CreateDietState implements CreateDietState {
String? get errorMessage;
@override
CreateDietModel get dietData;
+ @override
+ int? get durationIndex;
+ @override
+ int? get dietStateIndex;
/// Create a copy of CreateDietState
/// with the given fields replaced by the non-null parameter values.
diff --git a/lib/features/create_diet/presentation/widgets/day_widget.dart b/lib/features/create_diet/presentation/widgets/day_widget.dart
new file mode 100644
index 00000000..b249f81f
--- /dev/null
+++ b/lib/features/create_diet/presentation/widgets/day_widget.dart
@@ -0,0 +1,178 @@
+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_divider.dart';
+import 'package:eatvio_app/core/widgets/custom_outlined_button.dart';
+import 'package:eatvio_app/core/widgets/main_background_bouble.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/features/feed/presentation/widgets/choice_chip_widget.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/svg.dart';
+
+class DayWidget extends StatefulWidget {
+ const DayWidget({
+ super.key,
+ required this.index,
+ });
+ final int index;
+ @override
+ State createState() => _DayWidgetState();
+}
+
+class _DayWidgetState extends State {
+ int _selectedDayIndex = 0;
+ final chipsLabelList = ['1', '2', '3', '4', '5'];
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return BlocBuilder(
+ builder: (context, state) {
+ return MainBackgroundBouble(
+ child: Padding(
+ padding: EdgeInsets.only(
+ left: 16,
+ right: 16,
+ top: 16,
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Text(
+ s.day + ' ${widget.index + 1}',
+ style: TextStyles.headingXLSemibold.copyWith(color: appTheme.black),
+ ),
+ Spacer(),
+ SvgPicture.asset(
+ 'assets/icons/copy2.svg',
+ width: 20,
+ height: 24,
+ colorFilter: ColorFilter.mode(appTheme.black, BlendMode.srcIn),
+ ),
+ ],
+ ),
+ SizedBox(
+ height: 12,
+ ),
+ CustomDivider(),
+ SizedBox(
+ height: 12,
+ ),
+ Text(
+ s.meal,
+ style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ ),
+ SizedBox(height: 16),
+ Row(
+ children: [
+ ChoiceChipWidget(
+ chipsLabelList: chipsLabelList,
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
+ fontSize: TextStyles.textMMedium.fontSize,
+ fontWeight: TextStyles.textMMedium.fontWeight,
+ index: 0,
+ selectedChipIndex: _selectedDayIndex,
+ onSelected: (selectedValue) {
+ setState(() {
+ _selectedDayIndex = 0;
+ });
+ },
+ ),
+ Spacer(),
+ ChoiceChipWidget(
+ chipsLabelList: chipsLabelList,
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
+ fontSize: TextStyles.textMMedium.fontSize,
+ fontWeight: TextStyles.textMMedium.fontWeight,
+ index: 1,
+ selectedChipIndex: _selectedDayIndex,
+ onSelected: (selectedValue) {
+ setState(() {
+ _selectedDayIndex = 1;
+ });
+ },
+ ),
+ Spacer(),
+ ChoiceChipWidget(
+ chipsLabelList: chipsLabelList,
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
+ fontSize: TextStyles.textMMedium.fontSize,
+ fontWeight: TextStyles.textMMedium.fontWeight,
+ index: 2,
+ selectedChipIndex: _selectedDayIndex,
+ onSelected: (selectedValue) {
+ setState(() {
+ _selectedDayIndex = 2;
+ });
+ },
+ ),
+ Spacer(),
+ ChoiceChipWidget(
+ chipsLabelList: chipsLabelList,
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
+ fontSize: TextStyles.textMMedium.fontSize,
+ fontWeight: TextStyles.textMMedium.fontWeight,
+ index: 3,
+ selectedChipIndex: _selectedDayIndex,
+ onSelected: (selectedValue) {
+ setState(() {
+ _selectedDayIndex = 3;
+ });
+ },
+ ),
+ Spacer(),
+ ChoiceChipWidget(
+ chipsLabelList: chipsLabelList,
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6),
+ fontSize: TextStyles.textMMedium.fontSize,
+ fontWeight: TextStyles.textMMedium.fontWeight,
+ index: 4,
+ selectedChipIndex: _selectedDayIndex,
+ onSelected: (selectedValue) {
+ setState(() {
+ _selectedDayIndex = 4;
+ });
+ },
+ ),
+ ],
+ ),
+ SizedBox(height: 16),
+ Row(
+ children: [
+ Container(
+ padding: EdgeInsets.symmetric(horizontal: 12, vertical: 14),
+ decoration: BoxDecoration(color: appTheme.gray50, borderRadius: BorderRadius.all(Radius.circular(12))),
+ child: SvgPicture.asset(
+ 'assets/icons/paste2.svg',
+ width: 28,
+ height: 24,
+ ),
+ ),
+ SizedBox(width: 8),
+ Expanded(
+ child: CustomOutlinedButton(
+ text: s.add,
+ height: 52,
+ buttonTextStyle: TextStyles.textMSemibold.copyWith(
+ color: appTheme.whiteA700,
+ ),
+ buttonStyle: ButtonStyle(
+ side: WidgetStatePropertyAll(BorderSide.none),
+ backgroundColor: WidgetStatePropertyAll(appTheme.blueA400),
+ ),
+ ),
+ ),
+ ],
+ ),
+ SizedBox(height: 20),
+ ],
+ ),
+ ),
+ );
+ },
+ );
+ }
+}
diff --git a/lib/features/create_diet/presentation/widgets/duration_drop_down_widget.dart b/lib/features/create_diet/presentation/widgets/duration_drop_down_widget.dart
new file mode 100644
index 00000000..c4b1ed31
--- /dev/null
+++ b/lib/features/create_diet/presentation/widgets/duration_drop_down_widget.dart
@@ -0,0 +1,65 @@
+import 'package:eatvio_app/core/const.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/utils/localization_utils.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/core/widgets/custom_drop_down_button.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:collection/collection.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class DurationDropDownWidget extends StatefulWidget {
+ const DurationDropDownWidget({super.key});
+
+ @override
+ State createState() => _DurationDropDownWidgetState();
+}
+
+class _DurationDropDownWidgetState extends State {
+ final List durationDropDownTitles = [];
+
+ @override
+ void didChangeDependencies() {
+ super.didChangeDependencies();
+ final s = S.of(context);
+ if (durationDropDownTitles.isEmpty) {
+ durationValues.forEach((element) {
+ durationDropDownTitles.add('$element ${getDayForm(element, s)}');
+ });
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return BlocBuilder(
+ builder: (context, state) {
+ return CustomDropDownButton(
+ hint: Text(
+ s.choose_diet_duration,
+ style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ ),
+ onChanged: (value) {
+ if (value != null) {
+ context.read().setDuration(durationDropDownTitles.indexOf(value));
+ }
+ },
+ items: durationDropDownTitles
+ .mapIndexed(
+ (index, value) => DropdownMenuItem(
+ child: Text(
+ durationDropDownTitles[index],
+ style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ ),
+ value: durationDropDownTitles[index],
+ ),
+ )
+ .toList(),
+ value: state.durationIndex == null ? null : durationDropDownTitles[state.durationIndex ?? 0],
+ );
+ },
+ );
+ }
+}
diff --git a/lib/features/create_diet/presentation/widgets/image_picker_widget.dart b/lib/features/create_diet/presentation/widgets/image_picker_widget.dart
new file mode 100644
index 00000000..e6bb9a82
--- /dev/null
+++ b/lib/features/create_diet/presentation/widgets/image_picker_widget.dart
@@ -0,0 +1,122 @@
+import 'dart:io';
+
+import 'package:dotted_border/dotted_border.dart';
+import 'package:eatvio_app/core/theme/custom_text_style.dart';
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:image_picker/image_picker.dart';
+
+class ImagePickerWidget extends StatefulWidget {
+ const ImagePickerWidget({super.key});
+
+ @override
+ State createState() => _ImagePickerWidgetState();
+}
+
+class _ImagePickerWidgetState extends State {
+ void _showImagePickerOptions(S s, CreateDietCubit cubit) {
+ showCupertinoModalPopup(
+ context: context,
+ builder: (context) => CupertinoActionSheet(
+ actions: [
+ CupertinoActionSheetAction(
+ onPressed: () async {
+ final picker = ImagePicker();
+ final image = await picker.pickImage(source: ImageSource.camera);
+ cubit.setImage(image);
+ Navigator.of(context).pop();
+ },
+ child: Row(
+ children: [
+ Icon(Icons.photo_camera),
+ SizedBox(width: 8),
+ Text(s.photo),
+ ],
+ ),
+ ),
+ CupertinoActionSheetAction(
+ onPressed: () async {
+ final picker = ImagePicker();
+ final image = await picker.pickImage(source: ImageSource.gallery);
+ cubit.setImage(image);
+ Navigator.of(context).pop();
+ },
+ child: Row(
+ children: [
+ Icon(Icons.photo),
+ SizedBox(width: 8),
+ Text(s.gallery),
+ ],
+ ),
+ ),
+ ],
+ cancelButton: CupertinoActionSheetAction(
+ onPressed: () => Navigator.of(context).pop(),
+ isDestructiveAction: true,
+ child: const Text('Отмена'),
+ ),
+ ),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return BlocBuilder(
+ builder: (context, state) {
+ return GestureDetector(
+ onTap: () {
+ _showImagePickerOptions(s, context.read());
+ },
+ child: Container(
+ height: 240,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(8),
+ image: state.dietData.image != null ? DecorationImage(fit: BoxFit.cover, image: FileImage(File(state.dietData.image?.path ?? ''))) : null,
+ color: appTheme.gray50,
+ ),
+ width: MediaQuery.sizeOf(context).width,
+ padding: state.dietData.image != null ? null : EdgeInsets.all(8),
+ child: state.dietData.image != null
+ ? null
+ : Stack(
+ children: [
+ DottedBorder(
+ stackFit: StackFit.expand,
+ dashPattern: [14, 14],
+ color: appTheme.dottedBorder,
+ borderType: BorderType.RRect,
+ radius: Radius.circular(12),
+ child: SizedBox.expand(),
+ ),
+ Center(
+ child: Column(
+ children: [
+ SizedBox(
+ height: 48,
+ ),
+ SvgPicture.asset('assets/icons/eatvio_logo.svg'),
+ SizedBox(
+ height: 24,
+ ),
+ Text(
+ s.add_cover,
+ style: TextStyles.textMMedium.copyWith(color: appTheme.gray),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ },
+ );
+ }
+}
diff --git a/lib/features/create_diet/presentation/widgets/status_drop_down_widget.dart b/lib/features/create_diet/presentation/widgets/status_drop_down_widget.dart
new file mode 100644
index 00000000..999bda84
--- /dev/null
+++ b/lib/features/create_diet/presentation/widgets/status_drop_down_widget.dart
@@ -0,0 +1,63 @@
+import 'package:eatvio_app/core/theme/custom_text_style.dart';
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/core/widgets/custom_drop_down_button.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:collection/collection.dart';
+
+class StatusDropDownWidget extends StatefulWidget {
+ const StatusDropDownWidget({super.key});
+
+ @override
+ State createState() => _StatusDropDownWidgetState();
+}
+
+class _StatusDropDownWidgetState extends State {
+ final List dietStateTitles = [];
+
+ @override
+ void didChangeDependencies() {
+ super.didChangeDependencies();
+ final s = S.of(context);
+ if (dietStateTitles.isEmpty) {
+ dietStateTitles.add(s.active_diet_state);
+ dietStateTitles.add(s.inactive_diet_state);
+ dietStateTitles.add(s.personal_diet_state);
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return BlocBuilder(
+ builder: (context, state) {
+ return CustomDropDownButton(
+ hint: Text(
+ s.diet_state,
+ style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ ),
+ onChanged: (value) {
+ if (value != null) {
+ context.read().setDietState(dietStateTitles.indexOf(value));
+ }
+ },
+ items: dietStateTitles
+ .mapIndexed(
+ (index, value) => DropdownMenuItem(
+ child: Text(
+ dietStateTitles[index],
+ style: TextStyles.textMMedium.copyWith(color: appTheme.black),
+ ),
+ value: dietStateTitles[index],
+ ),
+ )
+ .toList(),
+ value: state.dietStateIndex == null ? null : dietStateTitles[state.dietStateIndex ?? 0],
+ );
+ },
+ );
+ }
+}
diff --git a/lib/features/create_diet/presentation/widgets/type_choice_widget.dart b/lib/features/create_diet/presentation/widgets/type_choice_widget.dart
new file mode 100644
index 00000000..85b785e4
--- /dev/null
+++ b/lib/features/create_diet/presentation/widgets/type_choice_widget.dart
@@ -0,0 +1,100 @@
+import 'package:eatvio_app/core/theme/custom_text_style.dart';
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_cubit.dart';
+import 'package:eatvio_app/features/create_diet/presentation/cubit/create_diet_state.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:flutter_svg/svg.dart';
+
+class TypeChoiceWidget extends StatefulWidget {
+ TypeChoiceWidget({super.key});
+
+ @override
+ State createState() => _TypeChoiceWidgetState();
+}
+
+class _TypeChoiceWidgetState extends State {
+ final List<(String, String)> choiceContent = [];
+ @override
+ void didChangeDependencies() {
+ super.didChangeDependencies();
+ final s = S.of(context);
+ if (choiceContent.isEmpty) {
+ choiceContent.add(
+ (
+ 'assets/icons/meat2.svg',
+ s.meat,
+ ),
+ );
+ choiceContent.add(
+ (
+ 'assets/icons/broccoli.svg',
+ s.vegan,
+ ),
+ );
+ choiceContent.add(
+ (
+ 'assets/icons/bread.svg',
+ s.carb_type,
+ ),
+ );
+ choiceContent.add(
+ (
+ 'assets/icons/cocktail.svg',
+ s.light_type,
+ ),
+ );
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return BlocBuilder(
+ builder: (context, state) {
+ return Row(
+ children: [
+ ...List.generate(4, (index) {
+ return Expanded(
+ child: GestureDetector(
+ onTap: () {
+ final dietTypes = [...state.dietData.type];
+ dietTypes[index] = !dietTypes[index];
+ context.read().setDietType(dietTypes);
+ },
+ child: Container(
+ margin: EdgeInsets.only(right: index == 3 ? 0 : 4),
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(5),
+ color: state.dietData.type[index] ? appTheme.cardBackground : appTheme.whiteA700,
+ border: Border.all(
+ width: 1,
+ color: state.dietData.type[index] ? appTheme.blueA400 : appTheme.lightGray00,
+ ),
+ ),
+ height: 80,
+ child: Column(
+ children: [
+ SizedBox(height: 16),
+ SvgPicture.asset(
+ choiceContent[index].$1,
+ height: 30,
+ ),
+ SizedBox(height: 8),
+ Text(
+ choiceContent[index].$2,
+ overflow: TextOverflow.clip,
+ style: TextStyles.textXSSemibold.copyWith(color: appTheme.black),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }),
+ ],
+ );
+ },
+ );
+ }
+}
diff --git a/lib/features/create_diet/repositories/create_diet_repository.dart b/lib/features/create_diet/repositories/create_diet_repository.dart
new file mode 100644
index 00000000..4400d1c8
--- /dev/null
+++ b/lib/features/create_diet/repositories/create_diet_repository.dart
@@ -0,0 +1,25 @@
+import 'package:eatvio_app/features/create_diet/services/create_diet_service.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
+
+class CreateDietRepository {
+ final CreateDietService createDietService;
+ CreateDietRepository({required this.createDietService});
+
+ Future createDiet({
+ required Map model,
+ }) {
+ return createDietService.createDiet(
+ model: model,
+ );
+ }
+
+ Future createDietDailySchedule({
+ required int id,
+ required Map model,
+ }) {
+ return createDietService.createDietDailySchedule(
+ id: id,
+ model: model,
+ );
+ }
+}
diff --git a/lib/features/create_diet/services/create_diet_service.dart b/lib/features/create_diet/services/create_diet_service.dart
index 93ec038d..03ab2a78 100644
--- a/lib/features/create_diet/services/create_diet_service.dart
+++ b/lib/features/create_diet/services/create_diet_service.dart
@@ -1,12 +1,22 @@
import 'package:dio/dio.dart';
+import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart';
import 'package:retrofit/retrofit.dart';
part 'create_diet_service.g.dart';
@RestApi()
abstract class CreateDietService {
-
factory CreateDietService(Dio dio, {String baseUrl}) = _CreateDietService;
+ @POST('/api/diets/create')
+ @MultiPart()
+ Future createDiet({
+ @Body() required Map model,
+ });
+
+ @POST('/api/diets/create/{id}/daily_schedule')
+ Future createDietDailySchedule({
+ @Path() required int id,
+ @Body() required Map model,
+ });
}
-
\ No newline at end of file
diff --git a/lib/features/create_diet/services/create_diet_service.g.dart b/lib/features/create_diet/services/create_diet_service.g.dart
index a706620d..41ed51e7 100644
--- a/lib/features/create_diet/services/create_diet_service.g.dart
+++ b/lib/features/create_diet/services/create_diet_service.g.dart
@@ -21,6 +21,70 @@ class _CreateDietService implements CreateDietService {
final ParseErrorLogger? errorLogger;
+ @override
+ Future createDiet({required Map model}) async {
+ final _extra = {};
+ final queryParameters = {};
+ final _headers = {};
+ final _data = {};
+ _data.addAll(model);
+ final _options = _setStreamType(Options(
+ method: 'POST',
+ headers: _headers,
+ extra: _extra,
+ contentType: 'multipart/form-data',
+ )
+ .compose(
+ _dio.options,
+ '/api/diets/create',
+ queryParameters: queryParameters,
+ data: _data,
+ )
+ .copyWith(
+ baseUrl: _combineBaseUrls(
+ _dio.options.baseUrl,
+ baseUrl,
+ )));
+ final _result = await _dio.fetch