diff --git a/lib/app_router.dart b/lib/app_router.dart index 9c23dd00..d901f02f 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -1,25 +1,37 @@ -import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/features/blog_post/presentation/pages/blog_post_screen.dart'; -import 'package:eatvio_app/features/blog_post_create/presentation/pages/blog_post_create_screen.dart'; -import 'package:eatvio_app/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart'; import 'package:eatvio_app/features/chat/presentation/pages/chat_screen.dart'; import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/chat_select_screen.dart'; -import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; -import 'package:eatvio_app/features/feed/presentation/pages/feed_screen.dart'; -import 'package:eatvio_app/features/registration/presentation/pages/registration_screen.dart'; import 'package:eatvio_app/presentation/auth/auth_screen/auth_screen.dart'; import 'package:eatvio_app/presentation/diary/diary_edit_screen/diary_edit_screen.dart'; import 'package:eatvio_app/presentation/diets/diet_create_screen/diet_create_screen.dart'; import 'package:eatvio_app/presentation/diets/diet_select_screen/diet_select_screen.dart'; +import 'package:eatvio_app/features/blog_post_create/presentation/pages/blog_post_create_screen.dart'; import 'package:eatvio_app/presentation/feed/blog_post_edit_screen/blog_post_edit_screen.dart'; +import 'package:eatvio_app/features/blog_post/presentation/pages/blog_post_screen.dart'; +import 'package:eatvio_app/features/feed/presentation/pages/feed_screen.dart'; import 'package:eatvio_app/presentation/glossary/glossary_screen/glossary_screen.dart'; import 'package:eatvio_app/presentation/plans/plan_select_screen/plan_select_screen.dart'; import 'package:eatvio_app/presentation/profile/my_profile_screen/my_profile_screen.dart'; import 'package:eatvio_app/presentation/profile/my_profile_screen/my_settings_screen.dart'; import 'package:eatvio_app/presentation/recipe/recipe_select_screen/recipe_select_screen.dart'; +import 'package:eatvio_app/presentation/registration/additional_information_screen/additional_information_screen.dart'; +import 'package:eatvio_app/presentation/registration/allergies_screen/allergies_screen.dart'; +import 'package:eatvio_app/presentation/registration/blood_pressure_screen/blood_pressure_screen.dart'; +import 'package:eatvio_app/presentation/registration/body_circumferences_screen/body_circumferences_screen.dart'; +import 'package:eatvio_app/presentation/registration/city_of_living_screen/city_of_living_screen.dart'; +import 'package:eatvio_app/presentation/registration/credentials_screen/credentials_screen.dart'; +import 'package:eatvio_app/presentation/registration/date_of_birth_screen/date_of_birth_screen.dart'; +import 'package:eatvio_app/presentation/registration/favorite_foods_screen/favorite_foods_screen.dart'; +import 'package:eatvio_app/presentation/registration/favorite_sports_screen/favorite_sports_screen.dart'; +import 'package:eatvio_app/presentation/registration/gender_screen/gender_screen.dart'; +import 'package:eatvio_app/presentation/registration/height_screen/height_screen.dart'; +import 'package:eatvio_app/presentation/registration/language_select_screen/language_select_screen.dart'; +import 'package:eatvio_app/presentation/registration/medicine_intake_screen/medicine_intake_screen.dart'; +import 'package:eatvio_app/presentation/registration/name_screen/name_screen.dart'; +import 'package:eatvio_app/presentation/registration/weight_screen/weight_screen.dart'; +import 'package:eatvio_app/widgets/bottom_navigation_bar_widget.dart'; +import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; class AppRouter { @@ -91,7 +103,7 @@ class AppRouter { GoRoute( path: '/diary-screen', name: 'diaryScreen', - builder: (context, state) => DiaryEditScreen(), + builder: (context, state) => DiaryScreen(), ), GoRoute( path: '/chat-select-screen', diff --git a/lib/features/blog_post_create/models/blog_post_create_credentials_model.dart b/lib/features/blog_post_create/models/blog_post_create_credentials_model.dart index ba68b46b..d935cd62 100644 --- a/lib/features/blog_post_create/models/blog_post_create_credentials_model.dart +++ b/lib/features/blog_post_create/models/blog_post_create_credentials_model.dart @@ -1,3 +1,4 @@ +/* import 'package:freezed_annotation/freezed_annotation.dart'; part '../../../presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.freezed.dart'; @@ -14,3 +15,4 @@ class BlogPostCreateCredentialsModel with _$BlogPostCreateCredentialsModel { factory BlogPostCreateCredentialsModel.fromJson(Map json) => _$BlogPostCreateCredentialsModelFromJson(json); } +*/ diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart index 755ce127..b49b45c2 100644 --- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart +++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart @@ -1,13 +1,12 @@ -import 'dart:io'; - -import 'package:eatvio_app/core/app_export.dart'; -import 'package:eatvio_app/widgets/custom_outlined_button.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; -import 'package:flutter/material.dart'; -import 'package:image_picker/image_picker.dart'; - +/* import '../../../../presentation/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart'; import '../../../../presentation/feed/blog_post_create_screen/models/blog_post_create_model.dart'; +import 'package:eatvio_app/core/app_export.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/widgets/custom_outlined_button.dart'; +import 'dart:io'; class BlogPostCreateScreen extends StatelessWidget { const BlogPostCreateScreen({Key? key}) : super(key: key); @@ -15,7 +14,9 @@ class BlogPostCreateScreen extends StatelessWidget { static Widget builder(BuildContext context) { final blog_postID = ModalRoute.of(context)!.settings.arguments; return BlocProvider( - create: (context) => BlogPostCreateBloc(BlogPostCreateState(blog_postModelObj: BlogPostCreateModel(blog_postID: blog_postID.toString()))) + create: (context) => BlogPostCreateBloc(BlogPostCreateState( + blog_postModelObj: + BlogPostCreateModel(blog_postID: blog_postID.toString()))) ..add(BlogPostCreateInitialEvent()), child: BlogPostCreateScreen(), ); @@ -77,13 +78,15 @@ class BlogPostCreateScreen extends StatelessWidget { children: [ Column( children: [ - Text("Заголовок новости", style: theme.textTheme.bodyLarge), + Text("Заголовок новости", + style: theme.textTheme.bodyLarge), CustomTextFormField( controller: state.title, validator: _validateTitle, ), SizedBox(height: 8.0), - Text("Ссылка на YouTube", style: theme.textTheme.bodyLarge), + Text("Ссылка на YouTube", + style: theme.textTheme.bodyLarge), CustomTextFormField( controller: state.youtubeURL, validator: _validateYouTubeLink, @@ -100,7 +103,8 @@ class BlogPostCreateScreen extends StatelessWidget { SizedBox(height: 16.0), // Add widget for image upload here CustomOutlinedButton( - onPressed: () => _submitForm(context, state.title!.text, state.description!.text, state.youtubeURL!.text), + onPressed: () => _submitForm(context, state.title!.text, + state.description!.text, state.youtubeURL!.text), buttonStyle: CustomButtonStyles.outlinePrimaryTL15, text: 'Создать', ), @@ -116,16 +120,20 @@ class BlogPostCreateScreen extends StatelessWidget { } } -_submitForm(BuildContext context, String title, String description, String youtubeURL) { +_submitForm( + BuildContext context, String title, String description, String youtubeURL) { String? titleError = _validateTitle(title); String? descriptionError = _validateDescription(description); String? youtubeURLError = _validateYouTubeLink(youtubeURL); - if (titleError != null || descriptionError != null || youtubeURLError != null) { + if (titleError != null || + descriptionError != null || + youtubeURLError != null) { // Display error messages or handle invalid input as needed // For example, show a snackbar with the error message ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(titleError ?? descriptionError ?? youtubeURLError!)), + SnackBar( + content: Text(titleError ?? descriptionError ?? youtubeURLError!)), ); } else { // Proceed with form submission @@ -226,6 +234,8 @@ String? _validateYouTubeLink(value) { } bool _isValidUrl(String url) { - final RegExp urlRegExp = new RegExp(r"^(http|https):\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?$"); + final RegExp urlRegExp = + new RegExp(r"^(http|https):\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?$"); return urlRegExp.hasMatch(url); } +*/ \ No newline at end of file diff --git a/lib/features/blog_post_create/repositories/blog_repository.dart b/lib/features/blog_post_create/repositories/blog_repository.dart index 25b70823..ee11cd12 100644 --- a/lib/features/blog_post_create/repositories/blog_repository.dart +++ b/lib/features/blog_post_create/repositories/blog_repository.dart @@ -1,3 +1,4 @@ +/* import 'package:eatvio_app/features/blog_post_create/models/blog_post_create_credentials_model.dart'; import 'package:eatvio_app/features/blog_post_create/services/blog_service.dart'; @@ -17,3 +18,4 @@ class BlogRepository { } } } +*/ \ No newline at end of file diff --git a/lib/features/blog_post_create/services/blog_service.dart b/lib/features/blog_post_create/services/blog_service.dart index 142682f5..d8e94496 100644 --- a/lib/features/blog_post_create/services/blog_service.dart +++ b/lib/features/blog_post_create/services/blog_service.dart @@ -1,5 +1,6 @@ -import 'package:dio/dio.dart'; +/* import 'package:eatvio_app/features/blog_post_create/models/blog_post_create_credentials_model.dart'; +import 'package:dio/dio.dart'; import 'package:retrofit/retrofit.dart'; part 'blog_service.g.dart'; @@ -8,6 +9,8 @@ part 'blog_service.g.dart'; abstract class BlogService { factory BlogService(Dio dio, {String baseUrl}) = _BlogService; - @POST('/api/blog_post/create') - Future createBlogPost(BlogPostCreateCredentialsModel model); + @POST('/blog_post/create') + Future createBlogPost( + BlogPostCreateCredentialsModel model); } +*/ \ No newline at end of file diff --git a/lib/features/calendar/models/calendar_model.dart b/lib/features/calendar/models/calendar_model.dart new file mode 100644 index 00000000..c206175b --- /dev/null +++ b/lib/features/calendar/models/calendar_model.dart @@ -0,0 +1,21 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'calendar_model.freezed.dart'; +part 'calendar_model.g.dart'; + +@freezed +class CalendarModel with _$CalendarModel { + const factory CalendarModel({ + required int id, + required String state, + required String image, + required String description, + @JsonKey(name: "youtube_url") required String youtubeUrl, + @JsonKey(name: "created_at") required DateTime createdAt, + @JsonKey(name: "updated_at") required DateTime updatedAt, + required String title, + }) = _CalendarModel; + + factory CalendarModel.fromJson(Map json) => + _$CalendarModelFromJson(json); +} diff --git a/lib/features/calendar/models/calendar_model.freezed.dart b/lib/features/calendar/models/calendar_model.freezed.dart new file mode 100644 index 00000000..7f0d3209 --- /dev/null +++ b/lib/features/calendar/models/calendar_model.freezed.dart @@ -0,0 +1,309 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'calendar_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +CalendarModel _$CalendarModelFromJson(Map json) { + return _CalendarModel.fromJson(json); +} + +/// @nodoc +mixin _$CalendarModel { + int get id => throw _privateConstructorUsedError; + String get state => throw _privateConstructorUsedError; + String get image => throw _privateConstructorUsedError; + String get description => throw _privateConstructorUsedError; + @JsonKey(name: "youtube_url") + String get youtubeUrl => throw _privateConstructorUsedError; + @JsonKey(name: "created_at") + DateTime get createdAt => throw _privateConstructorUsedError; + @JsonKey(name: "updated_at") + DateTime get updatedAt => throw _privateConstructorUsedError; + String get title => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $CalendarModelCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CalendarModelCopyWith<$Res> { + factory $CalendarModelCopyWith( + CalendarModel value, $Res Function(CalendarModel) then) = + _$CalendarModelCopyWithImpl<$Res, CalendarModel>; + @useResult + $Res call( + {int id, + String state, + String image, + String description, + @JsonKey(name: "youtube_url") String youtubeUrl, + @JsonKey(name: "created_at") DateTime createdAt, + @JsonKey(name: "updated_at") DateTime updatedAt, + String title}); +} + +/// @nodoc +class _$CalendarModelCopyWithImpl<$Res, $Val extends CalendarModel> + implements $CalendarModelCopyWith<$Res> { + _$CalendarModelCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? state = null, + Object? image = null, + Object? description = null, + Object? youtubeUrl = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? title = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + state: null == state + ? _value.state + : state // ignore: cast_nullable_to_non_nullable + as String, + image: null == image + ? _value.image + : image // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + youtubeUrl: null == youtubeUrl + ? _value.youtubeUrl + : youtubeUrl // ignore: cast_nullable_to_non_nullable + as String, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as DateTime, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as DateTime, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$CalendarModelImplCopyWith<$Res> + implements $CalendarModelCopyWith<$Res> { + factory _$$CalendarModelImplCopyWith( + _$CalendarModelImpl value, $Res Function(_$CalendarModelImpl) then) = + __$$CalendarModelImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int id, + String state, + String image, + String description, + @JsonKey(name: "youtube_url") String youtubeUrl, + @JsonKey(name: "created_at") DateTime createdAt, + @JsonKey(name: "updated_at") DateTime updatedAt, + String title}); +} + +/// @nodoc +class __$$CalendarModelImplCopyWithImpl<$Res> + extends _$CalendarModelCopyWithImpl<$Res, _$CalendarModelImpl> + implements _$$CalendarModelImplCopyWith<$Res> { + __$$CalendarModelImplCopyWithImpl( + _$CalendarModelImpl _value, $Res Function(_$CalendarModelImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? state = null, + Object? image = null, + Object? description = null, + Object? youtubeUrl = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? title = null, + }) { + return _then(_$CalendarModelImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + state: null == state + ? _value.state + : state // ignore: cast_nullable_to_non_nullable + as String, + image: null == image + ? _value.image + : image // ignore: cast_nullable_to_non_nullable + as String, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + youtubeUrl: null == youtubeUrl + ? _value.youtubeUrl + : youtubeUrl // ignore: cast_nullable_to_non_nullable + as String, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as DateTime, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as DateTime, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$CalendarModelImpl implements _CalendarModel { + const _$CalendarModelImpl( + {required this.id, + required this.state, + required this.image, + required this.description, + @JsonKey(name: "youtube_url") required this.youtubeUrl, + @JsonKey(name: "created_at") required this.createdAt, + @JsonKey(name: "updated_at") required this.updatedAt, + required this.title}); + + factory _$CalendarModelImpl.fromJson(Map json) => + _$$CalendarModelImplFromJson(json); + + @override + final int id; + @override + final String state; + @override + final String image; + @override + final String description; + @override + @JsonKey(name: "youtube_url") + final String youtubeUrl; + @override + @JsonKey(name: "created_at") + final DateTime createdAt; + @override + @JsonKey(name: "updated_at") + final DateTime updatedAt; + @override + final String title; + + @override + String toString() { + return 'CalendarModel(id: $id, state: $state, image: $image, description: $description, youtubeUrl: $youtubeUrl, createdAt: $createdAt, updatedAt: $updatedAt, title: $title)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CalendarModelImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.state, state) || other.state == state) && + (identical(other.image, image) || other.image == image) && + (identical(other.description, description) || + other.description == description) && + (identical(other.youtubeUrl, youtubeUrl) || + other.youtubeUrl == youtubeUrl) && + (identical(other.createdAt, createdAt) || + other.createdAt == createdAt) && + (identical(other.updatedAt, updatedAt) || + other.updatedAt == updatedAt) && + (identical(other.title, title) || other.title == title)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, id, state, image, description, + youtubeUrl, createdAt, updatedAt, title); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$CalendarModelImplCopyWith<_$CalendarModelImpl> get copyWith => + __$$CalendarModelImplCopyWithImpl<_$CalendarModelImpl>(this, _$identity); + + @override + Map toJson() { + return _$$CalendarModelImplToJson( + this, + ); + } +} + +abstract class _CalendarModel implements CalendarModel { + const factory _CalendarModel( + {required final int id, + required final String state, + required final String image, + required final String description, + @JsonKey(name: "youtube_url") required final String youtubeUrl, + @JsonKey(name: "created_at") required final DateTime createdAt, + @JsonKey(name: "updated_at") required final DateTime updatedAt, + required final String title}) = _$CalendarModelImpl; + + factory _CalendarModel.fromJson(Map json) = + _$CalendarModelImpl.fromJson; + + @override + int get id; + @override + String get state; + @override + String get image; + @override + String get description; + @override + @JsonKey(name: "youtube_url") + String get youtubeUrl; + @override + @JsonKey(name: "created_at") + DateTime get createdAt; + @override + @JsonKey(name: "updated_at") + DateTime get updatedAt; + @override + String get title; + @override + @JsonKey(ignore: true) + _$$CalendarModelImplCopyWith<_$CalendarModelImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/calendar/models/calendar_model.g.dart b/lib/features/calendar/models/calendar_model.g.dart new file mode 100644 index 00000000..d675f9b1 --- /dev/null +++ b/lib/features/calendar/models/calendar_model.g.dart @@ -0,0 +1,31 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'calendar_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$CalendarModelImpl _$$CalendarModelImplFromJson(Map json) => + _$CalendarModelImpl( + id: (json['id'] as num).toInt(), + state: json['state'] as String, + image: json['image'] as String, + description: json['description'] as String, + youtubeUrl: json['youtube_url'] as String, + createdAt: DateTime.parse(json['created_at'] as String), + updatedAt: DateTime.parse(json['updated_at'] as String), + title: json['title'] as String, + ); + +Map _$$CalendarModelImplToJson(_$CalendarModelImpl instance) => + { + 'id': instance.id, + 'state': instance.state, + 'image': instance.image, + 'description': instance.description, + 'youtube_url': instance.youtubeUrl, + 'created_at': instance.createdAt.toIso8601String(), + 'updated_at': instance.updatedAt.toIso8601String(), + 'title': instance.title, + }; diff --git a/lib/features/calendar/presentation/bloc/calendar_cubit.dart b/lib/features/calendar/presentation/bloc/calendar_cubit.dart new file mode 100644 index 00000000..2b76ab12 --- /dev/null +++ b/lib/features/calendar/presentation/bloc/calendar_cubit.dart @@ -0,0 +1,20 @@ +import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_state.dart'; +import 'package:eatvio_app/features/calendar/repositories/calendar_repository.dart'; + +class CalendarCubit extends Cubit { + final CalendarRepository calendarRepository; + + CalendarCubit({required this.calendarRepository}) + : super(const CalendarState.loading()); + + loadCalendarList() async { + emit(const CalendarState.loading()); + try { + final calendarList = await calendarRepository.getCalendar(); + emit(CalendarState.loaded(calendarList: calendarList)); + } catch (e) { + emit(CalendarState.error(errorMessage: e.toString())); + } + } +} diff --git a/lib/features/calendar/presentation/bloc/calendar_state.dart b/lib/features/calendar/presentation/bloc/calendar_state.dart new file mode 100644 index 00000000..6dbf6062 --- /dev/null +++ b/lib/features/calendar/presentation/bloc/calendar_state.dart @@ -0,0 +1,19 @@ +import 'package:eatvio_app/features/calendar/models/calendar_model.dart'; +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'calendar_state.freezed.dart'; + +@freezed +abstract class CalendarState with _$CalendarState { + const factory CalendarState() = _CalendarState; + + const factory CalendarState.loading() = CalendarStateLoading; + + const factory CalendarState.loaded({ + required List calendarList, + }) = CalendarStateLoaded; + + const factory CalendarState.error({ + required String errorMessage, + }) = CalendarStateError; +} diff --git a/lib/features/calendar/presentation/bloc/calendar_state.freezed.dart b/lib/features/calendar/presentation/bloc/calendar_state.freezed.dart new file mode 100644 index 00000000..c71d5226 --- /dev/null +++ b/lib/features/calendar/presentation/bloc/calendar_state.freezed.dart @@ -0,0 +1,621 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'calendar_state.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$CalendarState { + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function(List calendarList) loaded, + required TResult Function(String errorMessage) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(List calendarList)? loaded, + TResult? Function(String errorMessage)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(List calendarList)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map( + TResult Function(_CalendarState value) $default, { + required TResult Function(CalendarStateLoading value) loading, + required TResult Function(CalendarStateLoaded value) loaded, + required TResult Function(CalendarStateError value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_CalendarState value)? $default, { + TResult? Function(CalendarStateLoading value)? loading, + TResult? Function(CalendarStateLoaded value)? loaded, + TResult? Function(CalendarStateError value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap( + TResult Function(_CalendarState value)? $default, { + TResult Function(CalendarStateLoading value)? loading, + TResult Function(CalendarStateLoaded value)? loaded, + TResult Function(CalendarStateError value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $CalendarStateCopyWith<$Res> { + factory $CalendarStateCopyWith( + CalendarState value, $Res Function(CalendarState) then) = + _$CalendarStateCopyWithImpl<$Res, CalendarState>; +} + +/// @nodoc +class _$CalendarStateCopyWithImpl<$Res, $Val extends CalendarState> + implements $CalendarStateCopyWith<$Res> { + _$CalendarStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$CalendarStateImplCopyWith<$Res> { + factory _$$CalendarStateImplCopyWith( + _$CalendarStateImpl value, $Res Function(_$CalendarStateImpl) then) = + __$$CalendarStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$CalendarStateImplCopyWithImpl<$Res> + extends _$CalendarStateCopyWithImpl<$Res, _$CalendarStateImpl> + implements _$$CalendarStateImplCopyWith<$Res> { + __$$CalendarStateImplCopyWithImpl( + _$CalendarStateImpl _value, $Res Function(_$CalendarStateImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$CalendarStateImpl implements _CalendarState { + const _$CalendarStateImpl(); + + @override + String toString() { + return 'CalendarState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$CalendarStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function(List calendarList) loaded, + required TResult Function(String errorMessage) error, + }) { + return $default(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(List calendarList)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return $default?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(List calendarList)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_CalendarState value) $default, { + required TResult Function(CalendarStateLoading value) loading, + required TResult Function(CalendarStateLoaded value) loaded, + required TResult Function(CalendarStateError value) error, + }) { + return $default(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_CalendarState value)? $default, { + TResult? Function(CalendarStateLoading value)? loading, + TResult? Function(CalendarStateLoaded value)? loaded, + TResult? Function(CalendarStateError value)? error, + }) { + return $default?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_CalendarState value)? $default, { + TResult Function(CalendarStateLoading value)? loading, + TResult Function(CalendarStateLoaded value)? loaded, + TResult Function(CalendarStateError value)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(this); + } + return orElse(); + } +} + +abstract class _CalendarState implements CalendarState { + const factory _CalendarState() = _$CalendarStateImpl; +} + +/// @nodoc +abstract class _$$CalendarStateLoadingImplCopyWith<$Res> { + factory _$$CalendarStateLoadingImplCopyWith(_$CalendarStateLoadingImpl value, + $Res Function(_$CalendarStateLoadingImpl) then) = + __$$CalendarStateLoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$CalendarStateLoadingImplCopyWithImpl<$Res> + extends _$CalendarStateCopyWithImpl<$Res, _$CalendarStateLoadingImpl> + implements _$$CalendarStateLoadingImplCopyWith<$Res> { + __$$CalendarStateLoadingImplCopyWithImpl(_$CalendarStateLoadingImpl _value, + $Res Function(_$CalendarStateLoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$CalendarStateLoadingImpl implements CalendarStateLoading { + const _$CalendarStateLoadingImpl(); + + @override + String toString() { + return 'CalendarState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CalendarStateLoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function(List calendarList) loaded, + required TResult Function(String errorMessage) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(List calendarList)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(List calendarList)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_CalendarState value) $default, { + required TResult Function(CalendarStateLoading value) loading, + required TResult Function(CalendarStateLoaded value) loaded, + required TResult Function(CalendarStateError value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_CalendarState value)? $default, { + TResult? Function(CalendarStateLoading value)? loading, + TResult? Function(CalendarStateLoaded value)? loaded, + TResult? Function(CalendarStateError value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_CalendarState value)? $default, { + TResult Function(CalendarStateLoading value)? loading, + TResult Function(CalendarStateLoaded value)? loaded, + TResult Function(CalendarStateError value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class CalendarStateLoading implements CalendarState { + const factory CalendarStateLoading() = _$CalendarStateLoadingImpl; +} + +/// @nodoc +abstract class _$$CalendarStateLoadedImplCopyWith<$Res> { + factory _$$CalendarStateLoadedImplCopyWith(_$CalendarStateLoadedImpl value, + $Res Function(_$CalendarStateLoadedImpl) then) = + __$$CalendarStateLoadedImplCopyWithImpl<$Res>; + @useResult + $Res call({List calendarList}); +} + +/// @nodoc +class __$$CalendarStateLoadedImplCopyWithImpl<$Res> + extends _$CalendarStateCopyWithImpl<$Res, _$CalendarStateLoadedImpl> + implements _$$CalendarStateLoadedImplCopyWith<$Res> { + __$$CalendarStateLoadedImplCopyWithImpl(_$CalendarStateLoadedImpl _value, + $Res Function(_$CalendarStateLoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? calendarList = null, + }) { + return _then(_$CalendarStateLoadedImpl( + calendarList: null == calendarList + ? _value._calendarList + : calendarList // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc + +class _$CalendarStateLoadedImpl implements CalendarStateLoaded { + const _$CalendarStateLoadedImpl( + {required final List calendarList}) + : _calendarList = calendarList; + + final List _calendarList; + @override + List get calendarList { + if (_calendarList is EqualUnmodifiableListView) return _calendarList; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_calendarList); + } + + @override + String toString() { + return 'CalendarState.loaded(calendarList: $calendarList)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CalendarStateLoadedImpl && + const DeepCollectionEquality() + .equals(other._calendarList, _calendarList)); + } + + @override + int get hashCode => Object.hash( + runtimeType, const DeepCollectionEquality().hash(_calendarList)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$CalendarStateLoadedImplCopyWith<_$CalendarStateLoadedImpl> get copyWith => + __$$CalendarStateLoadedImplCopyWithImpl<_$CalendarStateLoadedImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function(List calendarList) loaded, + required TResult Function(String errorMessage) error, + }) { + return loaded(calendarList); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(List calendarList)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loaded?.call(calendarList); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(List calendarList)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(calendarList); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_CalendarState value) $default, { + required TResult Function(CalendarStateLoading value) loading, + required TResult Function(CalendarStateLoaded value) loaded, + required TResult Function(CalendarStateError value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_CalendarState value)? $default, { + TResult? Function(CalendarStateLoading value)? loading, + TResult? Function(CalendarStateLoaded value)? loaded, + TResult? Function(CalendarStateError value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_CalendarState value)? $default, { + TResult Function(CalendarStateLoading value)? loading, + TResult Function(CalendarStateLoaded value)? loaded, + TResult Function(CalendarStateError value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class CalendarStateLoaded implements CalendarState { + const factory CalendarStateLoaded( + {required final List calendarList}) = + _$CalendarStateLoadedImpl; + + List get calendarList; + @JsonKey(ignore: true) + _$$CalendarStateLoadedImplCopyWith<_$CalendarStateLoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$CalendarStateErrorImplCopyWith<$Res> { + factory _$$CalendarStateErrorImplCopyWith(_$CalendarStateErrorImpl value, + $Res Function(_$CalendarStateErrorImpl) then) = + __$$CalendarStateErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String errorMessage}); +} + +/// @nodoc +class __$$CalendarStateErrorImplCopyWithImpl<$Res> + extends _$CalendarStateCopyWithImpl<$Res, _$CalendarStateErrorImpl> + implements _$$CalendarStateErrorImplCopyWith<$Res> { + __$$CalendarStateErrorImplCopyWithImpl(_$CalendarStateErrorImpl _value, + $Res Function(_$CalendarStateErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? errorMessage = null, + }) { + return _then(_$CalendarStateErrorImpl( + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$CalendarStateErrorImpl implements CalendarStateError { + const _$CalendarStateErrorImpl({required this.errorMessage}); + + @override + final String errorMessage; + + @override + String toString() { + return 'CalendarState.error(errorMessage: $errorMessage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$CalendarStateErrorImpl && + (identical(other.errorMessage, errorMessage) || + other.errorMessage == errorMessage)); + } + + @override + int get hashCode => Object.hash(runtimeType, errorMessage); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$CalendarStateErrorImplCopyWith<_$CalendarStateErrorImpl> get copyWith => + __$$CalendarStateErrorImplCopyWithImpl<_$CalendarStateErrorImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function(List calendarList) loaded, + required TResult Function(String errorMessage) error, + }) { + return error(errorMessage); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(List calendarList)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return error?.call(errorMessage); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(List calendarList)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(errorMessage); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_CalendarState value) $default, { + required TResult Function(CalendarStateLoading value) loading, + required TResult Function(CalendarStateLoaded value) loaded, + required TResult Function(CalendarStateError value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_CalendarState value)? $default, { + TResult? Function(CalendarStateLoading value)? loading, + TResult? Function(CalendarStateLoaded value)? loaded, + TResult? Function(CalendarStateError value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_CalendarState value)? $default, { + TResult Function(CalendarStateLoading value)? loading, + TResult Function(CalendarStateLoaded value)? loaded, + TResult Function(CalendarStateError value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class CalendarStateError implements CalendarState { + const factory CalendarStateError({required final String errorMessage}) = + _$CalendarStateErrorImpl; + + String get errorMessage; + @JsonKey(ignore: true) + _$$CalendarStateErrorImplCopyWith<_$CalendarStateErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/calendar/repositories/calendar_repository.dart b/lib/features/calendar/repositories/calendar_repository.dart new file mode 100644 index 00000000..97a23dca --- /dev/null +++ b/lib/features/calendar/repositories/calendar_repository.dart @@ -0,0 +1,19 @@ +import 'package:eatvio_app/features/calendar/models/calendar_model.dart'; +import 'package:eatvio_app/features/calendar/services/calendar_service.dart'; + +class CalendarRepository { + final CalendarService calendarService; + + CalendarRepository({required this.calendarService}); + + Future> getCalendar() async { + try { + return (await calendarService.getCalendar()) + .entries + .map((entry) => entry.value) + .toList(); + } catch (e) { + rethrow; + } + } +} diff --git a/lib/features/calendar/services/calendar_service.dart b/lib/features/calendar/services/calendar_service.dart new file mode 100644 index 00000000..80b98e6d --- /dev/null +++ b/lib/features/calendar/services/calendar_service.dart @@ -0,0 +1,13 @@ +import 'package:dio/dio.dart'; +import 'package:eatvio_app/features/calendar/models/calendar_model.dart'; +import 'package:retrofit/retrofit.dart'; + +part 'calendar_service.g.dart'; + +@RestApi() +abstract class CalendarService { + factory CalendarService(Dio dio, {String baseUrl}) = _CalendarService; + + @GET('/calendar/index') + Future> getCalendar(); +} diff --git a/lib/features/blog_post_create/services/blog_service.g.dart b/lib/features/calendar/services/calendar_service.g.dart similarity index 81% rename from lib/features/blog_post_create/services/blog_service.g.dart rename to lib/features/calendar/services/calendar_service.g.dart index a6ff68e4..57033789 100644 --- a/lib/features/blog_post_create/services/blog_service.g.dart +++ b/lib/features/calendar/services/calendar_service.g.dart @@ -1,6 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND -part of 'blog_service.dart'; +part of 'calendar_service.dart'; // ************************************************************************** // RetrofitGenerator @@ -8,8 +8,8 @@ part of 'blog_service.dart'; // ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element -class _BlogService implements BlogService { - _BlogService( +class _CalendarService implements CalendarService { + _CalendarService( this._dio, { this.baseUrl, }); @@ -19,21 +19,20 @@ class _BlogService implements BlogService { String? baseUrl; @override - Future createBlogPost( - BlogPostCreateCredentialsModel model) async { + Future> getCalendar() async { final _extra = {}; final queryParameters = {}; final _headers = {}; const Map? _data = null; final _result = await _dio.fetch>( - _setStreamType(Options( - method: 'POST', + _setStreamType>(Options( + method: 'GET', headers: _headers, extra: _extra, ) .compose( _dio.options, - '/api/blog_post/create', + '/calendar/index', queryParameters: queryParameters, data: _data, ) @@ -42,7 +41,8 @@ class _BlogService implements BlogService { _dio.options.baseUrl, baseUrl, )))); - final _value = BlogPostCreateCredentialsModel.fromJson(_result.data!); + var _value = _result.data!.map((k, dynamic v) => + MapEntry(k, CalendarModel.fromJson(v as Map))); return _value; } diff --git a/lib/features/diary/models/diary_model.dart b/lib/features/diary/models/diary_model.dart index 84832f18..3a899363 100644 --- a/lib/features/diary/models/diary_model.dart +++ b/lib/features/diary/models/diary_model.dart @@ -1,116 +1,21 @@ import 'package:freezed_annotation/freezed_annotation.dart'; +import './meal.dart'; part 'diary_model.freezed.dart'; part 'diary_model.g.dart'; @freezed class DiaryModel with _$DiaryModel { - const factory DiaryModel( - {required int id, - required DateTime date, - required DateTime wakeup, - required DateTime retire, - required int closed, - required String comment, - required List meals}) = _DiaryModel; + const factory DiaryModel({ + required int id, + required DateTime date, + required int closed, + required List meals, + String? comment, + DateTime? wakeup, + DateTime? retire, + }) = _DiaryModel; - factory DiaryModel.fromJson(Map json) => _$DiaryModelFromJson(json); -} - -class Meals { - int? id; - String? time; - int? type; - int? satiety; - int? mood; - List? portions; - List? photos; - - Meals({this.id, this.time, this.type, this.satiety, this.mood, this.portions, this.photos}); - - Meals.fromJson(Map json) { - List portions = []; - List photos = []; - id = json['id']; - time = json['time']; - type = json['type']; - satiety = json['satiety']; - mood = json['mood']; - if (json['portions'] != null) { - json['portions'].forEach((v) { - portions.add(new Portions.fromJson(v)); - }); - } - if (json['photos'] != null) { - json['photos'].forEach((v) { - photos.add(new Photos.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['time'] = this.time; - data['type'] = this.type; - data['satiety'] = this.satiety; - data['mood'] = this.mood; - if (this.portions != null) { - data['portions'] = this.portions?.map((v) => v.toJson()).toList(); - } - if (this.photos != null) { - data['photos'] = this.photos?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class Portions { - int? id; - String? productName; - int? quantity; - String? portion; - - Portions({this.id, this.productName, this.quantity, this.portion}); - - Portions.fromJson(Map json) { - id = json['id']; - productName = json['product_name']; - quantity = json['quantity']; - portion = json['portion']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['product_name'] = this.productName; - data['quantity'] = this.quantity; - data['portion'] = this.portion; - return data; - } -} - -class Photos { - int? id; - String? originalName; - String? path; - int? size; - - Photos({this.id, this.originalName, this.path, this.size}); - - Photos.fromJson(Map json) { - id = json['id']; - originalName = json['original_name']; - path = json['path']; - size = json['size']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['original_name'] = this.originalName; - data['path'] = this.path; - data['size'] = this.size; - return data; - } + factory DiaryModel.fromJson(Map json) => + _$DiaryModelFromJson(json); } diff --git a/lib/features/diary/models/diary_model.freezed.dart b/lib/features/diary/models/diary_model.freezed.dart index 5ede0101..3fe59e15 100644 --- a/lib/features/diary/models/diary_model.freezed.dart +++ b/lib/features/diary/models/diary_model.freezed.dart @@ -22,11 +22,11 @@ DiaryModel _$DiaryModelFromJson(Map json) { mixin _$DiaryModel { int get id => throw _privateConstructorUsedError; DateTime get date => throw _privateConstructorUsedError; - DateTime get wakeup => throw _privateConstructorUsedError; - DateTime get retire => throw _privateConstructorUsedError; int get closed => throw _privateConstructorUsedError; - String get comment => throw _privateConstructorUsedError; - List get meals => throw _privateConstructorUsedError; + List get meals => throw _privateConstructorUsedError; + String? get comment => throw _privateConstructorUsedError; + DateTime? get wakeup => throw _privateConstructorUsedError; + DateTime? get retire => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -43,11 +43,11 @@ abstract class $DiaryModelCopyWith<$Res> { $Res call( {int id, DateTime date, - DateTime wakeup, - DateTime retire, int closed, - String comment, - List meals}); + List meals, + String? comment, + DateTime? wakeup, + DateTime? retire}); } /// @nodoc @@ -65,11 +65,11 @@ class _$DiaryModelCopyWithImpl<$Res, $Val extends DiaryModel> $Res call({ Object? id = null, Object? date = null, - Object? wakeup = null, - Object? retire = null, Object? closed = null, - Object? comment = null, Object? meals = null, + Object? comment = freezed, + Object? wakeup = freezed, + Object? retire = freezed, }) { return _then(_value.copyWith( id: null == id @@ -80,26 +80,26 @@ class _$DiaryModelCopyWithImpl<$Res, $Val extends DiaryModel> ? _value.date : date // ignore: cast_nullable_to_non_nullable as DateTime, - wakeup: null == wakeup - ? _value.wakeup - : wakeup // ignore: cast_nullable_to_non_nullable - as DateTime, - retire: null == retire - ? _value.retire - : retire // ignore: cast_nullable_to_non_nullable - as DateTime, closed: null == closed ? _value.closed : closed // ignore: cast_nullable_to_non_nullable as int, - comment: null == comment - ? _value.comment - : comment // ignore: cast_nullable_to_non_nullable - as String, meals: null == meals ? _value.meals : meals // ignore: cast_nullable_to_non_nullable - as List, + as List, + comment: freezed == comment + ? _value.comment + : comment // ignore: cast_nullable_to_non_nullable + as String?, + wakeup: freezed == wakeup + ? _value.wakeup + : wakeup // ignore: cast_nullable_to_non_nullable + as DateTime?, + retire: freezed == retire + ? _value.retire + : retire // ignore: cast_nullable_to_non_nullable + as DateTime?, ) as $Val); } } @@ -115,11 +115,11 @@ abstract class _$$DiaryModelImplCopyWith<$Res> $Res call( {int id, DateTime date, - DateTime wakeup, - DateTime retire, int closed, - String comment, - List meals}); + List meals, + String? comment, + DateTime? wakeup, + DateTime? retire}); } /// @nodoc @@ -135,11 +135,11 @@ class __$$DiaryModelImplCopyWithImpl<$Res> $Res call({ Object? id = null, Object? date = null, - Object? wakeup = null, - Object? retire = null, Object? closed = null, - Object? comment = null, Object? meals = null, + Object? comment = freezed, + Object? wakeup = freezed, + Object? retire = freezed, }) { return _then(_$DiaryModelImpl( id: null == id @@ -150,26 +150,26 @@ class __$$DiaryModelImplCopyWithImpl<$Res> ? _value.date : date // ignore: cast_nullable_to_non_nullable as DateTime, - wakeup: null == wakeup - ? _value.wakeup - : wakeup // ignore: cast_nullable_to_non_nullable - as DateTime, - retire: null == retire - ? _value.retire - : retire // ignore: cast_nullable_to_non_nullable - as DateTime, closed: null == closed ? _value.closed : closed // ignore: cast_nullable_to_non_nullable as int, - comment: null == comment - ? _value.comment - : comment // ignore: cast_nullable_to_non_nullable - as String, meals: null == meals ? _value._meals : meals // ignore: cast_nullable_to_non_nullable - as List, + as List, + comment: freezed == comment + ? _value.comment + : comment // ignore: cast_nullable_to_non_nullable + as String?, + wakeup: freezed == wakeup + ? _value.wakeup + : wakeup // ignore: cast_nullable_to_non_nullable + as DateTime?, + retire: freezed == retire + ? _value.retire + : retire // ignore: cast_nullable_to_non_nullable + as DateTime?, )); } } @@ -180,11 +180,11 @@ class _$DiaryModelImpl implements _DiaryModel { const _$DiaryModelImpl( {required this.id, required this.date, - required this.wakeup, - required this.retire, required this.closed, - required this.comment, - required final List meals}) + required final List meals, + this.comment, + this.wakeup, + this.retire}) : _meals = meals; factory _$DiaryModelImpl.fromJson(Map json) => @@ -195,24 +195,25 @@ class _$DiaryModelImpl implements _DiaryModel { @override final DateTime date; @override - final DateTime wakeup; - @override - final DateTime retire; - @override final int closed; + final List _meals; @override - final String comment; - final List _meals; - @override - List get meals { + List get meals { if (_meals is EqualUnmodifiableListView) return _meals; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_meals); } + @override + final String? comment; + @override + final DateTime? wakeup; + @override + final DateTime? retire; + @override String toString() { - return 'DiaryModel(id: $id, date: $date, wakeup: $wakeup, retire: $retire, closed: $closed, comment: $comment, meals: $meals)'; + return 'DiaryModel(id: $id, date: $date, closed: $closed, meals: $meals, comment: $comment, wakeup: $wakeup, retire: $retire)'; } @override @@ -222,17 +223,17 @@ class _$DiaryModelImpl implements _DiaryModel { other is _$DiaryModelImpl && (identical(other.id, id) || other.id == id) && (identical(other.date, date) || other.date == date) && - (identical(other.wakeup, wakeup) || other.wakeup == wakeup) && - (identical(other.retire, retire) || other.retire == retire) && (identical(other.closed, closed) || other.closed == closed) && + const DeepCollectionEquality().equals(other._meals, _meals) && (identical(other.comment, comment) || other.comment == comment) && - const DeepCollectionEquality().equals(other._meals, _meals)); + (identical(other.wakeup, wakeup) || other.wakeup == wakeup) && + (identical(other.retire, retire) || other.retire == retire)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, id, date, wakeup, retire, closed, - comment, const DeepCollectionEquality().hash(_meals)); + int get hashCode => Object.hash(runtimeType, id, date, closed, + const DeepCollectionEquality().hash(_meals), comment, wakeup, retire); @JsonKey(ignore: true) @override @@ -252,11 +253,11 @@ abstract class _DiaryModel implements DiaryModel { const factory _DiaryModel( {required final int id, required final DateTime date, - required final DateTime wakeup, - required final DateTime retire, required final int closed, - required final String comment, - required final List meals}) = _$DiaryModelImpl; + required final List meals, + final String? comment, + final DateTime? wakeup, + final DateTime? retire}) = _$DiaryModelImpl; factory _DiaryModel.fromJson(Map json) = _$DiaryModelImpl.fromJson; @@ -266,15 +267,15 @@ abstract class _DiaryModel implements DiaryModel { @override DateTime get date; @override - DateTime get wakeup; - @override - DateTime get retire; - @override int get closed; @override - String get comment; + List get meals; @override - List get meals; + String? get comment; + @override + DateTime? get wakeup; + @override + DateTime? get retire; @override @JsonKey(ignore: true) _$$DiaryModelImplCopyWith<_$DiaryModelImpl> get copyWith => diff --git a/lib/features/diary/models/diary_model.g.dart b/lib/features/diary/models/diary_model.g.dart index cab25b61..1a13c7d5 100644 --- a/lib/features/diary/models/diary_model.g.dart +++ b/lib/features/diary/models/diary_model.g.dart @@ -10,22 +10,26 @@ _$DiaryModelImpl _$$DiaryModelImplFromJson(Map json) => _$DiaryModelImpl( id: (json['id'] as num).toInt(), date: DateTime.parse(json['date'] as String), - wakeup: DateTime.parse(json['wakeup'] as String), - retire: DateTime.parse(json['retire'] as String), closed: (json['closed'] as num).toInt(), - comment: json['comment'] as String, meals: (json['meals'] as List) - .map((e) => Meals.fromJson(e as Map)) + .map((e) => Meal.fromJson(e as Map)) .toList(), + comment: json['comment'] as String?, + wakeup: json['wakeup'] == null + ? null + : DateTime.parse(json['wakeup'] as String), + retire: json['retire'] == null + ? null + : DateTime.parse(json['retire'] as String), ); Map _$$DiaryModelImplToJson(_$DiaryModelImpl instance) => { 'id': instance.id, 'date': instance.date.toIso8601String(), - 'wakeup': instance.wakeup.toIso8601String(), - 'retire': instance.retire.toIso8601String(), 'closed': instance.closed, - 'comment': instance.comment, 'meals': instance.meals, + 'comment': instance.comment, + 'wakeup': instance.wakeup?.toIso8601String(), + 'retire': instance.retire?.toIso8601String(), }; diff --git a/lib/features/diary/models/meal.dart b/lib/features/diary/models/meal.dart new file mode 100644 index 00000000..a268a470 --- /dev/null +++ b/lib/features/diary/models/meal.dart @@ -0,0 +1,21 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; +import './portion.dart'; +import './photo.dart'; + +part 'meal.freezed.dart'; +part 'meal.g.dart'; + +@freezed +class Meal with _$Meal { + const factory Meal({ + required int id, + required String time, + required int type, + required int satiety, + required int mood, + required List portions, + required List photos, + }) = _Meal; + + factory Meal.fromJson(Map json) => _$MealFromJson(json); +} diff --git a/lib/features/diary/models/meal.freezed.dart b/lib/features/diary/models/meal.freezed.dart new file mode 100644 index 00000000..2c249b06 --- /dev/null +++ b/lib/features/diary/models/meal.freezed.dart @@ -0,0 +1,291 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'meal.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Meal _$MealFromJson(Map json) { + return _Meal.fromJson(json); +} + +/// @nodoc +mixin _$Meal { + int get id => throw _privateConstructorUsedError; + String get time => throw _privateConstructorUsedError; + int get type => throw _privateConstructorUsedError; + int get satiety => throw _privateConstructorUsedError; + int get mood => throw _privateConstructorUsedError; + List get portions => throw _privateConstructorUsedError; + List get photos => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $MealCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $MealCopyWith<$Res> { + factory $MealCopyWith(Meal value, $Res Function(Meal) then) = + _$MealCopyWithImpl<$Res, Meal>; + @useResult + $Res call( + {int id, + String time, + int type, + int satiety, + int mood, + List portions, + List photos}); +} + +/// @nodoc +class _$MealCopyWithImpl<$Res, $Val extends Meal> + implements $MealCopyWith<$Res> { + _$MealCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? time = null, + Object? type = null, + Object? satiety = null, + Object? mood = null, + Object? portions = null, + Object? photos = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + time: null == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as String, + type: null == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as int, + satiety: null == satiety + ? _value.satiety + : satiety // ignore: cast_nullable_to_non_nullable + as int, + mood: null == mood + ? _value.mood + : mood // ignore: cast_nullable_to_non_nullable + as int, + portions: null == portions + ? _value.portions + : portions // ignore: cast_nullable_to_non_nullable + as List, + photos: null == photos + ? _value.photos + : photos // ignore: cast_nullable_to_non_nullable + as List, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$MealImplCopyWith<$Res> implements $MealCopyWith<$Res> { + factory _$$MealImplCopyWith( + _$MealImpl value, $Res Function(_$MealImpl) then) = + __$$MealImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {int id, + String time, + int type, + int satiety, + int mood, + List portions, + List photos}); +} + +/// @nodoc +class __$$MealImplCopyWithImpl<$Res> + extends _$MealCopyWithImpl<$Res, _$MealImpl> + implements _$$MealImplCopyWith<$Res> { + __$$MealImplCopyWithImpl(_$MealImpl _value, $Res Function(_$MealImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? time = null, + Object? type = null, + Object? satiety = null, + Object? mood = null, + Object? portions = null, + Object? photos = null, + }) { + return _then(_$MealImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + time: null == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as String, + type: null == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as int, + satiety: null == satiety + ? _value.satiety + : satiety // ignore: cast_nullable_to_non_nullable + as int, + mood: null == mood + ? _value.mood + : mood // ignore: cast_nullable_to_non_nullable + as int, + portions: null == portions + ? _value._portions + : portions // ignore: cast_nullable_to_non_nullable + as List, + photos: null == photos + ? _value._photos + : photos // ignore: cast_nullable_to_non_nullable + as List, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$MealImpl implements _Meal { + const _$MealImpl( + {required this.id, + required this.time, + required this.type, + required this.satiety, + required this.mood, + required final List portions, + required final List photos}) + : _portions = portions, + _photos = photos; + + factory _$MealImpl.fromJson(Map json) => + _$$MealImplFromJson(json); + + @override + final int id; + @override + final String time; + @override + final int type; + @override + final int satiety; + @override + final int mood; + final List _portions; + @override + List get portions { + if (_portions is EqualUnmodifiableListView) return _portions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_portions); + } + + final List _photos; + @override + List get photos { + if (_photos is EqualUnmodifiableListView) return _photos; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_photos); + } + + @override + String toString() { + return 'Meal(id: $id, time: $time, type: $type, satiety: $satiety, mood: $mood, portions: $portions, photos: $photos)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$MealImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.time, time) || other.time == time) && + (identical(other.type, type) || other.type == type) && + (identical(other.satiety, satiety) || other.satiety == satiety) && + (identical(other.mood, mood) || other.mood == mood) && + const DeepCollectionEquality().equals(other._portions, _portions) && + const DeepCollectionEquality().equals(other._photos, _photos)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash( + runtimeType, + id, + time, + type, + satiety, + mood, + const DeepCollectionEquality().hash(_portions), + const DeepCollectionEquality().hash(_photos)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$MealImplCopyWith<_$MealImpl> get copyWith => + __$$MealImplCopyWithImpl<_$MealImpl>(this, _$identity); + + @override + Map toJson() { + return _$$MealImplToJson( + this, + ); + } +} + +abstract class _Meal implements Meal { + const factory _Meal( + {required final int id, + required final String time, + required final int type, + required final int satiety, + required final int mood, + required final List portions, + required final List photos}) = _$MealImpl; + + factory _Meal.fromJson(Map json) = _$MealImpl.fromJson; + + @override + int get id; + @override + String get time; + @override + int get type; + @override + int get satiety; + @override + int get mood; + @override + List get portions; + @override + List get photos; + @override + @JsonKey(ignore: true) + _$$MealImplCopyWith<_$MealImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/diary/models/meal.g.dart b/lib/features/diary/models/meal.g.dart new file mode 100644 index 00000000..5536ed92 --- /dev/null +++ b/lib/features/diary/models/meal.g.dart @@ -0,0 +1,32 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'meal.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$MealImpl _$$MealImplFromJson(Map json) => _$MealImpl( + id: (json['id'] as num).toInt(), + time: json['time'] as String, + type: (json['type'] as num).toInt(), + satiety: (json['satiety'] as num).toInt(), + mood: (json['mood'] as num).toInt(), + portions: (json['portions'] as List) + .map((e) => Portion.fromJson(e as Map)) + .toList(), + photos: (json['photos'] as List) + .map((e) => Photo.fromJson(e as Map)) + .toList(), + ); + +Map _$$MealImplToJson(_$MealImpl instance) => + { + 'id': instance.id, + 'time': instance.time, + 'type': instance.type, + 'satiety': instance.satiety, + 'mood': instance.mood, + 'portions': instance.portions, + 'photos': instance.photos, + }; diff --git a/lib/features/diary/models/photo.dart b/lib/features/diary/models/photo.dart new file mode 100644 index 00000000..eef9e8f1 --- /dev/null +++ b/lib/features/diary/models/photo.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'photo.freezed.dart'; +part 'photo.g.dart'; + +@freezed +class Photo with _$Photo { + const factory Photo({ + required int id, + required String original_name, + required String path, + }) = _Photo; + + factory Photo.fromJson(Map json) => _$PhotoFromJson(json); +} diff --git a/lib/features/diary/models/photo.freezed.dart b/lib/features/diary/models/photo.freezed.dart new file mode 100644 index 00000000..d9222864 --- /dev/null +++ b/lib/features/diary/models/photo.freezed.dart @@ -0,0 +1,184 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'photo.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Photo _$PhotoFromJson(Map json) { + return _Photo.fromJson(json); +} + +/// @nodoc +mixin _$Photo { + int get id => throw _privateConstructorUsedError; + String get original_name => throw _privateConstructorUsedError; + String get path => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $PhotoCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PhotoCopyWith<$Res> { + factory $PhotoCopyWith(Photo value, $Res Function(Photo) then) = + _$PhotoCopyWithImpl<$Res, Photo>; + @useResult + $Res call({int id, String original_name, String path}); +} + +/// @nodoc +class _$PhotoCopyWithImpl<$Res, $Val extends Photo> + implements $PhotoCopyWith<$Res> { + _$PhotoCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? original_name = null, + Object? path = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + original_name: null == original_name + ? _value.original_name + : original_name // ignore: cast_nullable_to_non_nullable + as String, + path: null == path + ? _value.path + : path // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PhotoImplCopyWith<$Res> implements $PhotoCopyWith<$Res> { + factory _$$PhotoImplCopyWith( + _$PhotoImpl value, $Res Function(_$PhotoImpl) then) = + __$$PhotoImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int id, String original_name, String path}); +} + +/// @nodoc +class __$$PhotoImplCopyWithImpl<$Res> + extends _$PhotoCopyWithImpl<$Res, _$PhotoImpl> + implements _$$PhotoImplCopyWith<$Res> { + __$$PhotoImplCopyWithImpl( + _$PhotoImpl _value, $Res Function(_$PhotoImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? original_name = null, + Object? path = null, + }) { + return _then(_$PhotoImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + original_name: null == original_name + ? _value.original_name + : original_name // ignore: cast_nullable_to_non_nullable + as String, + path: null == path + ? _value.path + : path // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PhotoImpl implements _Photo { + const _$PhotoImpl( + {required this.id, required this.original_name, required this.path}); + + factory _$PhotoImpl.fromJson(Map json) => + _$$PhotoImplFromJson(json); + + @override + final int id; + @override + final String original_name; + @override + final String path; + + @override + String toString() { + return 'Photo(id: $id, original_name: $original_name, path: $path)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PhotoImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.original_name, original_name) || + other.original_name == original_name) && + (identical(other.path, path) || other.path == path)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, id, original_name, path); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$PhotoImplCopyWith<_$PhotoImpl> get copyWith => + __$$PhotoImplCopyWithImpl<_$PhotoImpl>(this, _$identity); + + @override + Map toJson() { + return _$$PhotoImplToJson( + this, + ); + } +} + +abstract class _Photo implements Photo { + const factory _Photo( + {required final int id, + required final String original_name, + required final String path}) = _$PhotoImpl; + + factory _Photo.fromJson(Map json) = _$PhotoImpl.fromJson; + + @override + int get id; + @override + String get original_name; + @override + String get path; + @override + @JsonKey(ignore: true) + _$$PhotoImplCopyWith<_$PhotoImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/diary/models/photo.g.dart b/lib/features/diary/models/photo.g.dart new file mode 100644 index 00000000..8cd7bcc6 --- /dev/null +++ b/lib/features/diary/models/photo.g.dart @@ -0,0 +1,20 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'photo.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$PhotoImpl _$$PhotoImplFromJson(Map json) => _$PhotoImpl( + id: (json['id'] as num).toInt(), + original_name: json['original_name'] as String, + path: json['path'] as String, + ); + +Map _$$PhotoImplToJson(_$PhotoImpl instance) => + { + 'id': instance.id, + 'original_name': instance.original_name, + 'path': instance.path, + }; diff --git a/lib/features/diary/models/portion.dart b/lib/features/diary/models/portion.dart new file mode 100644 index 00000000..ec4ab1de --- /dev/null +++ b/lib/features/diary/models/portion.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'portion.freezed.dart'; +part 'portion.g.dart'; + +@freezed +class Portion with _$Portion { + const factory Portion({ + required int id, + required String product_name, + required int quantity, + required String portion, + }) = _Portion; + + factory Portion.fromJson(Map json) => + _$PortionFromJson(json); +} diff --git a/lib/features/diary/models/portion.freezed.dart b/lib/features/diary/models/portion.freezed.dart new file mode 100644 index 00000000..a7a35a29 --- /dev/null +++ b/lib/features/diary/models/portion.freezed.dart @@ -0,0 +1,206 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'portion.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Portion _$PortionFromJson(Map json) { + return _Portion.fromJson(json); +} + +/// @nodoc +mixin _$Portion { + int get id => throw _privateConstructorUsedError; + String get product_name => throw _privateConstructorUsedError; + int get quantity => throw _privateConstructorUsedError; + String get portion => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $PortionCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PortionCopyWith<$Res> { + factory $PortionCopyWith(Portion value, $Res Function(Portion) then) = + _$PortionCopyWithImpl<$Res, Portion>; + @useResult + $Res call({int id, String product_name, int quantity, String portion}); +} + +/// @nodoc +class _$PortionCopyWithImpl<$Res, $Val extends Portion> + implements $PortionCopyWith<$Res> { + _$PortionCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? product_name = null, + Object? quantity = null, + Object? portion = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + product_name: null == product_name + ? _value.product_name + : product_name // ignore: cast_nullable_to_non_nullable + as String, + quantity: null == quantity + ? _value.quantity + : quantity // ignore: cast_nullable_to_non_nullable + as int, + portion: null == portion + ? _value.portion + : portion // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PortionImplCopyWith<$Res> implements $PortionCopyWith<$Res> { + factory _$$PortionImplCopyWith( + _$PortionImpl value, $Res Function(_$PortionImpl) then) = + __$$PortionImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int id, String product_name, int quantity, String portion}); +} + +/// @nodoc +class __$$PortionImplCopyWithImpl<$Res> + extends _$PortionCopyWithImpl<$Res, _$PortionImpl> + implements _$$PortionImplCopyWith<$Res> { + __$$PortionImplCopyWithImpl( + _$PortionImpl _value, $Res Function(_$PortionImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? product_name = null, + Object? quantity = null, + Object? portion = null, + }) { + return _then(_$PortionImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + product_name: null == product_name + ? _value.product_name + : product_name // ignore: cast_nullable_to_non_nullable + as String, + quantity: null == quantity + ? _value.quantity + : quantity // ignore: cast_nullable_to_non_nullable + as int, + portion: null == portion + ? _value.portion + : portion // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PortionImpl implements _Portion { + const _$PortionImpl( + {required this.id, + required this.product_name, + required this.quantity, + required this.portion}); + + factory _$PortionImpl.fromJson(Map json) => + _$$PortionImplFromJson(json); + + @override + final int id; + @override + final String product_name; + @override + final int quantity; + @override + final String portion; + + @override + String toString() { + return 'Portion(id: $id, product_name: $product_name, quantity: $quantity, portion: $portion)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PortionImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.product_name, product_name) || + other.product_name == product_name) && + (identical(other.quantity, quantity) || + other.quantity == quantity) && + (identical(other.portion, portion) || other.portion == portion)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => + Object.hash(runtimeType, id, product_name, quantity, portion); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$PortionImplCopyWith<_$PortionImpl> get copyWith => + __$$PortionImplCopyWithImpl<_$PortionImpl>(this, _$identity); + + @override + Map toJson() { + return _$$PortionImplToJson( + this, + ); + } +} + +abstract class _Portion implements Portion { + const factory _Portion( + {required final int id, + required final String product_name, + required final int quantity, + required final String portion}) = _$PortionImpl; + + factory _Portion.fromJson(Map json) = _$PortionImpl.fromJson; + + @override + int get id; + @override + String get product_name; + @override + int get quantity; + @override + String get portion; + @override + @JsonKey(ignore: true) + _$$PortionImplCopyWith<_$PortionImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/diary/models/portion.g.dart b/lib/features/diary/models/portion.g.dart new file mode 100644 index 00000000..c8bd109f --- /dev/null +++ b/lib/features/diary/models/portion.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'portion.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$PortionImpl _$$PortionImplFromJson(Map json) => + _$PortionImpl( + id: (json['id'] as num).toInt(), + product_name: json['product_name'] as String, + quantity: (json['quantity'] as num).toInt(), + portion: json['portion'] as String, + ); + +Map _$$PortionImplToJson(_$PortionImpl instance) => + { + 'id': instance.id, + 'product_name': instance.product_name, + 'quantity': instance.quantity, + 'portion': instance.portion, + }; diff --git a/lib/features/diary/models/product.dart b/lib/features/diary/models/product.dart new file mode 100644 index 00000000..a11896d3 --- /dev/null +++ b/lib/features/diary/models/product.dart @@ -0,0 +1,15 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'product.freezed.dart'; +part 'product.g.dart'; + +@freezed +class Product with _$Product { + const factory Product({ + required int id, + required String name, + }) = _Product; + + factory Product.fromJson(Map json) => + _$ProductFromJson(json); +} diff --git a/lib/features/diary/models/product.freezed.dart b/lib/features/diary/models/product.freezed.dart new file mode 100644 index 00000000..d30ada33 --- /dev/null +++ b/lib/features/diary/models/product.freezed.dart @@ -0,0 +1,164 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'product.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +Product _$ProductFromJson(Map json) { + return _Product.fromJson(json); +} + +/// @nodoc +mixin _$Product { + int get id => throw _privateConstructorUsedError; + String get name => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ProductCopyWith get copyWith => throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $ProductCopyWith<$Res> { + factory $ProductCopyWith(Product value, $Res Function(Product) then) = + _$ProductCopyWithImpl<$Res, Product>; + @useResult + $Res call({int id, String name}); +} + +/// @nodoc +class _$ProductCopyWithImpl<$Res, $Val extends Product> + implements $ProductCopyWith<$Res> { + _$ProductCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$ProductImplCopyWith<$Res> implements $ProductCopyWith<$Res> { + factory _$$ProductImplCopyWith( + _$ProductImpl value, $Res Function(_$ProductImpl) then) = + __$$ProductImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({int id, String name}); +} + +/// @nodoc +class __$$ProductImplCopyWithImpl<$Res> + extends _$ProductCopyWithImpl<$Res, _$ProductImpl> + implements _$$ProductImplCopyWith<$Res> { + __$$ProductImplCopyWithImpl( + _$ProductImpl _value, $Res Function(_$ProductImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = null, + Object? name = null, + }) { + return _then(_$ProductImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + name: null == name + ? _value.name + : name // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ProductImpl implements _Product { + const _$ProductImpl({required this.id, required this.name}); + + factory _$ProductImpl.fromJson(Map json) => + _$$ProductImplFromJson(json); + + @override + final int id; + @override + final String name; + + @override + String toString() { + return 'Product(id: $id, name: $name)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ProductImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.name, name) || other.name == name)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, id, name); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ProductImplCopyWith<_$ProductImpl> get copyWith => + __$$ProductImplCopyWithImpl<_$ProductImpl>(this, _$identity); + + @override + Map toJson() { + return _$$ProductImplToJson( + this, + ); + } +} + +abstract class _Product implements Product { + const factory _Product({required final int id, required final String name}) = + _$ProductImpl; + + factory _Product.fromJson(Map json) = _$ProductImpl.fromJson; + + @override + int get id; + @override + String get name; + @override + @JsonKey(ignore: true) + _$$ProductImplCopyWith<_$ProductImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/diary/models/product.g.dart b/lib/features/diary/models/product.g.dart new file mode 100644 index 00000000..74331101 --- /dev/null +++ b/lib/features/diary/models/product.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'product.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$ProductImpl _$$ProductImplFromJson(Map json) => + _$ProductImpl( + id: (json['id'] as num).toInt(), + name: json['name'] as String, + ); + +Map _$$ProductImplToJson(_$ProductImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + }; diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart new file mode 100644 index 00000000..e6903353 --- /dev/null +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -0,0 +1,489 @@ +import 'dart:async'; +import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/meal.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; +import 'package:eatvio_app/features/diary/repositories/diary_repository.dart'; +import 'package:intl/intl.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import '/core/app_export.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; + +part 'diary_event.dart'; + +/// A bloc that manages the state of a Diary according to the event that is dispatched to it. +class DiaryBloc extends Bloc { + final DiaryRepository diaryRepository; + + DiaryBloc({required this.diaryRepository}) + : super(const DiaryState.loading()) { + on(loadDiary); + on(_changeSatiety); // пользователь нажимает на шкалу сытости + on(_changeMood); // пользователь нажимает на шкалу настроения + on(_changeMealTime); // пользовательяет времяа пиши + on(_changeMeal); + on(_changePortion); + on(_changeWakeup); // пользователь выбирает время пробуждения + on(_changeRetire); // пользователь выбирает время отхода ко сну + on(_toggleMood); + on(_toggleWakeup); + on(_addPortion); //пользователь нажимает "Добавить продукт" + on(_removePortion); + on( + _removeImage, + ); // пользователь нажимает на крестик около продукта + on(_uploadImages); //пользователь нажимает "Добавить фото" + on( + _inputProduct, + ); + on(_finishDay); + on(_sendModeration); + on(_clearInput); + } + + loadDiary( + LoadDiary event, + Emitter emit, + ) async { + emit(const DiaryState.loading()); + try { + Map data = await diaryRepository.getDiaryID(); + + final int? diaryID = data['id']; + final DiaryModel diary = await diaryRepository.getDiary(diaryID ?? 45); + final Meal currentMeal = diary.meals[0]; + + List portionList = [ + SelectionPopupModel(title: "gr"), + SelectionPopupModel(title: "pcs") + ]; + + final Map chartData = + await diaryRepository.getChartData(diaryID ?? 45); + final Map dailyNutritionIntake = + chartData['dailyNutritionIntake']!; + final Map dailyNutritionRecommendations = + chartData['dailyNutritionRecommendation']!; + final double ccal = dailyNutritionIntake['energy']! / + dailyNutritionRecommendations['energy']! * + 100; + final double proteins = dailyNutritionIntake['proteins']! / + dailyNutritionRecommendations['proteins']! * + 100; + final double fats = dailyNutritionIntake['fats']! / + dailyNutritionRecommendations['fats']! * + 100; + final double carbs = dailyNutritionIntake['carbohydrates']! / + dailyNutritionRecommendations['carbohydrates']! * + 100; + + Color getColor(double value) { + if (value >= 99.1) { + return Colors.red; + } else { + return Colors.blue; + } + } + + final List chartDataCounted = [ + NutritionData('Калории', ccal, getColor(ccal)), + NutritionData('Белки', proteins, getColor(proteins)), + NutritionData('Жиры', fats, getColor(fats)), + NutritionData('Углеводы', carbs, getColor(carbs)), + ]; + + List mealList = [ + SelectionPopupModel(title: "Прием пищи 1", id: 1), + SelectionPopupModel(title: "Прием пищи 2", id: 2), + SelectionPopupModel(title: "Прием пищи 3", id: 3), + SelectionPopupModel(title: "Прием пищи 4", id: 4), + SelectionPopupModel(title: "Прием пищи 5", id: 5), + SelectionPopupModel(title: "Прием пищи 6", id: 6), + ]; + + print(dailyNutritionRecommendations); + print(dailyNutritionIntake); + emit(DiaryState.loaded( + diary: diary, + currentMeal: currentMeal, + portions: currentMeal.portions, + portionList: portionList, + portionController: portionList[0], + mealList: mealList, + chartData: chartDataCounted, + selectedMood: currentMeal.mood, + selectedSatiety: currentMeal.satiety, + commentController: TextEditingController(), + product_nameController: TextEditingController(), + productQuantityController: TextEditingController(), + caloriesController: TextEditingController(), + fatsController: TextEditingController(), + proteinsController: TextEditingController(), + carbsController: TextEditingController(), + wakeupExpanded: false, + moderationExpanded: false, + moodExpanded: false, + isLoading: false, + isAdded: false, + autocompleteList: [], + recommendedChartValues: [1, 1, 1, 1], + consumedChartValues: [1, 1, 1, 1])); + } catch (e) { + emit(DiaryState.error(errorMessage: e.toString())); + } + } + + fetchChartValues( + String token, + int diaryID, + Emitter emit, + ) async { + final responseChart = await http.get( + Uri.parse( + dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/dailyNutritionData/', + ), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $token', + }, + ); + + if (responseChart.statusCode == 200) { + final responseBody = jsonDecode(responseChart.body); + print(responseBody); + final recommendedChartValues = + responseBody['dailyNutritionRecommendation'] + .values + .map((value) => convertToInt(value)) + .toList(); + + final consumedChartValues = responseBody['dailyNutritionIntake'] + .values + .map((value) => convertToInt(value)) + .toList(); + + print([ + recommendedChartValues, + consumedChartValues, + ]); + return [ + recommendedChartValues, + consumedChartValues, + ]; + } else { + emit(DiaryStateError( + errorMessage: 'Ошибка при декодировании данных КБЖУ')); + print('fail'); + return [ + [], + [], + ]; + } + } + + Future _changeSatiety( + ChangeSatiety event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = currentState.copyWith( + selectedSatiety: event.selectedElement, + ); + diaryRepository.changeSatiety( + event.selectedElement, + currentState.currentMeal.id, + currentState.diary.id, + ); + emit(updatedState); + } + } + + Future _changeMood( + ChangeMood event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = currentState.copyWith( + selectedMood: event.selectedElement, + ); + + diaryRepository.changeMood( + event.selectedElement, + currentState.currentMeal.id, + currentState.diary.id, + ); + + emit(updatedState); // Передаем обновленное состояние в emit + } + } + + FutureOr _changeWakeup( + WakeupEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = + currentState.copyWith(wakeupController: event.selectedTime); + final DateFormat formatter = DateFormat('HH:mm'); + final String wakeupString = formatter.format(DateTime( + 2022, 1, 1, event.selectedTime.hour, event.selectedTime.minute)); + await diaryRepository.changeWakeup( + currentState.diary.id, + wakeupString, + ); + emit(updatedState); + } + } + + FutureOr _changeRetire( + RetireEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = + currentState.copyWith(retireController: event.selectedTime); + final DateFormat formatter = DateFormat('HH:mm'); + final String retireString = formatter.format(DateTime( + 2022, 1, 1, event.selectedTime.hour, event.selectedTime.minute)); + await diaryRepository.changeRetire( + currentState.diary.id, + retireString, + ); + emit(updatedState); + } + } + + FutureOr _changeMealTime( + ChangeMealTime event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = currentState.copyWith(mealTimeController: event.time); + emit(updatedState); + } + } + + FutureOr _changeMeal( + ChangeMeal event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + final currentState = state as DiaryStateLoaded; + final Meal meal = currentState.diary.meals + .firstWhere((meal) => meal.type == event.value.id); + DiaryStateLoaded updatedState = currentState.copyWith( + currentMeal: meal, + portions: meal.portions, + mealTimeController: toTime(meal.time), + selectedMood: meal.mood, + selectedSatiety: meal.satiety, + ); + emit(updatedState); + } + } + + Future _inputProduct( + ProductInput event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + final Map> productNutritionalValues = + await diaryRepository.inputProduct(event.input); + var updatedState = currentState.copyWith( + product_nameController: TextEditingController(text: event.input), + autocompleteList: + productNutritionalValues['product_nutritional_value'] ?? [], + ); + if (event.input.length > 3) { + updatedState = updatedState.copyWith(moderationExpanded: true); + } else { + updatedState = updatedState.copyWith(moderationExpanded: false); + } + + emit(updatedState); + } + } + + FutureOr _addPortion( + AddPortionEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + await diaryRepository.addPortion( + currentState.diary.id, + currentState.currentMeal.id, + currentState.product_nameController.text, + currentState.portionController.title, + int.parse(currentState.productQuantityController.text), + ); + add(LoadDiary()); + } + } + + Future _removePortion( + RemovePortionEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + await diaryRepository.removePortion( + currentState.diary.id, + currentState.currentMeal.id, + event.portionId, + ); + } + add(LoadDiary()); + } + + Future _uploadImages( + UploadImages event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + emit(currentState.copyWith(isLoading: true)); + await diaryRepository.uploadImage( + event.image.path, + currentState.diary.id, + currentState.currentMeal.id, + ); + add(LoadDiary()); + } + } + + FutureOr _sendModeration( + SendModeration event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + await diaryRepository.sendModeration( + event.name, + event.energyOn100gr, + event.proteinsOn100gr, + event.fatsOn100gr, + event.carbohydratesOn100gr, + ); + } + } + + FutureOr _clearInput( + ClearInput event, + Emitter emit, + ) { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + DiaryStateLoaded updatedState = currentState.copyWith(); + emit(updatedState); + } + } + + FutureOr _changePortion( + ChangePortion event, + Emitter emit, + ) { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + DiaryStateLoaded updatedState = currentState.copyWith( + portionController: event.value, + ); + emit(updatedState); + } + } + + FutureOr _toggleMood( + ToggleMoodExpandedEvent event, + Emitter emit, + ) { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + emit(currentState.copyWith(moodExpanded: !currentState.moodExpanded)); + } + } + + FutureOr _toggleWakeup( + ToggleWakeupExpandedEvent event, + Emitter emit, + ) { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + emit(currentState.copyWith(wakeupExpanded: !currentState.wakeupExpanded)); + } + } + + FutureOr _removeImage( + RemoveImageEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + await diaryRepository.removeImage( + currentState.diary.id, + currentState.currentMeal.id, + int.parse(event.photoID), + event.path, + ); + add(LoadDiary()); + } + } + + Future _finishDay(FinishDay event, Emitter emit) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + await diaryRepository.finishDay( + currentState.diary.id, + currentState.wakeupController, + currentState.retireController, + currentState.commentController.text, + ); + add(LoadDiary()); + } + } + + TimeOfDay toTime(String timeStr) { + List timeParts = timeStr.split(":"); + int hour = int.parse(timeParts[0]); + int minute = int.parse(timeParts[1]); + + TimeOfDay timeOfDay = TimeOfDay(hour: hour, minute: minute); + return timeOfDay; + } + + int compareTypes(a, b) { + return a['type'].compareTo(b['type']); + } + + List fillPortion() { + return [ + SelectionPopupModel(id: 0, title: "порций", isSelected: true), + SelectionPopupModel(id: 1, title: "грамм"), + ]; + } +} + +int convertToInt(dynamic value) { + if (value is int) { + return value; + } else if (value is double) { + return value.toInt(); + } else { + throw FormatException('Unexpected value type: ${value.runtimeType}'); + } +} diff --git a/lib/features/diary/presentation/bloc/diary_cubit.dart b/lib/features/diary/presentation/bloc/diary_cubit.dart deleted file mode 100644 index ddc86761..00000000 --- a/lib/features/diary/presentation/bloc/diary_cubit.dart +++ /dev/null @@ -1,22 +0,0 @@ -/*import 'package:eatvio_app/core/app_export.dart'; -import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; -import 'package:eatvio_app/features/diary/repositories/diary_repository.dart'; - -class DiaryCubit extends Cubit { - final DiaryRepository blogPostRepository; - - DiaryCubit({required this.blogPostRepository}) - : super(const DiaryState.loading()); - - loadDiary(String blogPostID) async { - emit(const DiaryState.loading()); - try { - final blogPost = await blogPostRepository.getDiary(blogPostID); - emit(DiaryState.loaded(blogPost: blogPost)); - } catch (e) { - emit(DiaryState.error(errorMessage: e.toString())); - print(e); - } - } -} -*/ diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart b/lib/features/diary/presentation/bloc/diary_event.dart similarity index 64% rename from lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart rename to lib/features/diary/presentation/bloc/diary_event.dart index 318a7688..490fa0c6 100644 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -1,58 +1,54 @@ // ignore_for_file: must_be_immutable -part of 'diary_edit_bloc.dart'; +part of 'diary_bloc.dart'; /// Abstract class for all events that can be dispatched from the -///DiaryEdit widget. +///Diary widget. /// /// Events must be immutable and implement the [Equatable] interface. @immutable -abstract class DiaryEditEvent extends Equatable {} +abstract class DiaryEvent extends Equatable {} -/// Event that is dispatched when the DiaryEdit widget is first created. -class DiaryEditInitialEvent extends DiaryEditEvent { +/// Event that is dispatched when the Diary widget is first created. +class LoadDiary extends DiaryEvent { @override List get props => []; } -class ChangeSatiety extends DiaryEditEvent { +class ChangeSatiety extends DiaryEvent { ChangeSatiety( this.selectedElement, ); final int selectedElement; - @override List get props => [selectedElement]; } -class ChangeMood extends DiaryEditEvent { +class ChangeMood extends DiaryEvent { ChangeMood( this.selectedElement, ); final int selectedElement; - @override List get props => [selectedElement]; } -class ChangeMealTime extends DiaryEditEvent { +class ChangeMealTime extends DiaryEvent { ChangeMealTime(this.time); final TimeOfDay time; - @override List get props => [time]; } -class AddComment extends DiaryEditEvent { +class AddComment extends DiaryEvent { AddComment(this.diaryId, this.comment); final String comment; final int diaryId; - @override List get props => [comment, diaryId]; } -class WakeupEvent extends DiaryEditEvent { +class WakeupEvent extends DiaryEvent { WakeupEvent(this.selectedTime); final TimeOfDay selectedTime; @@ -60,7 +56,7 @@ class WakeupEvent extends DiaryEditEvent { List get props => [selectedTime]; } -class RetireEvent extends DiaryEditEvent { +class RetireEvent extends DiaryEvent { RetireEvent(this.selectedTime); final TimeOfDay selectedTime; @@ -68,37 +64,37 @@ class RetireEvent extends DiaryEditEvent { List get props => [selectedTime]; } -class ToggleMoodExpandedEvent extends DiaryEditEvent { +class ToggleMoodExpandedEvent extends DiaryEvent { @override List get props => []; } -class ToggleWakeupExpandedEvent extends DiaryEditEvent { +class ToggleWakeupExpandedEvent extends DiaryEvent { @override List get props => []; } -class AddPortionEvent extends DiaryEditEvent { +class AddPortionEvent extends DiaryEvent { AddPortionEvent(); @override List get props => []; } -class RemovePortionEvent extends DiaryEditEvent { +class RemovePortionEvent extends DiaryEvent { RemovePortionEvent(this.portionId); final int portionId; @override List get props => [portionId]; } -class UploadImages extends DiaryEditEvent { +class UploadImages extends DiaryEvent { UploadImages(this.image); final XFile image; @override List get props => [image]; } -class RemoveImageEvent extends DiaryEditEvent { +class RemoveImageEvent extends DiaryEvent { RemoveImageEvent(this.photoID, this.path); final String photoID; final String path; @@ -106,53 +102,48 @@ class RemoveImageEvent extends DiaryEditEvent { List get props => [photoID, path]; } -class ProductInput extends DiaryEditEvent { +class ProductInput extends DiaryEvent { ProductInput(this.input); final String input; @override List get props => [input]; } -class ChangeMeal extends DiaryEditEvent { - ChangeMeal({required this.value, required this.meals}); - +class ChangeMeal extends DiaryEvent { + ChangeMeal({required this.value}); SelectionPopupModel value; - List? meals; @override - List get props => [value, meals]; + List get props => [value]; } -class ClearInput extends DiaryEditEvent { +class ClearInput extends DiaryEvent { ClearInput({required this.value}); - TextEditingController value; @override List get props => [value]; } -class ChangePortion extends DiaryEditEvent { +class ChangePortion extends DiaryEvent { ChangePortion({required this.value}); - SelectionPopupModel value; @override List get props => [value]; } -class FinishDay extends DiaryEditEvent { +class FinishDay extends DiaryEvent { FinishDay(); - @override List get props => []; } -class RefreshEvent extends DiaryEditEvent { +class RefreshEvent extends DiaryEvent { RefreshEvent(); @override List get props => []; } -class SendModeration extends DiaryEditEvent { +class SendModeration extends DiaryEvent { SendModeration({ required this.name, required this.energyOn100gr, @@ -166,5 +157,6 @@ class SendModeration extends DiaryEditEvent { String fatsOn100gr; String carbohydratesOn100gr; @override - List get props => [name, energyOn100gr, proteinsOn100gr, fatsOn100gr, carbohydratesOn100gr]; + List get props => + [name, energyOn100gr, proteinsOn100gr, fatsOn100gr, carbohydratesOn100gr]; } diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index 90e9f4f6..6feb5f14 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -1,6 +1,12 @@ -/*import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/meal.dart'; +import 'package:eatvio_app/features/diary/models/portion.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; +import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; +import '../../../../data/models/selectionPopupModel/selection_popup_model.dart'; + part 'diary_state.freezed.dart'; @freezed @@ -10,11 +16,45 @@ abstract class DiaryState with _$DiaryState { const factory DiaryState.loading() = DiaryStateLoading; const factory DiaryState.loaded({ - required DiaryModel blogPost, + required DiaryModel diary, + String? diaryDate, + required List recommendedChartValues, + required List consumedChartValues, + required List portions, + required List mealList, + required List portionList, + required List autocompleteList, + required Meal currentMeal, + required SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + required TextEditingController commentController, + required TextEditingController product_nameController, + required TextEditingController productQuantityController, + required TextEditingController caloriesController, + required TextEditingController fatsController, + required TextEditingController proteinsController, + required TextEditingController carbsController, + required int selectedMood, + required int selectedSatiety, + required bool wakeupExpanded, + required bool moderationExpanded, + required bool moodExpanded, + required bool isLoading, + required bool isAdded, + List? chartData, }) = DiaryStateLoaded; const factory DiaryState.error({ required String errorMessage, }) = DiaryStateError; } -*/ + +class NutritionData { + NutritionData(this.category, this.nutrition, this.color); + + final String category; + final double nutrition; + final Color color; +} diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart new file mode 100644 index 00000000..deda8724 --- /dev/null +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -0,0 +1,1582 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'diary_state.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +/// @nodoc +mixin _$DiaryState { + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData) + loaded, + required TResult Function(String errorMessage) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult? Function(String errorMessage)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map( + TResult Function(_DiaryState value) $default, { + required TResult Function(DiaryStateLoading value) loading, + required TResult Function(DiaryStateLoaded value) loaded, + required TResult Function(DiaryStateError value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_DiaryState value)? $default, { + TResult? Function(DiaryStateLoading value)? loading, + TResult? Function(DiaryStateLoaded value)? loaded, + TResult? Function(DiaryStateError value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap( + TResult Function(_DiaryState value)? $default, { + TResult Function(DiaryStateLoading value)? loading, + TResult Function(DiaryStateLoaded value)? loaded, + TResult Function(DiaryStateError value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $DiaryStateCopyWith<$Res> { + factory $DiaryStateCopyWith( + DiaryState value, $Res Function(DiaryState) then) = + _$DiaryStateCopyWithImpl<$Res, DiaryState>; +} + +/// @nodoc +class _$DiaryStateCopyWithImpl<$Res, $Val extends DiaryState> + implements $DiaryStateCopyWith<$Res> { + _$DiaryStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; +} + +/// @nodoc +abstract class _$$DiaryStateImplCopyWith<$Res> { + factory _$$DiaryStateImplCopyWith( + _$DiaryStateImpl value, $Res Function(_$DiaryStateImpl) then) = + __$$DiaryStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$DiaryStateImplCopyWithImpl<$Res> + extends _$DiaryStateCopyWithImpl<$Res, _$DiaryStateImpl> + implements _$$DiaryStateImplCopyWith<$Res> { + __$$DiaryStateImplCopyWithImpl( + _$DiaryStateImpl _value, $Res Function(_$DiaryStateImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$DiaryStateImpl implements _DiaryState { + const _$DiaryStateImpl(); + + @override + String toString() { + return 'DiaryState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$DiaryStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData) + loaded, + required TResult Function(String errorMessage) error, + }) { + return $default(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult? Function(String errorMessage)? error, + }) { + return $default?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_DiaryState value) $default, { + required TResult Function(DiaryStateLoading value) loading, + required TResult Function(DiaryStateLoaded value) loaded, + required TResult Function(DiaryStateError value) error, + }) { + return $default(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_DiaryState value)? $default, { + TResult? Function(DiaryStateLoading value)? loading, + TResult? Function(DiaryStateLoaded value)? loaded, + TResult? Function(DiaryStateError value)? error, + }) { + return $default?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_DiaryState value)? $default, { + TResult Function(DiaryStateLoading value)? loading, + TResult Function(DiaryStateLoaded value)? loaded, + TResult Function(DiaryStateError value)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(this); + } + return orElse(); + } +} + +abstract class _DiaryState implements DiaryState { + const factory _DiaryState() = _$DiaryStateImpl; +} + +/// @nodoc +abstract class _$$DiaryStateLoadingImplCopyWith<$Res> { + factory _$$DiaryStateLoadingImplCopyWith(_$DiaryStateLoadingImpl value, + $Res Function(_$DiaryStateLoadingImpl) then) = + __$$DiaryStateLoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$DiaryStateLoadingImplCopyWithImpl<$Res> + extends _$DiaryStateCopyWithImpl<$Res, _$DiaryStateLoadingImpl> + implements _$$DiaryStateLoadingImplCopyWith<$Res> { + __$$DiaryStateLoadingImplCopyWithImpl(_$DiaryStateLoadingImpl _value, + $Res Function(_$DiaryStateLoadingImpl) _then) + : super(_value, _then); +} + +/// @nodoc + +class _$DiaryStateLoadingImpl implements DiaryStateLoading { + const _$DiaryStateLoadingImpl(); + + @override + String toString() { + return 'DiaryState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && other is _$DiaryStateLoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData) + loaded, + required TResult Function(String errorMessage) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult? Function(String errorMessage)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_DiaryState value) $default, { + required TResult Function(DiaryStateLoading value) loading, + required TResult Function(DiaryStateLoaded value) loaded, + required TResult Function(DiaryStateError value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_DiaryState value)? $default, { + TResult? Function(DiaryStateLoading value)? loading, + TResult? Function(DiaryStateLoaded value)? loaded, + TResult? Function(DiaryStateError value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_DiaryState value)? $default, { + TResult Function(DiaryStateLoading value)? loading, + TResult Function(DiaryStateLoaded value)? loaded, + TResult Function(DiaryStateError value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class DiaryStateLoading implements DiaryState { + const factory DiaryStateLoading() = _$DiaryStateLoadingImpl; +} + +/// @nodoc +abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { + factory _$$DiaryStateLoadedImplCopyWith(_$DiaryStateLoadedImpl value, + $Res Function(_$DiaryStateLoadedImpl) then) = + __$$DiaryStateLoadedImplCopyWithImpl<$Res>; + @useResult + $Res call( + {DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData}); + + $DiaryModelCopyWith<$Res> get diary; + $MealCopyWith<$Res> get currentMeal; +} + +/// @nodoc +class __$$DiaryStateLoadedImplCopyWithImpl<$Res> + extends _$DiaryStateCopyWithImpl<$Res, _$DiaryStateLoadedImpl> + implements _$$DiaryStateLoadedImplCopyWith<$Res> { + __$$DiaryStateLoadedImplCopyWithImpl(_$DiaryStateLoadedImpl _value, + $Res Function(_$DiaryStateLoadedImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? diary = null, + Object? diaryDate = freezed, + Object? recommendedChartValues = null, + Object? consumedChartValues = null, + Object? portions = null, + Object? mealList = null, + Object? portionList = null, + Object? autocompleteList = null, + Object? currentMeal = null, + Object? portionController = null, + Object? wakeupController = freezed, + Object? retireController = freezed, + Object? mealTimeController = freezed, + Object? commentController = null, + Object? product_nameController = null, + Object? productQuantityController = null, + Object? caloriesController = null, + Object? fatsController = null, + Object? proteinsController = null, + Object? carbsController = null, + Object? selectedMood = null, + Object? selectedSatiety = null, + Object? wakeupExpanded = null, + Object? moderationExpanded = null, + Object? moodExpanded = null, + Object? isLoading = null, + Object? isAdded = null, + Object? chartData = freezed, + }) { + return _then(_$DiaryStateLoadedImpl( + diary: null == diary + ? _value.diary + : diary // ignore: cast_nullable_to_non_nullable + as DiaryModel, + diaryDate: freezed == diaryDate + ? _value.diaryDate + : diaryDate // ignore: cast_nullable_to_non_nullable + as String?, + recommendedChartValues: null == recommendedChartValues + ? _value._recommendedChartValues + : recommendedChartValues // ignore: cast_nullable_to_non_nullable + as List, + consumedChartValues: null == consumedChartValues + ? _value._consumedChartValues + : consumedChartValues // ignore: cast_nullable_to_non_nullable + as List, + portions: null == portions + ? _value._portions + : portions // ignore: cast_nullable_to_non_nullable + as List, + mealList: null == mealList + ? _value._mealList + : mealList // ignore: cast_nullable_to_non_nullable + as List, + portionList: null == portionList + ? _value._portionList + : portionList // ignore: cast_nullable_to_non_nullable + as List, + autocompleteList: null == autocompleteList + ? _value._autocompleteList + : autocompleteList // ignore: cast_nullable_to_non_nullable + as List, + currentMeal: null == currentMeal + ? _value.currentMeal + : currentMeal // ignore: cast_nullable_to_non_nullable + as Meal, + portionController: null == portionController + ? _value.portionController + : portionController // ignore: cast_nullable_to_non_nullable + as SelectionPopupModel, + wakeupController: freezed == wakeupController + ? _value.wakeupController + : wakeupController // ignore: cast_nullable_to_non_nullable + as TimeOfDay?, + retireController: freezed == retireController + ? _value.retireController + : retireController // ignore: cast_nullable_to_non_nullable + as TimeOfDay?, + mealTimeController: freezed == mealTimeController + ? _value.mealTimeController + : mealTimeController // ignore: cast_nullable_to_non_nullable + as TimeOfDay?, + commentController: null == commentController + ? _value.commentController + : commentController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + product_nameController: null == product_nameController + ? _value.product_nameController + : product_nameController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + productQuantityController: null == productQuantityController + ? _value.productQuantityController + : productQuantityController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + caloriesController: null == caloriesController + ? _value.caloriesController + : caloriesController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + fatsController: null == fatsController + ? _value.fatsController + : fatsController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + proteinsController: null == proteinsController + ? _value.proteinsController + : proteinsController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + carbsController: null == carbsController + ? _value.carbsController + : carbsController // ignore: cast_nullable_to_non_nullable + as TextEditingController, + selectedMood: null == selectedMood + ? _value.selectedMood + : selectedMood // ignore: cast_nullable_to_non_nullable + as int, + selectedSatiety: null == selectedSatiety + ? _value.selectedSatiety + : selectedSatiety // ignore: cast_nullable_to_non_nullable + as int, + wakeupExpanded: null == wakeupExpanded + ? _value.wakeupExpanded + : wakeupExpanded // ignore: cast_nullable_to_non_nullable + as bool, + moderationExpanded: null == moderationExpanded + ? _value.moderationExpanded + : moderationExpanded // ignore: cast_nullable_to_non_nullable + as bool, + moodExpanded: null == moodExpanded + ? _value.moodExpanded + : moodExpanded // ignore: cast_nullable_to_non_nullable + as bool, + isLoading: null == isLoading + ? _value.isLoading + : isLoading // ignore: cast_nullable_to_non_nullable + as bool, + isAdded: null == isAdded + ? _value.isAdded + : isAdded // ignore: cast_nullable_to_non_nullable + as bool, + chartData: freezed == chartData + ? _value._chartData + : chartData // ignore: cast_nullable_to_non_nullable + as List?, + )); + } + + @override + @pragma('vm:prefer-inline') + $DiaryModelCopyWith<$Res> get diary { + return $DiaryModelCopyWith<$Res>(_value.diary, (value) { + return _then(_value.copyWith(diary: value)); + }); + } + + @override + @pragma('vm:prefer-inline') + $MealCopyWith<$Res> get currentMeal { + return $MealCopyWith<$Res>(_value.currentMeal, (value) { + return _then(_value.copyWith(currentMeal: value)); + }); + } +} + +/// @nodoc + +class _$DiaryStateLoadedImpl implements DiaryStateLoaded { + const _$DiaryStateLoadedImpl( + {required this.diary, + this.diaryDate, + required final List recommendedChartValues, + required final List consumedChartValues, + required final List portions, + required final List mealList, + required final List portionList, + required final List autocompleteList, + required this.currentMeal, + required this.portionController, + this.wakeupController, + this.retireController, + this.mealTimeController, + required this.commentController, + required this.product_nameController, + required this.productQuantityController, + required this.caloriesController, + required this.fatsController, + required this.proteinsController, + required this.carbsController, + required this.selectedMood, + required this.selectedSatiety, + required this.wakeupExpanded, + required this.moderationExpanded, + required this.moodExpanded, + required this.isLoading, + required this.isAdded, + final List? chartData}) + : _recommendedChartValues = recommendedChartValues, + _consumedChartValues = consumedChartValues, + _portions = portions, + _mealList = mealList, + _portionList = portionList, + _autocompleteList = autocompleteList, + _chartData = chartData; + + @override + final DiaryModel diary; + @override + final String? diaryDate; + final List _recommendedChartValues; + @override + List get recommendedChartValues { + if (_recommendedChartValues is EqualUnmodifiableListView) + return _recommendedChartValues; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_recommendedChartValues); + } + + final List _consumedChartValues; + @override + List get consumedChartValues { + if (_consumedChartValues is EqualUnmodifiableListView) + return _consumedChartValues; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_consumedChartValues); + } + + final List _portions; + @override + List get portions { + if (_portions is EqualUnmodifiableListView) return _portions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_portions); + } + + final List _mealList; + @override + List get mealList { + if (_mealList is EqualUnmodifiableListView) return _mealList; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_mealList); + } + + final List _portionList; + @override + List get portionList { + if (_portionList is EqualUnmodifiableListView) return _portionList; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_portionList); + } + + final List _autocompleteList; + @override + List get autocompleteList { + if (_autocompleteList is EqualUnmodifiableListView) + return _autocompleteList; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_autocompleteList); + } + + @override + final Meal currentMeal; + @override + final SelectionPopupModel portionController; + @override + final TimeOfDay? wakeupController; + @override + final TimeOfDay? retireController; + @override + final TimeOfDay? mealTimeController; + @override + final TextEditingController commentController; + @override + final TextEditingController product_nameController; + @override + final TextEditingController productQuantityController; + @override + final TextEditingController caloriesController; + @override + final TextEditingController fatsController; + @override + final TextEditingController proteinsController; + @override + final TextEditingController carbsController; + @override + final int selectedMood; + @override + final int selectedSatiety; + @override + final bool wakeupExpanded; + @override + final bool moderationExpanded; + @override + final bool moodExpanded; + @override + final bool isLoading; + @override + final bool isAdded; + final List? _chartData; + @override + List? get chartData { + final value = _chartData; + if (value == null) return null; + if (_chartData is EqualUnmodifiableListView) return _chartData; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @override + String toString() { + return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, mealList: $mealList, portionList: $portionList, autocompleteList: $autocompleteList, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, product_nameController: $product_nameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded, chartData: $chartData)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DiaryStateLoadedImpl && + (identical(other.diary, diary) || other.diary == diary) && + (identical(other.diaryDate, diaryDate) || + other.diaryDate == diaryDate) && + const DeepCollectionEquality().equals( + other._recommendedChartValues, _recommendedChartValues) && + const DeepCollectionEquality() + .equals(other._consumedChartValues, _consumedChartValues) && + const DeepCollectionEquality().equals(other._portions, _portions) && + const DeepCollectionEquality().equals(other._mealList, _mealList) && + const DeepCollectionEquality() + .equals(other._portionList, _portionList) && + const DeepCollectionEquality() + .equals(other._autocompleteList, _autocompleteList) && + (identical(other.currentMeal, currentMeal) || + other.currentMeal == currentMeal) && + (identical(other.portionController, portionController) || + other.portionController == portionController) && + (identical(other.wakeupController, wakeupController) || + other.wakeupController == wakeupController) && + (identical(other.retireController, retireController) || + other.retireController == retireController) && + (identical(other.mealTimeController, mealTimeController) || + other.mealTimeController == mealTimeController) && + (identical(other.commentController, commentController) || + other.commentController == commentController) && + (identical(other.product_nameController, product_nameController) || + other.product_nameController == product_nameController) && + (identical(other.productQuantityController, + productQuantityController) || + other.productQuantityController == productQuantityController) && + (identical(other.caloriesController, caloriesController) || + other.caloriesController == caloriesController) && + (identical(other.fatsController, fatsController) || + other.fatsController == fatsController) && + (identical(other.proteinsController, proteinsController) || + other.proteinsController == proteinsController) && + (identical(other.carbsController, carbsController) || + other.carbsController == carbsController) && + (identical(other.selectedMood, selectedMood) || + other.selectedMood == selectedMood) && + (identical(other.selectedSatiety, selectedSatiety) || + other.selectedSatiety == selectedSatiety) && + (identical(other.wakeupExpanded, wakeupExpanded) || + other.wakeupExpanded == wakeupExpanded) && + (identical(other.moderationExpanded, moderationExpanded) || + other.moderationExpanded == moderationExpanded) && + (identical(other.moodExpanded, moodExpanded) || + other.moodExpanded == moodExpanded) && + (identical(other.isLoading, isLoading) || + other.isLoading == isLoading) && + (identical(other.isAdded, isAdded) || other.isAdded == isAdded) && + const DeepCollectionEquality() + .equals(other._chartData, _chartData)); + } + + @override + int get hashCode => Object.hashAll([ + runtimeType, + diary, + diaryDate, + const DeepCollectionEquality().hash(_recommendedChartValues), + const DeepCollectionEquality().hash(_consumedChartValues), + const DeepCollectionEquality().hash(_portions), + const DeepCollectionEquality().hash(_mealList), + const DeepCollectionEquality().hash(_portionList), + const DeepCollectionEquality().hash(_autocompleteList), + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + product_nameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded, + const DeepCollectionEquality().hash(_chartData) + ]); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DiaryStateLoadedImplCopyWith<_$DiaryStateLoadedImpl> get copyWith => + __$$DiaryStateLoadedImplCopyWithImpl<_$DiaryStateLoadedImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData) + loaded, + required TResult Function(String errorMessage) error, + }) { + return loaded( + diary, + diaryDate, + recommendedChartValues, + consumedChartValues, + portions, + mealList, + portionList, + autocompleteList, + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + product_nameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded, + chartData); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult? Function(String errorMessage)? error, + }) { + return loaded?.call( + diary, + diaryDate, + recommendedChartValues, + consumedChartValues, + portions, + mealList, + portionList, + autocompleteList, + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + product_nameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded, + chartData); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded( + diary, + diaryDate, + recommendedChartValues, + consumedChartValues, + portions, + mealList, + portionList, + autocompleteList, + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + product_nameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded, + chartData); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_DiaryState value) $default, { + required TResult Function(DiaryStateLoading value) loading, + required TResult Function(DiaryStateLoaded value) loaded, + required TResult Function(DiaryStateError value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_DiaryState value)? $default, { + TResult? Function(DiaryStateLoading value)? loading, + TResult? Function(DiaryStateLoaded value)? loaded, + TResult? Function(DiaryStateError value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_DiaryState value)? $default, { + TResult Function(DiaryStateLoading value)? loading, + TResult Function(DiaryStateLoaded value)? loaded, + TResult Function(DiaryStateError value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class DiaryStateLoaded implements DiaryState { + const factory DiaryStateLoaded( + {required final DiaryModel diary, + final String? diaryDate, + required final List recommendedChartValues, + required final List consumedChartValues, + required final List portions, + required final List mealList, + required final List portionList, + required final List autocompleteList, + required final Meal currentMeal, + required final SelectionPopupModel portionController, + final TimeOfDay? wakeupController, + final TimeOfDay? retireController, + final TimeOfDay? mealTimeController, + required final TextEditingController commentController, + required final TextEditingController product_nameController, + required final TextEditingController productQuantityController, + required final TextEditingController caloriesController, + required final TextEditingController fatsController, + required final TextEditingController proteinsController, + required final TextEditingController carbsController, + required final int selectedMood, + required final int selectedSatiety, + required final bool wakeupExpanded, + required final bool moderationExpanded, + required final bool moodExpanded, + required final bool isLoading, + required final bool isAdded, + final List? chartData}) = _$DiaryStateLoadedImpl; + + DiaryModel get diary; + String? get diaryDate; + List get recommendedChartValues; + List get consumedChartValues; + List get portions; + List get mealList; + List get portionList; + List get autocompleteList; + Meal get currentMeal; + SelectionPopupModel get portionController; + TimeOfDay? get wakeupController; + TimeOfDay? get retireController; + TimeOfDay? get mealTimeController; + TextEditingController get commentController; + TextEditingController get product_nameController; + TextEditingController get productQuantityController; + TextEditingController get caloriesController; + TextEditingController get fatsController; + TextEditingController get proteinsController; + TextEditingController get carbsController; + int get selectedMood; + int get selectedSatiety; + bool get wakeupExpanded; + bool get moderationExpanded; + bool get moodExpanded; + bool get isLoading; + bool get isAdded; + List? get chartData; + @JsonKey(ignore: true) + _$$DiaryStateLoadedImplCopyWith<_$DiaryStateLoadedImpl> get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class _$$DiaryStateErrorImplCopyWith<$Res> { + factory _$$DiaryStateErrorImplCopyWith(_$DiaryStateErrorImpl value, + $Res Function(_$DiaryStateErrorImpl) then) = + __$$DiaryStateErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String errorMessage}); +} + +/// @nodoc +class __$$DiaryStateErrorImplCopyWithImpl<$Res> + extends _$DiaryStateCopyWithImpl<$Res, _$DiaryStateErrorImpl> + implements _$$DiaryStateErrorImplCopyWith<$Res> { + __$$DiaryStateErrorImplCopyWithImpl( + _$DiaryStateErrorImpl _value, $Res Function(_$DiaryStateErrorImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? errorMessage = null, + }) { + return _then(_$DiaryStateErrorImpl( + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$DiaryStateErrorImpl implements DiaryStateError { + const _$DiaryStateErrorImpl({required this.errorMessage}); + + @override + final String errorMessage; + + @override + String toString() { + return 'DiaryState.error(errorMessage: $errorMessage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DiaryStateErrorImpl && + (identical(other.errorMessage, errorMessage) || + other.errorMessage == errorMessage)); + } + + @override + int get hashCode => Object.hash(runtimeType, errorMessage); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DiaryStateErrorImplCopyWith<_$DiaryStateErrorImpl> get copyWith => + __$$DiaryStateErrorImplCopyWithImpl<_$DiaryStateErrorImpl>( + this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData) + loaded, + required TResult Function(String errorMessage) error, + }) { + return error(errorMessage); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult? Function(String errorMessage)? error, + }) { + return error?.call(errorMessage); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function( + DiaryModel diary, + String? diaryDate, + List recommendedChartValues, + List consumedChartValues, + List portions, + List mealList, + List portionList, + List autocompleteList, + Meal currentMeal, + SelectionPopupModel portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController commentController, + TextEditingController product_nameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, + int selectedMood, + int selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded, + List? chartData)? + loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(errorMessage); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_DiaryState value) $default, { + required TResult Function(DiaryStateLoading value) loading, + required TResult Function(DiaryStateLoaded value) loaded, + required TResult Function(DiaryStateError value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_DiaryState value)? $default, { + TResult? Function(DiaryStateLoading value)? loading, + TResult? Function(DiaryStateLoaded value)? loaded, + TResult? Function(DiaryStateError value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_DiaryState value)? $default, { + TResult Function(DiaryStateLoading value)? loading, + TResult Function(DiaryStateLoaded value)? loaded, + TResult Function(DiaryStateError value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class DiaryStateError implements DiaryState { + const factory DiaryStateError({required final String errorMessage}) = + _$DiaryStateErrorImpl; + + String get errorMessage; + @JsonKey(ignore: true) + _$$DiaryStateErrorImplCopyWith<_$DiaryStateErrorImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 7218cf61..53937a94 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -1,57 +1,64 @@ // ignore_for_file: unused_local_variable -/*import 'bloc/diary_edit_bloc.dart'; -import 'models/diary_edit_model.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_form_builder/flutter_form_builder.dart'; -import 'package:fl_chart/fl_chart.dart'; -import 'package:image_picker/image_picker.dart'; - +import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/meal.dart'; +import 'package:eatvio_app/features/diary/models/photo.dart'; +import 'package:eatvio_app/features/diary/models/portion.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_bloc.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; import 'package:eatvio_app/core/app_export.dart'; import 'package:eatvio_app/widgets/custom_edit_text_form_field.dart'; import 'package:eatvio_app/widgets/custom_edit_drop_down.dart'; import 'package:eatvio_app/widgets/custom_outlined_button.dart'; import 'package:eatvio_app/widgets/custom_scale_element.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:carousel_slider/carousel_slider.dart'; +import 'package:syncfusion_flutter_charts/charts.dart'; // ignore: must_be_immutable -class DiaryEditScreen extends StatelessWidget { - DiaryEditScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => - DiaryEditBloc(DiaryEditState(diaryEditModelObj: DiaryEditModel())) - ..add(DiaryEditInitialEvent()), - child: DiaryEditScreen(), - ); - } - +class DiaryScreen extends StatelessWidget { + DiaryScreen({Key? key}) : super(key: key); Widget build(BuildContext context) { - return BlocBuilder( + return BlocBuilder( builder: (context, state) { - if (state is DiaryEditInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, + if (state is DiaryStateLoaded) { + return _buildDiary(context, state); + } else if (state is DiaryStateLoading) { + return Scaffold( + body: Center( + child: CupertinoActivityIndicator(), + ), + ); + } else if (state is DiaryStateError) { + return Scaffold( + body: Padding( + padding: const EdgeInsets.all(16), + child: Center( + child: Text(state.errorMessage), + ), + ), + ); + } else + return Scaffold( + body: Padding( + padding: const EdgeInsets.all(16), + child: Center( + child: Text("Неопределенная ошибка"), + ), + ), ); - } else if (state is DiaryEditLoadedState) { - // Данные загружены, можно строить экран. - return _buildDiaryEditScreen(context, state); - } else if (state is DiaryEditErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } }, ); } - Widget _buildDiaryEditScreen( - BuildContext context, DiaryEditLoadedState state) { + Widget _buildDiary(BuildContext context, DiaryStateLoaded state) { return RefreshIndicator( onRefresh: refreshPage(context), child: Stack( @@ -82,7 +89,7 @@ class DiaryEditScreen extends StatelessWidget { _buildMeal(context, state), SizedBox(height: 20.v), _buildMood(context, state), - SizedBox(height: 30.v), + SizedBox(height: 20.v), _buildNutritionChart(context, state), SizedBox(height: 30.v), _buildComment(context, state), @@ -102,6 +109,39 @@ class DiaryEditScreen extends StatelessWidget { ); } + _buildNutritionChart(BuildContext context, DiaryStateLoaded state) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 16.h, vertical: 16.h), + padding: EdgeInsets.symmetric( + horizontal: 24.h, + vertical: 12.v, + ), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(12)), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 5, + offset: Offset(0, 3), + ), + ], + ), + child: SfCircularChart( + title: ChartTitle(text: 'График КБЖУ'), + legend: Legend(isVisible: true), + series: [ + RadialBarSeries( + dataSource: state.chartData, + xValueMapper: (NutritionData data, _) => data.category, + yValueMapper: (NutritionData data, _) => data.nutrition, + pointColorMapper: (NutritionData data, _) => data.color, + ) + ], + )); + } + _buildEndDay(BuildContext context) { return CustomOutlinedButton( text: "Закончить день", @@ -115,19 +155,18 @@ class DiaryEditScreen extends StatelessWidget { color: Colors.transparent, ), onPressed: onFinishDayPressed(context), - // Установите прозрачный фон ); } refreshPage(BuildContext context) { return () async { - context.read().add(RefreshEvent()); + context.read().add(RefreshEvent()); }; } /// Section Widget - _buildHeaderRow(BuildContext context, DiaryEditLoadedState state) { - final day = state.diaryId; + _buildHeaderRow(BuildContext context, DiaryStateLoaded state) { + final day = state.diary.id; return Container( margin: EdgeInsets.symmetric(horizontal: 16.h, vertical: 16.h), padding: EdgeInsets.symmetric( @@ -162,7 +201,7 @@ class DiaryEditScreen extends StatelessWidget { ), SizedBox(height: 2.v), Text( - state.diaryDate.toString(), + state.diary.date.toString(), style: CustomTextStyles.bodyMediumBluegray800, ), ], @@ -174,7 +213,7 @@ class DiaryEditScreen extends StatelessWidget { } /// Section Widget - _buildAddProduct(BuildContext context, DiaryEditLoadedState state) { + _buildAddProduct(BuildContext context, DiaryState state) { return CustomOutlinedButton( text: "Добавить продукт", margin: EdgeInsets.symmetric(horizontal: 10.h), @@ -185,12 +224,12 @@ class DiaryEditScreen extends StatelessWidget { addProduct(BuildContext context) { return () { - context.read().add(AddPortionEvent()); + context.read().add(AddPortionEvent()); }; } /// Section Widget - _buildAddPhoto(BuildContext context, DiaryEditLoadedState state) { + _buildAddPhoto(BuildContext context, DiaryStateLoaded state) { bool isLoading = state.isLoading; return GestureDetector( onTap: addImage(context, isLoading), @@ -210,8 +249,6 @@ class DiaryEditScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.min, children: [ - // Показывайте прелоадер, если загрузка активна - Padding( padding: EdgeInsets.only( left: 7.h, @@ -258,18 +295,17 @@ class DiaryEditScreen extends StatelessWidget { List? images = await picker.pickMultiImage(); if (images.isNotEmpty) { for (var image in images) { - context.read().add(UploadImages(image)); + context.read().add(UploadImages(image)); } } }; } } - _buildMeal(BuildContext context, DiaryEditLoadedState state) { + _buildMeal(BuildContext context, DiaryStateLoaded state) { final digitsOnly = FilteringTextInputFormatter.digitsOnly; List _options = - state.autocompleteList!.map((dynamic item) => item as String).toList(); - //print(_options); + state.autocompleteList.map((Product item) => item.name).toList(); FocusNode focusNodeName = FocusNode(); return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -329,17 +365,21 @@ class DiaryEditScreen extends StatelessWidget { SizedBox(height: 20.v), Padding( padding: EdgeInsets.symmetric(horizontal: 10.h), - child: BlocSelector( - selector: (state) => state.diaryEditModelObj, - builder: (context, diaryEditModelObj) { + child: BlocSelector( + selector: (state) { + if (state is DiaryStateLoaded) + return state.diary; + else + return null; + }, + builder: (context, diary) { return CustomDropDown( - hintText: "Прием пищи", - items: diaryEditModelObj?.mealList, + items: state.mealList, contentPadding: EdgeInsets.symmetric( horizontal: 10.h, vertical: 9.v, ), - defaultValue: diaryEditModelObj?.mealList[0], + defaultValue: state.mealList[0], onChanged: changeMeal(context, state), ); }, @@ -424,13 +464,17 @@ class DiaryEditScreen extends StatelessWidget { ), Padding( padding: EdgeInsets.only(left: 30.h), - child: BlocSelector( - selector: (state) => state.diaryEditModelObj, - builder: (context, diaryEditModelObj) { + child: BlocSelector( + selector: (state) { + if (state is DiaryStateLoaded) { + return state.diary; + } else + return null; + }, + builder: (context, diary) { return CustomDropDown( - items: diaryEditModelObj?.portionList, - defaultValue: diaryEditModelObj?.portionList?[0], + items: state.portionList, + defaultValue: state.portionController, onChanged: changePortion(context, state), ); }, @@ -443,17 +487,10 @@ class DiaryEditScreen extends StatelessWidget { SizedBox(height: 30.v), _buildAddProduct(context, state), SizedBox(height: 30.v), - ...state.portions! + ...state.portions .map((portion) => _buildProduct(context, portion)) .toList(), SizedBox(height: 30.v), - /*...state.photos != null - ? state.photos!.isEmpty - ? [Text('Фото пока нет')] - : state.photos! - .map((photo) => _buildPhoto(context, photo)) - .toList() - : [Text('Фото нет')],*/ _buildCarousel(context, state), SizedBox(height: 20.v), _buildAddPhoto(context, state), @@ -463,9 +500,9 @@ class DiaryEditScreen extends StatelessWidget { style: CustomTextStyles.bodyMediumBlack900, ), SizedBox(height: 15.v), - BlocBuilder( + BlocBuilder( builder: (context, state) { - if (state is DiaryEditLoadedState) { + if (state is DiaryStateLoaded) { return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -505,7 +542,7 @@ class DiaryEditScreen extends StatelessWidget { ], ); } else { - return Container(); // Возвращаем пустой контейнер, если состояние не является DiaryEditLoadedState + return Container(); // Возвращаем пустой контейнер, если состояние не является DiaryState } }, ), @@ -514,7 +551,7 @@ class DiaryEditScreen extends StatelessWidget { ); } - openCaloriesDialog(BuildContext context, DiaryEditLoadedState state) { + openCaloriesDialog(BuildContext context, DiaryStateLoaded state) { showDialog( context: context, builder: (BuildContext dialogContext) { @@ -525,7 +562,7 @@ class DiaryEditScreen extends StatelessWidget { children: [ CustomTextFormField( hintText: "Название", - controller: state.productNameController, + controller: state.product_nameController, ), SizedBox(height: 10.v), CustomTextFormField( @@ -561,11 +598,11 @@ class DiaryEditScreen extends StatelessWidget { TextButton( onPressed: triggerModeration( context, - state.productNameController!.text, - state.caloriesController!.text, - state.proteinsController!.text, - state.fatsController!.text, - state.carbsController!.text, + state.product_nameController.text, + state.caloriesController.text, + state.proteinsController.text, + state.fatsController.text, + state.carbsController.text, dialogContext, ), child: Text('Отправить'), @@ -586,8 +623,7 @@ class DiaryEditScreen extends StatelessWidget { BuildContext dialogContext, ) { return () { - // Call function to send moderation with the entered values - context.read().add( + context.read().add( SendModeration( name: name, energyOn100gr: energyOn100gr, @@ -596,7 +632,7 @@ class DiaryEditScreen extends StatelessWidget { carbohydratesOn100gr: carbohydratesOn100gr, ), ); - Navigator.of(dialogContext).pop(); // Dismiss the dialog + Navigator.of(dialogContext).pop(); }; } @@ -609,13 +645,13 @@ class DiaryEditScreen extends StatelessWidget { changeSatiety(BuildContext context, int satiety) { return () { - context.read().add(ChangeSatiety(satiety)); + context.read().add(ChangeSatiety(satiety)); }; } selectProduct(AutocompleteOnSelected onSelected, String option, - DiaryEditLoadedState state) { - state.productNameController?.text = option; + DiaryStateLoaded state) { + state.product_nameController.text = option; return () { onSelected(option); }; @@ -623,11 +659,8 @@ class DiaryEditScreen extends StatelessWidget { getAutocomplete(BuildContext context, FocusNode focusNode) { return (value) { - /*print(state.autocompleteList - ?.map((dynamic item) => item as String) - .toList());*/ if (value.length > 2) { - context.read().add(ProductInput(value)); + context.read().add(ProductInput(value)); } }; } @@ -640,35 +673,32 @@ class DiaryEditScreen extends StatelessWidget { }; } - changeMeal(BuildContext context, DiaryEditLoadedState state) { + changeMeal(BuildContext context, DiaryStateLoaded state) { return (value) { - context - .read() - .add(ChangeMeal(meals: state.meals, value: value)); + context.read().add(ChangeMeal(value: value)); }; } - changePortion(BuildContext context, DiaryEditLoadedState state) { + changePortion(BuildContext context, DiaryStateLoaded state) { return (value) { - context.read().add(ChangePortion(value: value)); + context.read().add(ChangePortion(value: value)); }; } - _buildCarousel(BuildContext context, DiaryEditLoadedState state) { - if (state.photos!.isEmpty) { + _buildCarousel(BuildContext context, DiaryStateLoaded state) { + if (state.currentMeal.photos.isEmpty) { return Text("Фото нет"); } else { return CarouselSlider( options: CarouselOptions(height: 340.0), - items: state.photos!.map((photo) { - return _buildPhoto( - context, photo); // Assuming photos are stored as strings + items: state.currentMeal.photos.map((photo) { + return _buildPhoto(context, photo); }).toList(), ); } } - _buildProduct(BuildContext context, Map portion) { + _buildProduct(BuildContext context, Portion portion) { return Container( margin: EdgeInsets.symmetric(horizontal: 10.h), padding: EdgeInsets.symmetric( @@ -688,9 +718,9 @@ class DiaryEditScreen extends StatelessWidget { top: 5.v, ), child: Text( - portion['product_name'].length > 8 - ? portion['product_name'].substring(0, 8) - : portion['product_name'], + portion.product_name.length > 8 + ? portion.product_name.substring(0, 8) + : portion.product_name, style: CustomTextStyles.titleMedium16, ), ), @@ -701,9 +731,7 @@ class DiaryEditScreen extends StatelessWidget { bottom: 3.v, ), child: Text( - portion['quantity'].toString() + - ' ' + - portion['portion'].toString().tr, + portion.quantity.toString() + ' ' + portion.portion.toString().tr, ), ), Spacer(), @@ -722,7 +750,7 @@ class DiaryEditScreen extends StatelessWidget { ); } - _buildPhoto(BuildContext context, Map photo) { + _buildPhoto(BuildContext context, Photo photo) { return Stack( children: [ Container( @@ -731,7 +759,7 @@ class DiaryEditScreen extends StatelessWidget { borderRadius: BorderRadiusStyle.roundedBorder5, ), child: Image.network( - baseUrl + '/storage/' + photo['path'], + dotenv.env['STORAGE_URL']! + photo.path, ), ), Positioned( @@ -756,21 +784,21 @@ class DiaryEditScreen extends StatelessWidget { ); } - removePortion(BuildContext context, Map portion) { + removePortion(BuildContext context, Portion portion) { return () { - context.read().add(RemovePortionEvent(portion['id'])); + context.read().add(RemovePortionEvent(portion.id)); }; } - removePhoto(BuildContext context, Map photo) { + removePhoto(BuildContext context, Photo photo) { return () { context - .read() - .add(RemoveImageEvent(photo['id'].toString(), photo['path'])); + .read() + .add(RemoveImageEvent(photo.id.toString(), photo.path)); }; } - _buildNutritionChart(BuildContext context, DiaryEditLoadedState state) { + /*_buildNutritionChart(BuildContext context, DiaryStateLoaded state) { final List recommendedValues = state .recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы final List consumedValues = state.consumedChartValues; // @@ -989,10 +1017,10 @@ class DiaryEditScreen extends StatelessWidget { ], ), ); - } + }*/ /// Section Widget - _buildComment(BuildContext context, DiaryEditLoadedState state) { + _buildComment(BuildContext context, DiaryStateLoaded state) { return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), padding: EdgeInsets.symmetric( @@ -1036,7 +1064,7 @@ class DiaryEditScreen extends StatelessWidget { ); } - _buildWakupRetire(BuildContext context, DiaryEditLoadedState state) { + _buildWakupRetire(BuildContext context, DiaryStateLoaded state) { return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), padding: EdgeInsets.symmetric( @@ -1112,7 +1140,7 @@ class DiaryEditScreen extends StatelessWidget { toggleWakeup(BuildContext context) { return () { - BlocProvider.of(context).add(ToggleWakeupExpandedEvent()); + BlocProvider.of(context).add(ToggleWakeupExpandedEvent()); }; } @@ -1146,7 +1174,7 @@ class DiaryEditScreen extends StatelessWidget { BuildContext dialogContext, BuildContext context) { return () { closeDialog(dialogContext); - context.read().add(FinishDay()); + context.read().add(FinishDay()); }; } @@ -1156,7 +1184,7 @@ class DiaryEditScreen extends StatelessWidget { }; } - _buildMood(BuildContext context, DiaryEditLoadedState state) { + _buildMood(BuildContext context, DiaryStateLoaded state) { return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), padding: EdgeInsets.symmetric( @@ -1238,49 +1266,46 @@ class DiaryEditScreen extends StatelessWidget { changeMood(BuildContext context, int satiety) { return () { - context.read().add(ChangeMood(satiety)); + context.read().add(ChangeMood(satiety)); }; } toggleMood(BuildContext context) { return () { - BlocProvider.of(context).add(ToggleMoodExpandedEvent()); + BlocProvider.of(context).add(ToggleMoodExpandedEvent()); }; } Future _selectWakeupTime( - BuildContext context, DiaryEditLoadedState state) async { + BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.wakeupController ?? TimeOfDay.now(), ); if (pickedTime != null && pickedTime != state.wakeupController) { - state.wakeupController = pickedTime; - context.read().add(WakeupEvent(pickedTime)); + context.read().add(WakeupEvent(pickedTime)); } } Future _selectRetireTime( - BuildContext context, DiaryEditLoadedState state) async { + BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.retireController ?? TimeOfDay.now(), ); if (pickedTime != null && pickedTime != state.retireController) { - state.retireController = pickedTime; - context.read().add(RetireEvent(pickedTime)); + context.read().add(RetireEvent(pickedTime)); } } Future _selectMealTime( - BuildContext context, DiaryEditLoadedState state) async { + BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.mealTimeController ?? TimeOfDay.now(), ); if (pickedTime != null && pickedTime != state.mealTimeController) { - state.mealTimeController = pickedTime; - context.read().add(ChangeMealTime(pickedTime)); + context.read().add(ChangeMealTime(pickedTime)); } } } @@ -1296,4 +1321,13 @@ bool checkConsumedValues( // Если ни одно потребленное значение не превышает рекомендованное с соответствующим индексом return false; // Возвращаем true } -*/ + +List mealsToDropdown(List? meals) { + return meals! + .map((meal) => SelectionPopupModel( + id: meal.id, + title: "Прием пищи ${meal.type}", + isSelected: false, + )) + .toList(); +} diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index b5ca0317..56c9fbd6 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,17 +1,212 @@ -/*import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/portion.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; import 'package:eatvio_app/features/diary/services/diary_service.dart'; class DiaryRepository { - final DiaryService blogPostService; + final DiaryService diaryService; - DiaryRepository({required this.blogPostService}); + DiaryRepository({required this.diaryService}); - Future getDiary(String blogPostID) async { + Future> getDiaryID() async { try { - return await blogPostService.getDiary(blogPostID); + return await diaryService.getDiaryID(); + } catch (e) { + rethrow; + } + } + + Future getDiary(int diaryID) async { + try { + return (await diaryService.getDiary(diaryID))['diary']!; + } catch (e) { + rethrow; + } + } + + Future> getChartData(int diaryID) async { + try { + return (await diaryService.getChart(diaryID)); + } catch (e) { + rethrow; + } + } + + Future>> inputProduct(String name) async { + try { + return await diaryService.getInputProduct(name); + } catch (e) { + rethrow; + } + } + + Future changeSatiety(int satiety, int mealID, int diaryID) async { + try { + await diaryService.sendSatietyData( + diaryID, + mealID, + satiety, + ); + } catch (e) { + rethrow; + } + } + + Future changeMood(int mood, int mealID, int diaryID) async { + try { + await diaryService.sendMoodData( + diaryID, + mealID, + mood, + ); + } catch (e) { + rethrow; + } + } + + Future changeWakeup( + int diaryID, + String wakeup, + ) async { + try { + await diaryService.sendWakeupData( + diaryID, + wakeup, + ); + } catch (e) { + rethrow; + } + } + + Future changeRetire( + int diaryID, + String retire, + ) async { + try { + await diaryService.sendWakeupData( + diaryID, + retire, + ); + } catch (e) { + rethrow; + } + } + + Future> addPortion( + int diaryID, + int mealID, + String name, + String product, + int quantity, + ) async { + try { + return await diaryService.sendPortionData( + diaryID, + mealID, + name, + product, + quantity, + ); + } catch (e) { + rethrow; + } + } + + Future> sendModeration( + String name, + String energy_on_100gr, + String proteins_on_100gr, + String fats_on_100gr, + String carbohydrates_on_100gr, + ) async { + try { + return await diaryService.sendModerationData( + name, + double.parse(energy_on_100gr + ".0"), + double.parse(proteins_on_100gr + ".0"), + double.parse(fats_on_100gr + ".0"), + double.parse(carbohydrates_on_100gr + ".0"), + ); + } catch (e) { + rethrow; + } + } + + Future removePortion( + int diaryID, + int mealID, + int portionID, + ) async { + try { + await diaryService.sendRemovePortionData( + diaryID, + mealID, + portionID, + ); + } catch (e) { + rethrow; + } + } + + Future uploadImage( + String path, + int diaryID, + int mealID, + ) async { + try { + File file = File(path); + await diaryService.uploadImage( + diaryID, + mealID, + file, + ); + } catch (e) { + rethrow; + } + } + + Future removeImage( + int diaryID, + int mealID, + int photoID, + String path, + ) async { + try { + await diaryService.sendRemovePhotoData( + diaryID, + mealID, + path, + photoID, + ); + } catch (e) { + rethrow; + } + } + + Future finishDay( + int diaryID, + TimeOfDay? wakeup, + TimeOfDay? retire, + String? comment, + ) async { + try { + final formatter = DateFormat('HH:mm'); + final wakeupString = + formatter.format(DateTime(2022, 1, 1, wakeup!.hour, wakeup.minute)); + final retireString = + formatter.format(DateTime(2022, 1, 1, retire!.hour, retire.minute)); + await diaryService.sendFinishDay( + diaryID, + wakeupString, + retireString, + comment ?? " ", + ); } catch (e) { rethrow; } } } -*/ diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index 07490375..125db491 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,5 +1,9 @@ -/*import 'package:dio/dio.dart'; +import 'dart:io'; + +import 'package:dio/dio.dart'; import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/portion.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; import 'package:retrofit/retrofit.dart'; part 'diary_service.g.dart'; @@ -8,7 +12,90 @@ part 'diary_service.g.dart'; abstract class DiaryService { factory DiaryService(Dio dio, {String baseUrl}) = _DiaryService; - @GET('/api/feed/show/{id}') - Future getDiary(@Path() String id); + @GET('/diary/index') + Future> getDiaryID(); + + @GET('/diary/{id}/show/') + Future> getDiary(@Path() int id); + + @GET('/diary/{id}/dailyNutritionData/') + Future getChart(@Path() int id); + + @GET('/diary/product_nutritional_values/filter') + Future>> getInputProduct( + @Query('name') String name); + + @POST('/diary/{diary_id}/meal/{meal_id}/satiety/fill') + Future> sendSatietyData( + @Path() int diary_id, + @Path() int meal_id, + @Query('satiety') int satiety, + ); + + @POST('/diary/{diary_id}/meal/{meal_id}/mood/fill') + Future> sendMoodData( + @Path() int diary_id, + @Path() int meal_id, + @Query('mood') int mood, + ); + + @POST('/diary/{diary_id}/wakeup/fill') + Future sendWakeupData( + @Path() int diary_id, + @Query('wakeup') String wakeup, + ); + + @POST('/diary/{diary_id}/retire/fill') + Future sendRetireData( + @Path() int diary_id, + @Query('retire') String retire, + ); + + @POST('/diary/{diary_id}/meal/{meal_id}/portions/create') + Future> sendPortionData( + @Path() int diary_id, + @Path() int meal_id, + @Query('product_name') String product_name, + @Query('portion') String portion, + @Query('quantity') int quantity, + ); + + @POST('/diary/{diary_id}/meal/{meal_id}/photo/upload') + Future uploadImage( + @Path() int diary_id, + @Path() int meal_id, + @Part() File photo, + ); + + @POST('/diary/product_nutritional_values/sendToModeration') + Future> sendModerationData( + @Query('name') String product_name, + @Query('energy_on_100gr') double energy_on_100gr, + @Query('proteins_on_100gr') double proteins_on_100gr, + @Query('fats_on_100gr') double fats_on_100gr, + @Query('carbohydrates_on_100gr') double carbohydrates_on_100gr, + ); + + @POST('/diary/{diary_id}/finishDay') + Future sendFinishDay( + @Path() int diary_id, + @Query('wakeUp') String wakeup, + @Query('retire') String retire, + @Query('comment') String comment, + ); + + @DELETE('/diary/{diary_id}/meal/{meal_id}/portions/{portion_id}/delete') + Future sendRemovePortionData( + @Path() int diary_id, + @Path() int meal_id, + @Path() int portion_id, + ); + + @DELETE('/diary/{diary_id}/meal/{meal_id}/photo/delete') + Future sendRemovePhotoData( + @Path() int diary_id, + @Path() int meal_id, + @Query('path') String path, + @Query('id') int photo_id, + ); } -*/ diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart new file mode 100644 index 00000000..01a34881 --- /dev/null +++ b/lib/features/diary/services/diary_service.g.dart @@ -0,0 +1,489 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'diary_service.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element + +class _DiaryService implements DiaryService { + _DiaryService( + this._dio, { + this.baseUrl, + }); + + final Dio _dio; + + String? baseUrl; + + @override + Future> getDiaryID() async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/index', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data!.cast(); + return _value; + } + + @override + Future> getDiary(int id) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch>( + _setStreamType>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${id}/show/', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + var _value = _result.data!.map((k, dynamic v) => + MapEntry(k, DiaryModel.fromJson(v as Map))); + return _value; + } + + @override + Future getChart(int id) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch(_setStreamType(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${id}/dailyNutritionData/', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data; + return _value; + } + + @override + Future>> getInputProduct(String name) async { + final _extra = {}; + final queryParameters = {r'name': name}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch>( + _setStreamType>>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/product_nutritional_values/filter', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + var _value = _result.data!.map((k, dynamic v) => MapEntry( + k, + (v as List) + .map((i) => Product.fromJson(i as Map)) + .toList())); + return _value; + } + + @override + Future> sendSatietyData( + int diary_id, + int meal_id, + int satiety, + ) async { + final _extra = {}; + final queryParameters = {r'satiety': satiety}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType>(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/satiety/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data!.cast(); + return _value; + } + + @override + Future> sendMoodData( + int diary_id, + int meal_id, + int mood, + ) async { + final _extra = {}; + final queryParameters = {r'mood': mood}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType>(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/mood/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data!.cast(); + return _value; + } + + @override + Future sendWakeupData( + int diary_id, + String wakeup, + ) async { + final _extra = {}; + final queryParameters = {r'wakeup': wakeup}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/wakeup/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future sendRetireData( + int diary_id, + String retire, + ) async { + final _extra = {}; + final queryParameters = {r'retire': retire}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/retire/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future> sendPortionData( + int diary_id, + int meal_id, + String product_name, + String portion, + int quantity, + ) async { + final _extra = {}; + final queryParameters = { + r'product_name': product_name, + r'portion': portion, + r'quantity': quantity, + }; + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch>( + _setStreamType>(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/portions/create', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + var _value = _result.data!.map((k, dynamic v) => + MapEntry(k, Portion.fromJson(v as Map))); + return _value; + } + + @override + Future uploadImage( + int diary_id, + int meal_id, + File photo, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + final _data = FormData(); + _data.files.add(MapEntry( + 'photo', + MultipartFile.fromFileSync( + photo.path, + filename: photo.path.split(Platform.pathSeparator).last, + ), + )); + await _dio.fetch(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/photo/upload', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + } + + @override + Future> sendModerationData( + String product_name, + double energy_on_100gr, + double proteins_on_100gr, + double fats_on_100gr, + double carbohydrates_on_100gr, + ) async { + final _extra = {}; + final queryParameters = { + r'name': product_name, + r'energy_on_100gr': energy_on_100gr, + r'proteins_on_100gr': proteins_on_100gr, + r'fats_on_100gr': fats_on_100gr, + r'carbohydrates_on_100gr': carbohydrates_on_100gr, + }; + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch>( + _setStreamType>(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/product_nutritional_values/sendToModeration', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data!.cast(); + return _value; + } + + @override + Future sendFinishDay( + int diary_id, + String wakeup, + String retire, + String comment, + ) async { + final _extra = {}; + final queryParameters = { + r'wakeUp': wakeup, + r'retire': retire, + r'comment': comment, + }; + final _headers = {}; + const Map? _data = null; + await _dio.fetch(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/finishDay', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + } + + @override + Future sendRemovePortionData( + int diary_id, + int meal_id, + int portion_id, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + await _dio.fetch(_setStreamType(Options( + method: 'DELETE', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/portions/${portion_id}/delete', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + } + + @override + Future sendRemovePhotoData( + int diary_id, + int meal_id, + String path, + int photo_id, + ) async { + final _extra = {}; + final queryParameters = { + r'path': path, + r'id': photo_id, + }; + final _headers = {}; + const Map? _data = null; + await _dio.fetch(_setStreamType(Options( + method: 'DELETE', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/photo/delete', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + } + + RequestOptions _setStreamType(RequestOptions requestOptions) { + if (T != dynamic && + !(requestOptions.responseType == ResponseType.bytes || + requestOptions.responseType == ResponseType.stream)) { + if (T == String) { + requestOptions.responseType = ResponseType.plain; + } else { + requestOptions.responseType = ResponseType.json; + } + } + return requestOptions; + } + + String _combineBaseUrls( + String dioBaseUrl, + String? baseUrl, + ) { + if (baseUrl == null || baseUrl.trim().isEmpty) { + return dioBaseUrl; + } + + final url = Uri.parse(baseUrl); + + if (url.isAbsolute) { + return url.toString(); + } + + return Uri.parse(dioBaseUrl).resolveUri(url).toString(); + } +} diff --git a/lib/locator_service.dart b/lib/locator_service.dart index 1d95a0b5..7cf46986 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -1,20 +1,15 @@ import 'package:dio/dio.dart'; -import 'package:eatvio_app/core/constants/constants.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; import 'package:eatvio_app/features/blog_post/presentation/bloc/blog_post_cubit.dart'; import 'package:eatvio_app/features/blog_post/repositories/blog_post_repository.dart'; import 'package:eatvio_app/features/blog_post/services/blog_post_service.dart'; -import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; -import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart'; import 'package:eatvio_app/features/chat/repositories/chat_repository.dart'; import 'package:eatvio_app/features/chat/services/chat_service.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; import 'package:eatvio_app/features/feed/repositories/feed_repository.dart'; import 'package:eatvio_app/features/feed/services/feed_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'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get_it/get_it.dart'; final sl = GetIt.instance; @@ -28,19 +23,24 @@ Future init() async { sl.registerFactory(() => RegistrationCubit(registrationRepository: sl())); sl.registerFactory(() => ChatRoomCubit(chatRepository: sl(), initializationCubit: sl())); sl.registerFactory(() => FeedCubit(feedRepository: sl())); - sl.registerFactory(() => BlogPostCubit(blogPostRepository: sl())); + sl.registerFactory( + () => BlogPostCubit(blogPostRepository: sl())); + sl.registerFactory(() => DiaryBloc(diaryRepository: sl())); // Repository sl.registerLazySingleton(() => ChatRepository(chatService: sl())); sl.registerLazySingleton(() => FeedRepository(feedService: sl())); sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl())); sl.registerLazySingleton(() => RegistrationRepository(registrationService: sl())); + sl.registerLazySingleton( + () => DiaryRepository(diaryService: sl())); // Services sl.registerLazySingleton(() => ChatService(sl())); sl.registerLazySingleton(() => FeedService(sl())); sl.registerLazySingleton(() => BlogPostService(sl())); sl.registerLazySingleton(() => RegistrationService(sl())); + sl.registerLazySingleton(() => DiaryService(sl())); // External sl.registerLazySingleton( diff --git a/lib/main.dart b/lib/main.dart index ab53ccad..5ccc52d1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,8 +8,7 @@ import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/m import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; import 'package:eatvio_app/locator_service.dart' as di; import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart'; -import 'package:eatvio_app/presentation/diary/diary_edit_screen/models/diary_edit_model.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_bloc.dart'; import 'package:eatvio_app/presentation/profile/my_profile_screen/bloc/my_profile_bloc.dart'; import 'package:eatvio_app/presentation/profile/my_profile_screen/models/my_profile_model.dart'; import 'package:flutter/material.dart'; @@ -49,7 +48,7 @@ class MyApp extends StatelessWidget { BlocProvider(create: (context) => ThemeBloc(ThemeState(themeType: PrefUtils().getThemeData()))), BlocProvider(create: (context) => sl()..loadFeedBlogPostList()), BlocProvider(create: (context) => MyProfileBloc(MyProfileState(myProfileModelObj: MyProfileModel()))..add(MyProfileInitialEvent())), - BlocProvider(create: (context) => DiaryEditBloc(DiaryEditState(diaryEditModelObj: DiaryEditModel()))..add(DiaryEditInitialEvent())), + BlocProvider(create: (context) => sl()..add(LoadDiary())), BlocProvider( create: (context) => ChatSelectBloc(ChatSelectState(chatSelectModelObj: ChatSelectModel()))..add(ChatSelectInitialEvent()), ), diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart deleted file mode 100644 index 1792f4d0..00000000 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart +++ /dev/null @@ -1,1079 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/presentation/diary/diary_edit_screen/models/diary_edit_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:hive/hive.dart'; -import 'package:http/http.dart' as http; -import 'package:image_picker/image_picker.dart'; -import 'package:intl/intl.dart'; - -import '/core/app_export.dart'; - -part 'diary_edit_event.dart'; -part 'diary_edit_state.dart'; - -/// A bloc that manages the state of a DiaryEdit according to the event that is dispatched to it. -class DiaryEditBloc extends Bloc { - DiaryEditBloc(DiaryEditState initialState) : super(initialState) { - on(_onInitialize); - on(_changeSatiety); // пользователь нажимает на шкалу сытости - on(_changeMood); // пользователь нажимает на шкалу настроения - on(_changeMealTime); // пользовательяет времяа пиши - on(_changeMeal); - on(_changePortion); - on(_changeWakeup); // пользователь выбирает время пробуждения - on(_changeRetire); // пользователь выбирает время отхода ко сну - on(_toggleMood); - on(_toggleWakeup); - on(_addPortion); //пользователь нажимает "Добавить продукт" - on(_removePortion); - on( - _removeImage, - ); // пользователь нажимает на крестик около продукта - on(_uploadImages); //пользователь нажимает "Добавить фото" - on(_addComment); //пользователь нажимает "Добавить комментарий" - on( - _inputProduct, - ); //пользователь нажимает "Добавить комментарий" - on(_finishDay); //пользователь нажимает "Добавить комментарий" - on(_sendModeration); - on( - reloadScreen, - ); //пользователь нажимает "Добавить комментарий" - on(_clearInput); - } - - Future _onInitialize( - DiaryEditInitialEvent event, - Emitter emit, - ) async { - try { - // final token = - // "9|laravel_sanctum_KFXbccDcWEvTPfJmV99EQv1neAggmpR2TidVGDPN34fa201a"; - final box = await Hive.openBox('token'); - final token = box.get('token'); - //print(await fetchDiaryId(token)); - final int diaryId = await fetchDiaryId(token, emit); - try { - print("Diary ID fetched"); - final diary = await fetchDiaryData(token, diaryId); - print("Screen load success"); - if (diary is Map) { - print(diary); - final String diaryDate = diary['date'] ?? DateTime.now().toString(); - final chartValues = await fetchChartValues(token, diaryId, emit); - if (state is DiaryEditLoadedState) { - // Если текущее состояние уже загружено, обновляем его - var currentState = state as DiaryEditLoadedState; - emit( - (currentState).copyWith( - currentMeal: currentState.currentMeal, - wakeupExpanded: currentState.wakeupExpanded, - moodExpanded: currentState.moodExpanded, - moderationExpanded: currentState.moderationExpanded, - token: currentState.token, - meals: currentState.meals, - portions: currentState.portions, - photos: currentState.photos, - wakeupController: currentState.wakeupController, - retireController: currentState.retireController, - commentController: currentState.commentController, - mealTimeController: currentState.mealTimeController, - productNameController: currentState.productNameController, - caloriesController: currentState.caloriesController, - proteinsController: currentState.proteinsController, - fatsController: currentState.fatsController, - carbsController: currentState.carbsController, - selectedSatiety: currentState.selectedSatiety, - selectedMood: currentState.selectedMood, - diaryDate: currentState.diaryDate, - diaryId: currentState.diaryId, - productQuantityController: currentState.productQuantityController, - recommendedChartValues: currentState.recommendedChartValues, - consumedChartValues: currentState.consumedChartValues, - autocompleteList: currentState.autocompleteList, - diaryEditModelObj: currentState.diaryEditModelObj, - ), - ); - } else { - // Если текущее состояние - начальное, создаем новое загруженное состояние - final List meals = fillMealList(diary['meals']); - emit( - DiaryEditLoadedState( - currentMeal: meals[0], - portionController: SelectionPopupModel( - id: 0, - title: "порций", - isSelected: true, - ), - wakeupExpanded: true, - moodExpanded: true, - moderationExpanded: false, - token: token, - recommendedChartValues: chartValues[0], - consumedChartValues: chartValues[1], - meals: diary['meals'], - portions: diary['meals'][0]['portions'], - photos: diary['meals'][0]['photos'], - wakeupController: toTime(diary['wakeup'] ?? "09:00"), - retireController: toTime(diary['retire'] ?? "23:00"), - mealTimeController: toTime(diary['meals'][0]['time'] ?? "10:00"), - selectedSatiety: diary['meals'][0]['satiety'], - selectedMood: diary['meals'][0]['mood'], - commentController: TextEditingController(text: diary['comment']), - productNameController: TextEditingController(), - productQuantityController: TextEditingController(), - caloriesController: TextEditingController(), - proteinsController: TextEditingController(), - fatsController: TextEditingController(), - carbsController: TextEditingController(), - diaryId: diaryId, - diaryDate: diaryDate, - autocompleteList: [], - diaryEditModelObj: state.diaryEditModelObj?.copyWith(mealList: meals, portionList: fillPortions()), - ), - ); - } - } - } catch (e) { - // Ошибка при получении данных дневника - emit(DiaryEditErrorState('Ошибка при получении данных дневника: $e')); - } - } catch (e) { - // Ошибка при получении данных дневника - emit(DiaryEditErrorState('Ошибка при получении данных о дневнике: $e')); - } - } - - fetchDiaryId(String token, Emitter emit) async { - final response = await http.get( - Uri.parse(baseUrl + '/api/diary/index'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map && data.containsKey('id')) { - final int diaryId = data['id']; - return diaryId; - } else { - emit(DiaryEditErrorState('Некоторые необходимые данные отсутствуют.')); - print('fail'); - return -1; - } - } else { - emit(DiaryEditErrorState('Ошибка сервера: ${response.statusCode}')); - print('fail'); - return -1; - } - } - - fetchDiaryData(String token, int diaryId) async { - final response = await http.get( - Uri.parse(baseUrl + '/api/diary/$diaryId/show/'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - final diary = jsonDecode(response.body)['diary']; - - return diary; - } - - fetchChartValues( - String token, - int diaryID, - Emitter emit, - ) async { - final responseChart = await http.get( - Uri.parse( - baseUrl + '/api/diary/$diaryID/dailyNutritionData/', - ), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - - if (responseChart.statusCode == 200) { - final responseBody = jsonDecode(responseChart.body); - - final recommendedChartValues = responseBody['dailyNutritionRecommendation'].values.map((value) => convertToInt(value)).toList(); - - final consumedChartValues = responseBody['dailyNutritionIntake'].values.map((value) => convertToInt(value)).toList(); - - print([recommendedChartValues, consumedChartValues]); - return [recommendedChartValues, consumedChartValues]; - } else { - emit(DiaryEditErrorState('Ошибка при декодировании данных КБЖУ')); - print('fail'); - return [[], []]; // Return empty lists instead of -1 - } - } - - refreshScreen( - int mealID, - DiaryEditEvent event, - Emitter emit, - ) async { - await reloadScreen(event, emit); - } - - reloadScreen( - DiaryEditEvent event, - Emitter emit, - ) async { - print("Reloading..."); - try { - //final token = - // "9|laravel_sanctum_KFXbccDcWEvTPfJmV99EQv1neAggmpR2TidVGDPN34fa201a"; final box = await Hive.openBox('token'); - final box = await Hive.openBox('token'); - final token = box.get('token'); - final response = await http.get( - Uri.parse(baseUrl + '/api/diary/index'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map && data.containsKey('id')) { - final int diaryId = data['id']; - - final diaryResponse = await http.get( - Uri.parse(baseUrl + '/api/diary/$diaryId/show/'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - - final diary = jsonDecode(diaryResponse.body)['diary']; - - if (diary is Map) { - final String diaryDate = diary['date'] ?? DateTime.now().toString(); - final responseChart = await http.get( - Uri.parse( - baseUrl + '/api/diary/$diaryId/dailyNutritionData/', - ), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - if (responseChart.statusCode == 200) { - final recommendedChartValues = jsonDecode( - responseChart.body, - )['dailyNutritionRecommendation']; - final consumedChartValues = jsonDecode(responseChart.body)['dailyNutritionIntake']; - final List meals = fillMealList(diary['meals']); - try { - await Future( - () => emit( - DiaryEditLoadedState( - diaryEditModelObj: state.diaryEditModelObj?.copyWith( - mealList: meals, - portionList: fillPortions(), - ), - currentMeal: meals[0], - portionController: SelectionPopupModel( - id: 0, - title: "порций", - isSelected: true, - ), - wakeupExpanded: true, - moodExpanded: true, - moderationExpanded: false, - token: token, - recommendedChartValues: recommendedChartValues.values.map((value) => convertToInt(value)).toList(), - consumedChartValues: consumedChartValues.values.map((value) => convertToInt(value)).toList(), - portions: diary['meals'][0]['portions'], - photos: diary['meals'][0]['photos'], - wakeupController: toTime(diary['wakeup'] ?? "09:00"), - retireController: toTime(diary['retire'] ?? "23:00"), - mealTimeController: toTime(diary['meals'][0]['time'] ?? "10:00"), - selectedSatiety: diary['meals'][0]['satiety'], - selectedMood: diary['meals'][0]['mood'], - commentController: TextEditingController(text: diary['comment']), - productNameController: TextEditingController(), - productQuantityController: TextEditingController(), - caloriesController: TextEditingController(), - proteinsController: TextEditingController(), - fatsController: TextEditingController(), - carbsController: TextEditingController(), - diaryId: diaryId, - diaryDate: diaryDate, - isLoading: false, - autocompleteList: [], - ), - ), - ); - - print("Updated"); - } catch (e) { - print("Ошибка при создании нового состояния $e"); - } - } else { - emit(DiaryEditErrorState('Ошибка при декодировании данных КБЖУ')); - } - } else { - emit( - DiaryEditErrorState( - 'Ошибка при декодировании данных дневника', - ), - ); - } - } else { - emit( - DiaryEditErrorState('Некоторые необходимые данные отсутствуют.'), - ); - } - } else { - emit(DiaryEditErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - emit(DiaryEditErrorState('Ошибка при получении данных дневника: $e')); - } - } - - Future _changeSatiety( - ChangeSatiety event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - var updatedState = currentState.copyWith(selectedSatiety: event.selectedElement); - - // Отправляем данные по HTTP маршруту и ждем ответ - var response = await sendSatietyData( - currentState.token, - event.selectedElement, - currentState.currentMeal?.id, - currentState.diaryId, - ); - - if (response.statusCode == 200) { - updatedState.selectedSatiety = event.selectedElement; - emit(updatedState); // Передаем обновленное состояние в emit - } - } - } - - Future sendSatietyData( - String? token, - int selectedSatiety, - int? mealID, - int diaryID, - ) async { - String url = baseUrl + '/api/diary/$diaryID/meal/$mealID/satiety/fill'; - final Map credentials = { - 'satiety': selectedSatiety, - }; - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - return response; - } - - Future _changeMood( - ChangeMood event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - var updatedState = currentState.copyWith(selectedMood: event.selectedElement); - - // Отправляем данные по HTTP маршруту и ждем ответ - var response = await sendMoodData( - currentState.token, - event.selectedElement, - currentState.currentMeal?.id, - currentState.diaryId, - ); - - if (response.statusCode == 200) { - print( - 'Mood change success! meal_id: ${currentState.currentMeal?.id}, mood: ${event.selectedElement}', - ); - updatedState.selectedMood = event.selectedElement; - emit(updatedState); // Передаем обновленное состояние в emit - } - } - } - - Future sendMoodData( - String? token, - int selectedMood, - int? mealID, - int diaryID, - ) async { - String url = baseUrl + '/api/diary/$diaryID/meal/$mealID/mood/fill'; - final Map credentials = { - 'mood': selectedMood, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - FutureOr _changeWakeup( - WakeupEvent event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - var response = await sendWakeupData( - currentState.token, - event.selectedTime, - currentState.diaryId, - ); - if (response.statusCode == 200) { - await reloadScreen(event, emit); - var updatedState = currentState.copyWith(wakeupController: event.selectedTime); - print("Wakeup time changed to ${event.selectedTime}"); - emit(updatedState); // Передаем обновленное состояние в emit - } else - print("Wakeup time change error"); - } - } - - FutureOr _changeRetire( - RetireEvent event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - var response = await sendRetireData( - currentState.token, - event.selectedTime, - currentState.diaryId, - ); - if (response.statusCode == 200) { - await reloadScreen(event, emit); - var updatedState = currentState.copyWith(retireController: event.selectedTime); - print("Retire time changed to ${event.selectedTime}"); - emit(updatedState); // Передаем обновленное состояние в emit - } else - print("Retire time change error"); - } - } - - Future sendWakeupData( - String? token, - TimeOfDay wakeup, - int diaryID, - ) async { - String url = baseUrl + '/api/diary/$diaryID/wakeUp/fill'; - final formatter = DateFormat('HH:mm'); - final wakeupString = formatter.format(DateTime(2022, 1, 1, wakeup.hour, wakeup.minute)); - final Map credentials = { - 'wakeUp': wakeupString, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - Future sendRetireData( - String? token, - TimeOfDay retire, - int diaryID, - ) async { - String url = baseUrl + '/api/diary/$diaryID/retire/fill'; - final formatter = DateFormat('HH:mm'); - final retireString = formatter.format(DateTime(2022, 1, 1, retire.hour, retire.minute)); - final Map credentials = { - 'retire': retireString, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - FutureOr _changeMealTime( - ChangeMealTime event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - var updatedState = currentState.copyWith(mealTimeController: event.time); - - emit(updatedState); - } - } - - Future sendMealTimeData( - String? token, - TimeOfDay mealTime, - int? mealID, - int diaryID, - ) async { - String url = baseUrl + '/api/diary/???'; - final Map credentials = { - 'time': mealTime, - 'meal_id': mealID, - 'diary_id': diaryID, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - FutureOr _changeMeal( - ChangeMeal event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - final meal = currentState.meals?.firstWhere( - (meal) => meal['id'] == event.value.id, - orElse: () => null, - ); - int? id = event.value.id; - DiaryEditLoadedState updatedState = currentState.copyWith( - currentMeal: event.value, - portions: meal['portions'], - photos: meal['photos'], - mealTimeController: toTime(meal['time'] ?? "1$id:00"), - selectedMood: meal['mood'], - selectedSatiety: meal['satiety'], - ); - print(updatedState.photos); - emit(updatedState); - } - } - - FutureOr _clearInput( - ClearInput event, - Emitter emit, - ) { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - DiaryEditLoadedState updatedState = currentState.copyWith(); - emit(updatedState); - } - } - - FutureOr _changePortion( - ChangePortion event, - Emitter emit, - ) { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - DiaryEditLoadedState updatedState = currentState.copyWith( - portionController: event.value, - ); - emit(updatedState); - } - } - - FutureOr _toggleMood( - ToggleMoodExpandedEvent event, - Emitter emit, - ) { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - emit(currentState.copyWith(moodExpanded: !currentState.moodExpanded)); - currentState.moodExpanded = !currentState.moodExpanded; - } - } - - FutureOr _toggleWakeup( - ToggleWakeupExpandedEvent event, - Emitter emit, - ) { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - emit(currentState.copyWith(wakeupExpanded: !currentState.wakeupExpanded)); - currentState.wakeupExpanded = !currentState.wakeupExpanded; - } - } - - FutureOr _addPortion( - AddPortionEvent event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - var response = await sendPortionData( - currentState.token, - currentState.productNameController?.text, - currentState.portionController?.id == 0 ? 'pcs' : 'gr', - int.parse(currentState.productQuantityController!.text), - currentState.currentMeal!.id, - currentState.diaryId, - ); - - if (response.statusCode == 200) { - emit(currentState.copyWith(isAdded: true)); - await reloadScreen(event, emit); - } else { - print( - 'Failed to add portion. Status Code: ${response.statusCode} ${response.body}', - ); - } - } - } - - FutureOr sendPortionData( - String? token, - String? name, - String portion, - int? quantity, - int? mealID, - int diaryID, - ) async { - String url = '${baseUrl}/api/diary/$diaryID/meal/$mealID/portions/create'; - - final Map credentials = { - 'product_name': name, - 'portion': portion, - 'quantity': quantity, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - Future _inputProduct( - ProductInput event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - String? token = currentState.token; - - final Map credentials = {'name': event.input}; - final uri = Uri.parse( - '${baseUrl}/api/diary/product_nutritional_values/filter?${Uri(queryParameters: credentials).query}', - ); - - final response = await http.get( - uri, - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - - final productNutritionalValues = jsonDecode(response.body)['product_nutritional_value']; - - if (productNutritionalValues is List) { - // Create a new controller with the input text and update the autocomplete list - var updatedState = currentState.copyWith( - productNameController: TextEditingController(text: event.input), - autocompleteList: productNutritionalValues.map((product) => product['name']).toList(), - ); - if (event.input.length > 3) { - updatedState = updatedState.copyWith(moderationExpanded: true); - } else { - updatedState = updatedState.copyWith(moderationExpanded: false); - } - - emit(updatedState); // Emit the updated state - } - } - } - - Future _removePortion( - RemovePortionEvent event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - int? mealId = currentState.currentMeal?.id; // Rename id to mealId for clarity - - var response = await sendRemovePortion( - currentState.token, - event.portionId, - mealId, - currentState.diaryId, - ); - - if (response.statusCode == 204) { - await reloadScreen(event, emit); - } else { - print( - 'Failed to add portion. Status Code: ${response.statusCode} ${response.body}', - ); - } - } - } - - Future sendRemovePortion( - String? token, - int? portionID, - int? mealID, - int diaryID, - ) async { - String url = '${baseUrl}/api/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; - - var response = await http.delete( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - encoding: utf8, - ); - - return response; - } - - FutureOr _removeImage( - RemoveImageEvent event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - var response = await sendRemovePhoto( - currentState.token, - event.path, - event.photoID, - currentState.currentMeal?.id, - currentState.diaryId, - ); - print(response.statusCode); - if (response.statusCode == 204) { - await reloadScreen(event, emit); - } else { - print( - 'Failed to remove photo. Status Code: ${response.statusCode} ${response.body}', - ); - } - } - } - - Future sendRemovePhoto( - String? token, - String? path, - String? photoID, - int? mealID, - int diaryID, - ) async { - String url = '${baseUrl}/api/diary/$diaryID/meal/$mealID/photo/delete'; - final Map credentials = { - 'id': photoID, - 'path': path, - }; - var response = await http.delete( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - Future _finishDay(FinishDay event, Emitter emit) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - var response = await sendFinishDay( - currentState.token, - currentState.diaryId, - currentState.wakeupController, - currentState.retireController, - currentState.commentController?.text, - ); - - if (response.statusCode == 200) { - await reloadScreen(event, emit); - } - } - } - - Future sendFinishDay( - String? token, - int diaryID, - TimeOfDay? wakeup, - TimeOfDay? retire, - String? comment, - ) async { - final formatter = DateFormat('HH:mm'); - final wakeupString = formatter.format(DateTime(2022, 1, 1, wakeup!.hour, wakeup.minute)); - final retireString = formatter.format(DateTime(2022, 1, 1, retire!.hour, retire.minute)); - - final Map credentials = { - 'wakeup': wakeupString, - 'retire': retireString, - 'comment': comment ?? " ", - }; - - String url = '${baseUrl}/api/diary/$diaryID/finishDay'; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - Future _uploadImages( - UploadImages event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - - emit(currentState.copyWith(isLoading: true)); - await uploadImageToServer( - event.image.path, - currentState.diaryId, - currentState.currentMeal!.id!, - currentState.token, - ); - await reloadScreen(event, emit); - } - } - - Future uploadImageToServer( - String imagePath, - int diaryID, - int mealId, - String? token, - ) async { - String url = '${baseUrl}/api/diary/$diaryID/meal/$mealId/photo/upload'; - - var request = http.MultipartRequest('POST', Uri.parse(url)); - request.headers['Authorization'] = 'Bearer $token'; - - request.files.add(await http.MultipartFile.fromPath('photo', imagePath)); - - var client = http.Client(); - var streamedResponse = await client.send(request); - - if (streamedResponse.statusCode == 200) { - var response = await http.Response.fromStream(streamedResponse); - var imageUrl = response.body; - print('Image successfully uploaded'); - return imageUrl; - } else { - throw Exception( - 'Failed to upload image. Status code: ${streamedResponse.statusCode}}', - ); - } - } - - FutureOr _sendModeration( - SendModeration event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - final response = await _sendModerationData( - event.name, - event.energyOn100gr, - event.proteinsOn100gr, - event.fatsOn100gr, - event.carbohydratesOn100gr, - currentState.token, - ); - - if (response.statusCode == 200) - print("Moderation success"); - else - print("Moderation error"); - } - } - - Future _sendModerationData( - String name, - String energy_on_100gr, - String proteins_on_100gr, - String fats_on_100gr, - String carbohydrates_on_100gr, - String? token, - ) async { - final Uri url = Uri.parse( - '${baseUrl}/api/diary/product_nutritional_values/sendToModeration', - ); - final Uri serverURL = Uri.parse('${baseUrl}'); - String host = serverURL.host; - final Map credentials = { - 'name': name, - 'energy_on_100gr': energy_on_100gr, - 'proteins_on_100gr': proteins_on_100gr, - 'fats_on_100gr': fats_on_100gr, - 'carbohydrates_on_100gr': carbohydrates_on_100gr, - }; - - var headers = { - //'Content-Length': bodyBytes, - 'Authorization': 'Bearer $token', - 'Host': host, - }; - - var response = await http.post( - url, - headers: headers, - body: credentials, - encoding: utf8, - ); - - if (response.statusCode == 200) { - return response; - } else { - throw Exception( - 'Failed to send a product for moderation ${response.statusCode}', - ); - } - } - - FutureOr _addComment( - AddComment event, - Emitter emit, - ) async { - if (state is DiaryEditLoadedState) { - var currentState = state as DiaryEditLoadedState; - var updatedState = currentState.copyWith( - commentController: TextEditingController(text: event.comment), - ); - - // Отправляем данные по HTTP маршруту и ждем ответ - var response = await sendCommentData( - currentState.token, - event.comment, - currentState.diaryId, - ); - - if (response.statusCode == 200) { - emit(updatedState); // Передаем обновленное состояние в emit - } - } - } - - Future sendCommentData( - String? token, - String comment, - int diaryID, - ) async { - String url = baseUrl + '/api/diary/$diaryID/retire/fill'; - final Map credentials = { - 'comment': comment, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - TimeOfDay toTime(String timeStr) { - List timeParts = timeStr.split(":"); - int hour = int.parse(timeParts[0]); - int minute = int.parse(timeParts[1]); - - TimeOfDay timeOfDay = TimeOfDay(hour: hour, minute: minute); - return timeOfDay; - } - - List fillMealList(List meals) { - meals.sort(compareTypes); - return meals.map((meal) { - String title = "Прием пищи ${meal['type']}"; - return SelectionPopupModel(id: meal['id'], title: title); - }).toList(); - } - - int compareTypes(a, b) { - return a['type'].compareTo(b['type']); - } - - List fillPortions() { - return [ - SelectionPopupModel(id: 0, title: "порций", isSelected: true), - SelectionPopupModel(id: 1, title: "грамм"), - ]; - } -} - -int convertToInt(dynamic value) { - if (value is int) { - return value; - } else if (value is double) { - return value.toInt(); - } else { - throw FormatException('Unexpected value type: ${value.runtimeType}'); - } -} diff --git a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart index 71551d67..352daf75 100644 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart +++ b/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_state.dart @@ -1,6 +1,6 @@ // ignore_for_file: must_be_immutable -part of 'diary_edit_bloc.dart'; +/*part of '../../../../features/diary/presentation/bloc/diary_bloc.dart'; class DiaryEditState extends Equatable { const DiaryEditState({this.diaryEditModelObj}); @@ -182,4 +182,4 @@ class DiaryEditErrorState extends DiaryEditState { @override List get props => [errorMessage]; -} +}*/ \ No newline at end of file diff --git a/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart b/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart index e5f942fe..1ccb56c7 100644 --- a/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart +++ b/lib/presentation/diary/diary_edit_screen/diary_edit_screen.dart @@ -1,19 +1,19 @@ // ignore_for_file: unused_local_variable -import 'package:carousel_slider/carousel_slider.dart'; -import 'package:eatvio_app/core/app_export.dart'; -import 'package:eatvio_app/widgets/custom_edit_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_edit_text_form_field.dart'; -import 'package:eatvio_app/widgets/custom_outlined_button.dart'; -import 'package:eatvio_app/widgets/custom_scale_element.dart'; -import 'package:fl_chart/fl_chart.dart'; +/*import '../../../features/diary/presentation/bloc/diary_bloc.dart'; +import 'models/diary_edit_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:fl_chart/fl_chart.dart'; import 'package:image_picker/image_picker.dart'; - -import 'bloc/diary_edit_bloc.dart'; -import 'models/diary_edit_model.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:eatvio_app/core/app_export.dart'; +import 'package:eatvio_app/widgets/custom_edit_text_form_field.dart'; +import 'package:eatvio_app/widgets/custom_edit_drop_down.dart'; +import 'package:eatvio_app/widgets/custom_outlined_button.dart'; +import 'package:eatvio_app/widgets/custom_scale_element.dart'; +import 'package:carousel_slider/carousel_slider.dart'; // ignore: must_be_immutable class DiaryEditScreen extends StatelessWidget { @@ -711,7 +711,7 @@ class DiaryEditScreen extends StatelessWidget { borderRadius: BorderRadiusStyle.roundedBorder5, ), child: Image.network( - baseUrl + '/storage/' + photo['path'], + dotenv.env['STORAGE_URL']! + photo['path'], ), ), Positioned( @@ -1250,3 +1250,4 @@ bool checkConsumedValues(List recommendedValues, List consumedValues) // Если ни одно потребленное значение не превышает рекомендованное с соответствующим индексом return false; // Возвращаем true } +*/ \ No newline at end of file diff --git a/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.freezed.dart b/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.freezed.dart deleted file mode 100644 index 13d4b864..00000000 --- a/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.freezed.dart +++ /dev/null @@ -1,198 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of '../../../../features/blog_post_create/models/blog_post_create_credentials_model.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -BlogPostCreateCredentialsModel _$BlogPostCreateCredentialsModelFromJson(Map json) { - return _BlogPostCreateCredentialsModel.fromJson(json); -} - -/// @nodoc -mixin _$BlogPostCreateCredentialsModel { - String get title => throw _privateConstructorUsedError; - String get description => throw _privateConstructorUsedError; - @JsonKey(name: 'youtube_url') - String get youtubeUrl => throw _privateConstructorUsedError; - String get status => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $BlogPostCreateCredentialsModelCopyWith get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $BlogPostCreateCredentialsModelCopyWith<$Res> { - factory $BlogPostCreateCredentialsModelCopyWith(BlogPostCreateCredentialsModel value, $Res Function(BlogPostCreateCredentialsModel) then) = - _$BlogPostCreateCredentialsModelCopyWithImpl<$Res, BlogPostCreateCredentialsModel>; - @useResult - $Res call({String title, String description, @JsonKey(name: 'youtube_url') String youtubeUrl, String status}); -} - -/// @nodoc -class _$BlogPostCreateCredentialsModelCopyWithImpl<$Res, $Val extends BlogPostCreateCredentialsModel> implements $BlogPostCreateCredentialsModelCopyWith<$Res> { - _$BlogPostCreateCredentialsModelCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? title = null, - Object? description = null, - Object? youtubeUrl = null, - Object? status = null, - }) { - return _then(_value.copyWith( - title: null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - youtubeUrl: null == youtubeUrl - ? _value.youtubeUrl - : youtubeUrl // ignore: cast_nullable_to_non_nullable - as String, - status: null == status - ? _value.status - : status // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$BlogPostCreateCredentialsModelImplCopyWith<$Res> implements $BlogPostCreateCredentialsModelCopyWith<$Res> { - factory _$$BlogPostCreateCredentialsModelImplCopyWith(_$BlogPostCreateCredentialsModelImpl value, $Res Function(_$BlogPostCreateCredentialsModelImpl) then) = - __$$BlogPostCreateCredentialsModelImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String title, String description, @JsonKey(name: 'youtube_url') String youtubeUrl, String status}); -} - -/// @nodoc -class __$$BlogPostCreateCredentialsModelImplCopyWithImpl<$Res> extends _$BlogPostCreateCredentialsModelCopyWithImpl<$Res, _$BlogPostCreateCredentialsModelImpl> - implements _$$BlogPostCreateCredentialsModelImplCopyWith<$Res> { - __$$BlogPostCreateCredentialsModelImplCopyWithImpl(_$BlogPostCreateCredentialsModelImpl _value, $Res Function(_$BlogPostCreateCredentialsModelImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? title = null, - Object? description = null, - Object? youtubeUrl = null, - Object? status = null, - }) { - return _then(_$BlogPostCreateCredentialsModelImpl( - title: null == title - ? _value.title - : title // ignore: cast_nullable_to_non_nullable - as String, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - youtubeUrl: null == youtubeUrl - ? _value.youtubeUrl - : youtubeUrl // ignore: cast_nullable_to_non_nullable - as String, - status: null == status - ? _value.status - : status // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$BlogPostCreateCredentialsModelImpl implements _BlogPostCreateCredentialsModel { - const _$BlogPostCreateCredentialsModelImpl( - {required this.title, required this.description, @JsonKey(name: 'youtube_url') required this.youtubeUrl, this.status = 'active'}); - - factory _$BlogPostCreateCredentialsModelImpl.fromJson(Map json) => _$$BlogPostCreateCredentialsModelImplFromJson(json); - - @override - final String title; - @override - final String description; - @override - @JsonKey(name: 'youtube_url') - final String youtubeUrl; - @override - @JsonKey() - final String status; - - @override - String toString() { - return 'BlogPostCreateCredentialsModel(title: $title, description: $description, youtubeUrl: $youtubeUrl, status: $status)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$BlogPostCreateCredentialsModelImpl && - (identical(other.title, title) || other.title == title) && - (identical(other.description, description) || other.description == description) && - (identical(other.youtubeUrl, youtubeUrl) || other.youtubeUrl == youtubeUrl) && - (identical(other.status, status) || other.status == status)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, title, description, youtubeUrl, status); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$BlogPostCreateCredentialsModelImplCopyWith<_$BlogPostCreateCredentialsModelImpl> get copyWith => - __$$BlogPostCreateCredentialsModelImplCopyWithImpl<_$BlogPostCreateCredentialsModelImpl>(this, _$identity); - - @override - Map toJson() { - return _$$BlogPostCreateCredentialsModelImplToJson( - this, - ); - } -} - -abstract class _BlogPostCreateCredentialsModel implements BlogPostCreateCredentialsModel { - const factory _BlogPostCreateCredentialsModel( - {required final String title, - required final String description, - @JsonKey(name: 'youtube_url') required final String youtubeUrl, - final String status}) = _$BlogPostCreateCredentialsModelImpl; - - factory _BlogPostCreateCredentialsModel.fromJson(Map json) = _$BlogPostCreateCredentialsModelImpl.fromJson; - - @override - String get title; - @override - String get description; - @override - @JsonKey(name: 'youtube_url') - String get youtubeUrl; - @override - String get status; - @override - @JsonKey(ignore: true) - _$$BlogPostCreateCredentialsModelImplCopyWith<_$BlogPostCreateCredentialsModelImpl> get copyWith => throw _privateConstructorUsedError; -} diff --git a/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.g.dart b/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.g.dart deleted file mode 100644 index f4bfea00..00000000 --- a/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.g.dart +++ /dev/null @@ -1,21 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of '../../../../features/blog_post_create/models/blog_post_create_credentials_model.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$BlogPostCreateCredentialsModelImpl _$$BlogPostCreateCredentialsModelImplFromJson(Map json) => _$BlogPostCreateCredentialsModelImpl( - title: json['title'] as String, - description: json['description'] as String, - youtubeUrl: json['youtube_url'] as String, - status: json['status'] as String? ?? 'active', - ); - -Map _$$BlogPostCreateCredentialsModelImplToJson(_$BlogPostCreateCredentialsModelImpl instance) => { - 'title': instance.title, - 'description': instance.description, - 'youtube_url': instance.youtubeUrl, - 'status': instance.status, - }; diff --git a/lib/presentation/feed/feed_screen/models/feed_model.dart b/lib/presentation/feed/feed_screen/models/feed_model.dart deleted file mode 100644 index 9e13172c..00000000 --- a/lib/presentation/feed/feed_screen/models/feed_model.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class FeedModel extends Equatable { - FeedModel(); - - FeedModel copyWith() { - return FeedModel(); - } - - @override - List get props => []; -}