From 3c4afe96d6cb4568838d4c85dece2c66c9ad4a11 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 3 Jul 2024 17:39:18 +0300 Subject: [PATCH 01/19] refactor(diary): Cubit and state for diary --- .../diary/presentation/bloc/diary_cubit.dart | 14 +- .../diary/presentation/bloc/diary_state.dart | 5 +- .../bloc/diary_state.freezed.dart | 620 ++++++++++++++++++ .../diary/repositories/diary_repository.dart | 19 +- .../diary/services/diary_service.dart | 8 +- .../diary/services/diary_service.g.dart | 103 +++ 6 files changed, 749 insertions(+), 20 deletions(-) create mode 100644 lib/features/diary/presentation/bloc/diary_state.freezed.dart create mode 100644 lib/features/diary/services/diary_service.g.dart diff --git a/lib/features/diary/presentation/bloc/diary_cubit.dart b/lib/features/diary/presentation/bloc/diary_cubit.dart index 07477bd0..26092c1c 100644 --- a/lib/features/diary/presentation/bloc/diary_cubit.dart +++ b/lib/features/diary/presentation/bloc/diary_cubit.dart @@ -1,22 +1,20 @@ -/*import 'package:eatvio_app/core/app_export.dart'; +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; + final DiaryRepository diaryRepository; - DiaryCubit({required this.blogPostRepository}) - : super(const DiaryState.loading()); + DiaryCubit({required this.diaryRepository}) : super(const DiaryState.loading()); - loadDiary(String blogPostID) async { + loadDiary(String diaryID) async { emit(const DiaryState.loading()); try { - final blogPost = await blogPostRepository.getDiary(blogPostID); - emit(DiaryState.loaded(blogPost: blogPost)); + final diary = await diaryRepository.getDiary(await diaryRepository.getDiaryID().toString()); + emit(DiaryState.loaded(diary: diary)); } catch (e) { emit(DiaryState.error(errorMessage: e.toString())); print(e); } } } -*/ \ No newline at end of file diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index d4305c8d..c673faf5 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -1,4 +1,4 @@ -/*import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/diary_model.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'diary_state.freezed.dart'; @@ -10,11 +10,10 @@ abstract class DiaryState with _$DiaryState { const factory DiaryState.loading() = DiaryStateLoading; const factory DiaryState.loaded({ - required DiaryModel blogPost, + required DiaryModel diary, }) = DiaryStateLoaded; const factory DiaryState.error({ required String errorMessage, }) = DiaryStateError; } -*/ \ No newline at end of file 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..04256bad --- /dev/null +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -0,0 +1,620 @@ +// 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) loaded, + required TResult Function(String errorMessage) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(DiaryModel diary)? loaded, + TResult? Function(String errorMessage)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(DiaryModel diary)? 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) loaded, + required TResult Function(String errorMessage) error, + }) { + return $default(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(DiaryModel diary)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return $default?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(DiaryModel diary)? 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) loaded, + required TResult Function(String errorMessage) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(DiaryModel diary)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(DiaryModel diary)? 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}); + + $DiaryModelCopyWith<$Res> get diary; +} + +/// @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, + }) { + return _then(_$DiaryStateLoadedImpl( + diary: null == diary + ? _value.diary + : diary // ignore: cast_nullable_to_non_nullable + as DiaryModel, + )); + } + + @override + @pragma('vm:prefer-inline') + $DiaryModelCopyWith<$Res> get diary { + return $DiaryModelCopyWith<$Res>(_value.diary, (value) { + return _then(_value.copyWith(diary: value)); + }); + } +} + +/// @nodoc + +class _$DiaryStateLoadedImpl implements DiaryStateLoaded { + const _$DiaryStateLoadedImpl({required this.diary}); + + @override + final DiaryModel diary; + + @override + String toString() { + return 'DiaryState.loaded(diary: $diary)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$DiaryStateLoadedImpl && + (identical(other.diary, diary) || other.diary == diary)); + } + + @override + int get hashCode => Object.hash(runtimeType, diary); + + @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) loaded, + required TResult Function(String errorMessage) error, + }) { + return loaded(diary); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(DiaryModel diary)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loaded?.call(diary); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(DiaryModel diary)? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(diary); + } + 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}) = + _$DiaryStateLoadedImpl; + + DiaryModel get diary; + @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) loaded, + required TResult Function(String errorMessage) error, + }) { + return error(errorMessage); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function(DiaryModel diary)? loaded, + TResult? Function(String errorMessage)? error, + }) { + return error?.call(errorMessage); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function(DiaryModel diary)? 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/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 1ae40d88..c6b1dc4e 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,17 +1,24 @@ -/*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/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(String diaryID) async { + try { + return await diaryService.getDiary(diaryID); } catch (e) { rethrow; } } } -*/ \ No newline at end of file diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index 6b6cb6bb..bf56e853 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,4 +1,4 @@ -/*import 'package:dio/dio.dart'; +import 'package:dio/dio.dart'; import 'package:eatvio_app/features/diary/models/diary_model.dart'; import 'package:retrofit/retrofit.dart'; @@ -8,7 +8,9 @@ part 'diary_service.g.dart'; abstract class DiaryService { factory DiaryService(Dio dio, {String baseUrl}) = _DiaryService; - @GET('/feed/show/{id}') + @GET('/diary/index') + Future getDiaryID(); + + @GET('/feed/{id}/show/') Future getDiary(@Path() String id); } -*/ \ No newline at end of file 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..09ce900d --- /dev/null +++ b/lib/features/diary/services/diary_service.g.dart @@ -0,0 +1,103 @@ +// 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!; + return _value; + } + + @override + Future getDiary(String 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, + '/feed/${id}/show/', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + 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(); + } +} From def95aeeb5be9fece6d61e4932e59b67621c09e0 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 3 Jul 2024 17:45:36 +0300 Subject: [PATCH 02/19] refactor(diary): LocatorService reg --- lib/locator_service.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/locator_service.dart b/lib/locator_service.dart index fb2637ec..0328dc6f 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -9,6 +9,9 @@ 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/diary/presentation/bloc/diary_cubit.dart'; +import 'package:eatvio_app/features/diary/repositories/diary_repository.dart'; +import 'package:eatvio_app/features/diary/services/diary_service.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get_it/get_it.dart'; @@ -21,16 +24,19 @@ Future init() async { sl.registerFactory(() => ChatRoomCubit(chatRepository: sl())); sl.registerFactory(() => FeedCubit(feedRepository: sl())); sl.registerFactory(() => BlogPostCubit(blogPostRepository: sl())); + sl.registerFactory(() => DiaryCubit(diaryRepository: sl())); // Repository sl.registerLazySingleton(() => ChatRepository(chatService: sl())); sl.registerLazySingleton(() => FeedRepository(feedService: sl())); sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl())); + sl.registerLazySingleton(() => DiaryRepository(diaryService: sl())); // Services sl.registerLazySingleton(() => ChatService(sl())); sl.registerLazySingleton(() => FeedService(sl())); sl.registerLazySingleton(() => BlogPostService(sl())); + sl.registerLazySingleton(() => DiaryService(sl())); // External sl.registerLazySingleton( From e4cde31d7696c93447a05949357bfba5c1a2c229 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Thu, 11 Jul 2024 14:35:29 +0300 Subject: [PATCH 03/19] refatcor(diary): Refactored (doesn't work yet though) --- lib/app_router.dart | 104 +- .../blog_post_create_credentials_model.dart | 2 + .../pages/blog_post_create_screen.dart | 2 + .../repositories/blog_repository.dart | 2 + .../services/blog_service.dart | 2 + .../services/blog_service.g.dart | 78 -- lib/features/diary/models/diary_model.dart | 81 +- .../diary/models/diary_model.freezed.dart | 20 +- lib/features/diary/models/diary_model.g.dart | 2 +- .../diary/presentation/bloc/diary_bloc.dart | 845 +++++++++++++ .../diary/presentation/bloc/diary_cubit.dart | 20 - .../diary/presentation/bloc/diary_event.dart} | 66 +- .../diary/presentation/bloc/diary_state.dart | 28 + .../bloc/diary_state.freezed.dart | 930 +++++++++++++- .../presentation/pages/diary_screen.dart | 227 ++-- .../diary/repositories/diary_repository.dart | 2 +- .../diary/services/diary_service.dart | 36 +- .../diary/services/diary_service.g.dart | 155 ++- lib/locator_service.dart | 22 +- lib/main.dart | 26 +- .../bloc/diary_edit_bloc.dart | 1078 ----------------- .../bloc/diary_edit_state.dart | 4 +- .../diary_edit_screen/diary_edit_screen.dart | 3 +- ...post_create_credentials_model.freezed.dart | 235 ---- .../blog_post_create_credentials_model.g.dart | 25 - .../feed/feed_screen/models/feed_model.dart | 16 - test/diary_test.dart | 5 +- 27 files changed, 2304 insertions(+), 1712 deletions(-) delete mode 100644 lib/features/blog_post_create/services/blog_service.g.dart create mode 100644 lib/features/diary/presentation/bloc/diary_bloc.dart delete mode 100644 lib/features/diary/presentation/bloc/diary_cubit.dart rename lib/{presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart => features/diary/presentation/bloc/diary_event.dart} (64%) delete mode 100644 lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart delete mode 100644 lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.freezed.dart delete mode 100644 lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.g.dart delete mode 100644 lib/presentation/feed/feed_screen/models/feed_model.dart diff --git a/lib/app_router.dart b/lib/app_router.dart index 30cda0b9..50f7968f 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -1,11 +1,10 @@ import 'package:eatvio_app/core/token_storage.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/diary/presentation/pages/diary_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'; @@ -60,72 +59,120 @@ class AppRouter { GoRoute( path: 'credentials-screen', name: 'credentialsScreen', - builder: (context, state) => CredentialsScreen.builder(context, state.extra), + builder: (context, state) => + CredentialsScreen.builder(context, state.extra), routes: [ GoRoute( path: 'name-screen', name: 'nameScreen', - builder: (context, state) => NameScreen.builder(context, state.extra), + builder: (context, state) => + NameScreen.builder(context, state.extra), routes: [ GoRoute( path: 'gender-screen', name: 'genderScreen', - builder: (context, state) => GenderScreen.builder(context, state.extra), + builder: (context, state) => + GenderScreen.builder(context, state.extra), routes: [ GoRoute( path: 'date-of-birth-screen', name: 'dateOfBirthScreen', - builder: (context, state) => DateOfBirthScreen.builder(context, state.extra), + builder: (context, state) => + DateOfBirthScreen.builder(context, state.extra), routes: [ GoRoute( path: 'city-of-living-screen', name: 'cityOfLivingScreen', - builder: (context, state) => CityOfLivingScreen.builder(context, state.extra), + builder: (context, state) => + CityOfLivingScreen.builder( + context, state.extra), routes: [ GoRoute( path: 'body-circumferences-screen', name: 'bodyCircumferencesScreen', - builder: (context, state) => BodyCircumferencesScreen.builder(context, state.extra), + builder: (context, state) => + BodyCircumferencesScreen.builder( + context, state.extra), routes: [ GoRoute( path: 'weight-screen', name: 'weightScreen', - builder: (context, state) => WeightScreen.builder(context, state.extra), + builder: (context, state) => + WeightScreen.builder( + context, state.extra), routes: [ GoRoute( path: 'height-screen', name: 'heightScreen', - builder: (context, state) => HeightScreen.builder(context, state.extra), + builder: (context, state) => + HeightScreen.builder( + context, state.extra), routes: [ GoRoute( path: 'blood-pressure-screen', name: 'bloodPressureScreen', - builder: (context, state) => BloodPressureScreen.builder(context, state.extra), + builder: (context, state) => + BloodPressureScreen.builder( + context, state.extra), routes: [ GoRoute( - path: 'favorite-sports-screen', - name: 'favoriteSportsScreen', - builder: (context, state) => FavoriteSportsScreen.builder(context, state.extra), + path: + 'favorite-sports-screen', + name: + 'favoriteSportsScreen', + builder: (context, state) => + FavoriteSportsScreen + .builder(context, + state.extra), routes: [ GoRoute( name: 'allergiesScreen', path: 'allergiesScreen', - builder: (context, state) => AllergiesScreen.builder(context, state.extra), + builder: (context, + state) => + AllergiesScreen + .builder( + context, + state + .extra), routes: [ GoRoute( - name: 'medicineIntakeScreen', - path: 'medicine-intake-screen', - builder: (context, state) => MedicineIntakeScreen.builder(context, state.extra), + name: + 'medicineIntakeScreen', + path: + 'medicine-intake-screen', + builder: (context, + state) => + MedicineIntakeScreen + .builder( + context, + state + .extra), ), GoRoute( - name: 'favoriteFoodsScreen', - path: 'favorite-foods-screen', - builder: (context, state) => FavoriteFoodsScreen.builder(context, state.extra), + name: + 'favoriteFoodsScreen', + path: + 'favorite-foods-screen', + builder: (context, + state) => + FavoriteFoodsScreen + .builder( + context, + state + .extra), routes: [ GoRoute( - path: 'additional-information-screen', - name: 'additionalInformationScreen', - builder: (context, state) => AdditionalInformationScreen.builder(context, state.extra), + path: + 'additional-information-screen', + name: + 'additionalInformationScreen', + builder: (context, + state) => + AdditionalInformationScreen.builder( + context, + state + .extra), ), ], ), @@ -170,15 +217,16 @@ class AppRouter { name: 'feedScreen', builder: (context, state) => FeedScreen(), routes: [ - GoRoute( + /*GoRoute( path: 'blog-post-create-screen', name: 'blogPostCreateScreen', builder: (context, state) => BlogPostCreateScreen.builder(context), - ), + ),*/ GoRoute( path: 'blog-post-screen', name: 'blogPostScreen', - builder: (context, state) => BlogPostScreen(blogPostID: state.extra as String), + builder: (context, state) => + BlogPostScreen(blogPostID: state.extra as String), routes: [ GoRoute( path: 'blog-post-edit-screen', @@ -195,7 +243,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 e961471b..957990db 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'; part '../../../presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.g.dart'; @@ -13,3 +14,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 4bedcf52..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,3 +1,4 @@ +/* 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'; @@ -237,3 +238,4 @@ bool _isValidUrl(String url) { 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 e11bce9e..104b1cdc 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'; @@ -18,3 +19,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 1291c9a9..d8e94496 100644 --- a/lib/features/blog_post_create/services/blog_service.dart +++ b/lib/features/blog_post_create/services/blog_service.dart @@ -1,3 +1,4 @@ +/* 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'; @@ -12,3 +13,4 @@ abstract class BlogService { Future createBlogPost( BlogPostCreateCredentialsModel model); } +*/ \ No newline at end of file diff --git a/lib/features/blog_post_create/services/blog_service.g.dart b/lib/features/blog_post_create/services/blog_service.g.dart deleted file mode 100644 index 71ca2119..00000000 --- a/lib/features/blog_post_create/services/blog_service.g.dart +++ /dev/null @@ -1,78 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'blog_service.dart'; - -// ************************************************************************** -// RetrofitGenerator -// ************************************************************************** - -// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element - -class _BlogService implements BlogService { - _BlogService( - this._dio, { - this.baseUrl, - }); - - final Dio _dio; - - String? baseUrl; - - @override - Future createBlogPost( - BlogPostCreateCredentialsModel model) async { - final _extra = {}; - final queryParameters = {}; - final _headers = {}; - const Map? _data = null; - final _result = await _dio.fetch>( - _setStreamType(Options( - method: 'POST', - headers: _headers, - extra: _extra, - ) - .compose( - _dio.options, - '/blog_post/create', - queryParameters: queryParameters, - data: _data, - ) - .copyWith( - baseUrl: _combineBaseUrls( - _dio.options.baseUrl, - baseUrl, - )))); - final _value = BlogPostCreateCredentialsModel.fromJson(_result.data!); - return _value; - } - - 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/features/diary/models/diary_model.dart b/lib/features/diary/models/diary_model.dart index 84832f18..fe7d6a24 100644 --- a/lib/features/diary/models/diary_model.dart +++ b/lib/features/diary/models/diary_model.dart @@ -12,25 +12,33 @@ class DiaryModel with _$DiaryModel { required DateTime retire, required int closed, required String comment, - required List meals}) = _DiaryModel; + required List meals}) = _DiaryModel; - factory DiaryModel.fromJson(Map json) => _$DiaryModelFromJson(json); + factory DiaryModel.fromJson(Map json) => + _$DiaryModelFromJson(json); } -class Meals { - int? id; - String? time; - int? type; - int? satiety; - int? mood; - List? portions; - List? photos; +class Meal { + late int id; + late String time; + late int type; + late int satiety; + late int mood; + List? portions; + List? photos; - Meals({this.id, this.time, this.type, this.satiety, this.mood, this.portions, this.photos}); + Meal( + {required this.id, + required this.time, + required this.type, + required this.satiety, + required this.mood, + this.portions, + this.photos}); - Meals.fromJson(Map json) { - List portions = []; - List photos = []; + Meal.fromJson(Map json) { + List portions = []; + List photos = []; id = json['id']; time = json['time']; type = json['type']; @@ -38,12 +46,12 @@ class Meals { mood = json['mood']; if (json['portions'] != null) { json['portions'].forEach((v) { - portions.add(new Portions.fromJson(v)); + portions.add(new Portion.fromJson(v)); }); } if (json['photos'] != null) { json['photos'].forEach((v) { - photos.add(new Photos.fromJson(v)); + photos.add(new Photo.fromJson(v)); }); } } @@ -65,20 +73,19 @@ class Meals { } } -class Portions { - int? id; - String? productName; - int? quantity; - String? portion; +class Portion { + late int id; + late String productName; + late int quantity; + late String portion; - Portions({this.id, this.productName, this.quantity, this.portion}); + Portion( + {required this.id, + required this.productName, + required this.quantity, + required this.portion}); - Portions.fromJson(Map json) { - id = json['id']; - productName = json['product_name']; - quantity = json['quantity']; - portion = json['portion']; - } + Portion.fromJson(v); Map toJson() { final Map data = new Map(); @@ -90,15 +97,19 @@ class Portions { } } -class Photos { - int? id; - String? originalName; - String? path; - int? size; +class Photo { + late int id; + late String originalName; + late String path; + late int size; - Photos({this.id, this.originalName, this.path, this.size}); + Photo( + {required this.id, + required this.originalName, + required this.path, + required this.size}); - Photos.fromJson(Map json) { + Photo.fromJson(Map json) { id = json['id']; originalName = json['original_name']; path = json['path']; diff --git a/lib/features/diary/models/diary_model.freezed.dart b/lib/features/diary/models/diary_model.freezed.dart index 5ede0101..6705ecfe 100644 --- a/lib/features/diary/models/diary_model.freezed.dart +++ b/lib/features/diary/models/diary_model.freezed.dart @@ -26,7 +26,7 @@ mixin _$DiaryModel { 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; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -47,7 +47,7 @@ abstract class $DiaryModelCopyWith<$Res> { DateTime retire, int closed, String comment, - List meals}); + List meals}); } /// @nodoc @@ -99,7 +99,7 @@ class _$DiaryModelCopyWithImpl<$Res, $Val extends DiaryModel> meals: null == meals ? _value.meals : meals // ignore: cast_nullable_to_non_nullable - as List, + as List, ) as $Val); } } @@ -119,7 +119,7 @@ abstract class _$$DiaryModelImplCopyWith<$Res> DateTime retire, int closed, String comment, - List meals}); + List meals}); } /// @nodoc @@ -169,7 +169,7 @@ class __$$DiaryModelImplCopyWithImpl<$Res> meals: null == meals ? _value._meals : meals // ignore: cast_nullable_to_non_nullable - as List, + as List, )); } } @@ -184,7 +184,7 @@ class _$DiaryModelImpl implements _DiaryModel { required this.retire, required this.closed, required this.comment, - required final List meals}) + required final List meals}) : _meals = meals; factory _$DiaryModelImpl.fromJson(Map json) => @@ -202,9 +202,9 @@ class _$DiaryModelImpl implements _DiaryModel { final int closed; @override final String comment; - final List _meals; + final List _meals; @override - List get meals { + List get meals { if (_meals is EqualUnmodifiableListView) return _meals; // ignore: implicit_dynamic_type return EqualUnmodifiableListView(_meals); @@ -256,7 +256,7 @@ abstract class _DiaryModel implements DiaryModel { required final DateTime retire, required final int closed, required final String comment, - required final List meals}) = _$DiaryModelImpl; + required final List meals}) = _$DiaryModelImpl; factory _DiaryModel.fromJson(Map json) = _$DiaryModelImpl.fromJson; @@ -274,7 +274,7 @@ abstract class _DiaryModel implements DiaryModel { @override String get comment; @override - List get meals; + List get meals; @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..9fabca81 100644 --- a/lib/features/diary/models/diary_model.g.dart +++ b/lib/features/diary/models/diary_model.g.dart @@ -15,7 +15,7 @@ _$DiaryModelImpl _$$DiaryModelImplFromJson(Map json) => 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(), ); 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..efc7b268 --- /dev/null +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -0,0 +1,845 @@ +import 'dart:async'; +import 'package:eatvio_app/features/diary/models/diary_model.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(_addComment); //пользователь нажимает "Добавить комментарий" + on( + _inputProduct, + ); + on(_finishDay); + on(_sendModeration); + on( + reloadScreen, + ); + on(_clearInput); + } + + loadDiary( + LoadDiary event, + Emitter emit, + ) async { + emit(const DiaryState.loading()); + try { + final diary = + await diaryRepository.getDiary(await diaryRepository.getDiaryID()); + emit(DiaryState.loaded( + diary: diary, + commentController: TextEditingController(), + productNameController: TextEditingController(), + productQuantityController: TextEditingController(), + caloriesController: TextEditingController(), + fatsController: TextEditingController(), + proteinsController: TextEditingController(), + carbsController: TextEditingController(), + wakeupExpanded: false, + moderationExpanded: false, + moodExpanded: false, + isLoading: false, + isAdded: false, + recommendedChartValues: [0, 0, 0, 0], + consumedChartValues: [0, 0, 0, 0])); + } catch (e) { + emit(DiaryState.error(errorMessage: e.toString())); + print(e); + } + } + + 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); + + 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 [[], []]; // Return empty lists instead of -1 + } + } + + refreshScreen( + int mealID, + DiaryEvent event, + Emitter emit, + ) async { + await reloadScreen(event, emit); + } + + reloadScreen( + DiaryEvent event, + Emitter emit, + ) async { + print("Reloading..."); + } + + Future _changeSatiety( + ChangeSatiety event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = + currentState.copyWith(selectedMood: event.selectedElement); + + // Отправляем данные по HTTP маршруту и ждем ответ + var response = await sendSatietyData( + event.selectedElement, + currentState.currentMeal?.id, + currentState.diary.id, + ); + + if (response.statusCode == 200) { + print( + 'Satiety change success! meal_id: ${currentState.currentMeal?.id}, mood: ${event.selectedElement}', + ); + emit(updatedState); // Передаем обновленное состояние в emit + } + } + } + + Future sendSatietyData( + int selectedSatiety, + int? mealID, + int diaryID, + ) async { + String url = dotenv.env['SERVER_ROOT']! + + '/diary/$diaryID/meal/$mealID/satiety/fill'; + final Map credentials = { + 'satiety': selectedSatiety, + }; + var response = await http.post( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + }, + body: json.encode(credentials), + encoding: utf8, + ); + return response; + } + + Future _changeMood( + ChangeMood event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = + currentState.copyWith(selectedMood: event.selectedElement); + + // Отправляем данные по HTTP маршруту и ждем ответ + var response = await sendMoodData( + event.selectedElement, + currentState.currentMeal?.id, + currentState.diary.id, + ); + + if (response.statusCode == 200) { + print( + 'Mood change success! meal_id: ${currentState.currentMeal?.id}, mood: ${event.selectedElement}', + ); + emit(updatedState); // Передаем обновленное состояние в emit + } + } + } + + Future sendMoodData( + int selectedMood, + int? mealID, + int diaryID, + ) async { + String url = + dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/meal/$mealID/mood/fill'; + final Map credentials = { + 'mood': selectedMood, + }; + + var response = await http.post( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + }, + body: json.encode(credentials), + encoding: utf8, + ); + + return response; + } + + FutureOr _changeWakeup( + WakeupEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var response = await sendWakeupData( + event.selectedTime, + currentState.diary.id, + ); + 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 DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var response = await sendRetireData( + event.selectedTime, + currentState.diary.id, + ); + 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( + TimeOfDay wakeup, + int diaryID, + ) async { + String url = dotenv.env['SERVER_ROOT']! + '/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', + }, + body: json.encode(credentials), + encoding: utf8, + ); + + return response; + } + + Future sendRetireData( + TimeOfDay retire, + int diaryID, + ) async { + String url = dotenv.env['SERVER_ROOT']! + '/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', + }, + body: json.encode(credentials), + encoding: utf8, + ); + + return response; + } + + 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); + } + } + + Future sendMealTimeData( + String? token, + TimeOfDay mealTime, + int? mealID, + int diaryID, + ) async { + String url = dotenv.env['SERVER_ROOT']! + '/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 DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + Meal? meal = + currentState.diary.meals.firstWhere((meal) => meal.id == event.value); + + DiaryStateLoaded updatedState = currentState.copyWith( + currentMeal: event.value, + portions: meal.portions, + photos: meal.photos, + mealTimeController: toTime(meal.time), + selectedMood: meal.mood, + selectedSatiety: meal.satiety, + ); + emit(updatedState); + } + } + + 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 _addPortion( + AddPortionEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + var response = await sendPortionData( + currentState.productNameController?.text, + currentState.portionController?.id == 0 ? 'pcs' : 'gr', + int.parse(currentState.productQuantityController!.text), + currentState.currentMeal!.id, + currentState.diary.id, + ); + + 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? name, + String portion, + int? quantity, + int? mealID, + int diaryID, + ) async { + String url = + '${dotenv.env['SERVER_ROOT']!}/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', + }, + body: json.encode(credentials), + encoding: utf8, + ); + + return response; + } + + Future _inputProduct( + ProductInput event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + final Map credentials = {'name': event.input}; + final uri = Uri.parse( + '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/filter?${Uri(queryParameters: credentials).query}', + ); + + final response = await http.get( + uri, + headers: { + 'Content-Type': 'application/json', + }, + ); + + 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 DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + int? mealId = + currentState.currentMeal?.id; // Rename id to mealId for clarity + + var response = await sendRemovePortion( + event.portionId, + mealId, + currentState.diary.id, + ); + + if (response.statusCode == 204) { + await reloadScreen(event, emit); + } else { + print( + 'Failed to add portion. Status Code: ${response.statusCode} ${response.body}', + ); + } + } + } + + Future sendRemovePortion( + int? portionID, + int? mealID, + int diaryID, + ) async { + String url = + '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; + + var response = await http.delete( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + }, + encoding: utf8, + ); + + return response; + } + + FutureOr _removeImage( + RemoveImageEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + var response = await sendRemovePhoto( + event.path, + event.photoID, + currentState.currentMeal?.id, + currentState.diary.id, + ); + 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? path, + String? photoID, + int? mealID, + int diaryID, + ) async { + String url = + '${dotenv.env['SERVER_ROOT']!}/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', + }, + body: json.encode(credentials), + encoding: utf8, + ); + + return response; + } + + Future _finishDay(FinishDay event, Emitter emit) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + var response = await sendFinishDay( + currentState.diary.id, + currentState.wakeupController, + currentState.retireController, + currentState.commentController?.text, + ); + + if (response.statusCode == 200) { + await reloadScreen(event, emit); + } + } + } + + Future sendFinishDay( + 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 = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/finishDay'; + + var response = await http.post( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + }, + body: json.encode(credentials), + encoding: utf8, + ); + + return response; + } + + Future _uploadImages( + UploadImages event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + emit(currentState.copyWith(isLoading: true)); + await uploadImageToServer( + event.image.path, + currentState.diary.id, + currentState.currentMeal!.id, + ); + await reloadScreen(event, emit); + } + } + + Future uploadImageToServer( + String imagePath, + int diaryID, + int mealId, + ) async { + String url = + '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload'; + + var request = http.MultipartRequest('POST', Uri.parse(url)); + + 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 DiaryStateLoaded) { + final response = await _sendModerationData( + event.name, + event.energyOn100gr, + event.proteinsOn100gr, + event.fatsOn100gr, + event.carbohydratesOn100gr, + ); + + 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, + ) async { + final Uri url = Uri.parse( + '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/sendToModeration', + ); + final Uri serverURL = Uri.parse('${dotenv.env['SERVER_ROOT']!}'); + 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, + '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 DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + var updatedState = currentState.copyWith( + commentController: TextEditingController(text: event.comment), + ); + + // Отправляем данные по HTTP маршруту и ждем ответ + var response = await sendCommentData( + event.comment, + currentState.diary.id, + ); + + if (response.statusCode == 200) { + emit(updatedState); // Передаем обновленное состояние в emit + } + } + } + + Future sendCommentData( + String comment, + int diaryID, + ) async { + String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/retire/fill'; + final Map credentials = { + 'comment': comment, + }; + + var response = await http.post( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + }, + 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 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 26092c1c..00000000 --- a/lib/features/diary/presentation/bloc/diary_cubit.dart +++ /dev/null @@ -1,20 +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 diaryRepository; - - DiaryCubit({required this.diaryRepository}) : super(const DiaryState.loading()); - - loadDiary(String diaryID) async { - emit(const DiaryState.loading()); - try { - final diary = await diaryRepository.getDiary(await diaryRepository.getDiaryID().toString()); - emit(DiaryState.loaded(diary: diary)); - } 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 c2c5dad3..6568873f 100644 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -1,21 +1,21 @@ // 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, ); @@ -25,7 +25,7 @@ class ChangeSatiety extends DiaryEditEvent { List get props => [selectedElement]; } -class ChangeMood extends DiaryEditEvent { +class ChangeMood extends DiaryEvent { ChangeMood( this.selectedElement, ); @@ -35,7 +35,7 @@ class ChangeMood extends DiaryEditEvent { List get props => [selectedElement]; } -class ChangeMealTime extends DiaryEditEvent { +class ChangeMealTime extends DiaryEvent { ChangeMealTime(this.time); final TimeOfDay time; @@ -43,7 +43,7 @@ class ChangeMealTime extends DiaryEditEvent { List get props => [time]; } -class AddComment extends DiaryEditEvent { +class AddComment extends DiaryEvent { AddComment(this.diaryId, this.comment); final String comment; final int diaryId; @@ -52,7 +52,7 @@ class AddComment extends DiaryEditEvent { List get props => [comment, diaryId]; } -class WakeupEvent extends DiaryEditEvent { +class WakeupEvent extends DiaryEvent { WakeupEvent(this.selectedTime); final TimeOfDay selectedTime; @@ -60,7 +60,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 +68,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,24 +106,23 @@ 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 { +class ChangeMeal extends DiaryEvent { ChangeMeal({required this.value, required this.meals}); - SelectionPopupModel value; - List? meals; + Meal value; + List? meals; @override List get props => [value, meals]; } - -class ClearInput extends DiaryEditEvent { +class ClearInput extends DiaryEvent { ClearInput({required this.value}); TextEditingController value; @@ -131,7 +130,7 @@ class ClearInput extends DiaryEditEvent { List get props => [value]; } -class ChangePortion extends DiaryEditEvent { +class ChangePortion extends DiaryEvent { ChangePortion({required this.value}); SelectionPopupModel value; @@ -139,27 +138,28 @@ class ChangePortion extends DiaryEditEvent { 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 { - SendModeration( - {required this.name, - required this.energyOn100gr, - required this.proteinsOn100gr, - required this.fatsOn100gr, - required this.carbohydratesOn100gr,}); +class SendModeration extends DiaryEvent { + SendModeration({ + required this.name, + required this.energyOn100gr, + required this.proteinsOn100gr, + required this.fatsOn100gr, + required this.carbohydratesOn100gr, + }); String name; String energyOn100gr; String proteinsOn100gr; diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index c673faf5..d1c2c602 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -1,6 +1,9 @@ import 'package:eatvio_app/features/diary/models/diary_model.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 @@ -11,6 +14,31 @@ abstract class DiaryState with _$DiaryState { const factory DiaryState.loaded({ required DiaryModel diary, + String? diaryDate, + List? autocompleteList, + required List recommendedChartValues, + required List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + required TextEditingController? commentController, + required TextEditingController? productNameController, + required TextEditingController? productQuantityController, + required TextEditingController? caloriesController, + required TextEditingController? fatsController, + required TextEditingController? proteinsController, + required TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + required bool wakeupExpanded, + required bool moderationExpanded, + required bool moodExpanded, + required bool isLoading, + required bool isAdded, }) = DiaryStateLoaded; const factory DiaryState.error({ diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 04256bad..d5d614a5 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -20,7 +20,34 @@ mixin _$DiaryState { TResult when( TResult Function() $default, { required TResult Function() loading, - required TResult Function(DiaryModel diary) loaded, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded) + loaded, required TResult Function(String errorMessage) error, }) => throw _privateConstructorUsedError; @@ -28,7 +55,34 @@ mixin _$DiaryState { TResult? whenOrNull( TResult? Function()? $default, { TResult? Function()? loading, - TResult? Function(DiaryModel diary)? loaded, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult? Function(String errorMessage)? error, }) => throw _privateConstructorUsedError; @@ -36,7 +90,34 @@ mixin _$DiaryState { TResult maybeWhen( TResult Function()? $default, { TResult Function()? loading, - TResult Function(DiaryModel diary)? loaded, + TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult Function(String errorMessage)? error, required TResult orElse(), }) => @@ -126,7 +207,34 @@ class _$DiaryStateImpl implements _DiaryState { TResult when( TResult Function() $default, { required TResult Function() loading, - required TResult Function(DiaryModel diary) loaded, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded) + loaded, required TResult Function(String errorMessage) error, }) { return $default(); @@ -137,7 +245,34 @@ class _$DiaryStateImpl implements _DiaryState { TResult? whenOrNull( TResult? Function()? $default, { TResult? Function()? loading, - TResult? Function(DiaryModel diary)? loaded, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult? Function(String errorMessage)? error, }) { return $default?.call(); @@ -148,7 +283,34 @@ class _$DiaryStateImpl implements _DiaryState { TResult maybeWhen( TResult Function()? $default, { TResult Function()? loading, - TResult Function(DiaryModel diary)? loaded, + TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult Function(String errorMessage)? error, required TResult orElse(), }) { @@ -240,7 +402,34 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult when( TResult Function() $default, { required TResult Function() loading, - required TResult Function(DiaryModel diary) loaded, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded) + loaded, required TResult Function(String errorMessage) error, }) { return loading(); @@ -251,7 +440,34 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult? whenOrNull( TResult? Function()? $default, { TResult? Function()? loading, - TResult? Function(DiaryModel diary)? loaded, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult? Function(String errorMessage)? error, }) { return loading?.call(); @@ -262,7 +478,34 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult maybeWhen( TResult Function()? $default, { TResult Function()? loading, - TResult Function(DiaryModel diary)? loaded, + TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult Function(String errorMessage)? error, required TResult orElse(), }) { @@ -320,7 +563,33 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { $Res Function(_$DiaryStateLoadedImpl) then) = __$$DiaryStateLoadedImplCopyWithImpl<$Res>; @useResult - $Res call({DiaryModel diary}); + $Res call( + {DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded}); $DiaryModelCopyWith<$Res> get diary; } @@ -337,12 +606,137 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> @override $Res call({ Object? diary = null, + Object? diaryDate = freezed, + Object? autocompleteList = freezed, + Object? recommendedChartValues = null, + Object? consumedChartValues = null, + Object? portions = freezed, + Object? photos = freezed, + Object? currentMeal = freezed, + Object? portionController = freezed, + Object? wakeupController = freezed, + Object? retireController = freezed, + Object? mealTimeController = freezed, + Object? commentController = freezed, + Object? productNameController = freezed, + Object? productQuantityController = freezed, + Object? caloriesController = freezed, + Object? fatsController = freezed, + Object? proteinsController = freezed, + Object? carbsController = freezed, + Object? selectedMood = freezed, + Object? selectedSatiety = freezed, + Object? wakeupExpanded = null, + Object? moderationExpanded = null, + Object? moodExpanded = null, + Object? isLoading = null, + Object? isAdded = null, }) { 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?, + autocompleteList: freezed == autocompleteList + ? _value._autocompleteList + : autocompleteList // ignore: cast_nullable_to_non_nullable + as List?, + 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: freezed == portions + ? _value._portions + : portions // ignore: cast_nullable_to_non_nullable + as List?, + photos: freezed == photos + ? _value._photos + : photos // ignore: cast_nullable_to_non_nullable + as List?, + currentMeal: freezed == currentMeal + ? _value.currentMeal + : currentMeal // ignore: cast_nullable_to_non_nullable + as Meal?, + portionController: freezed == 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: freezed == commentController + ? _value.commentController + : commentController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + productNameController: freezed == productNameController + ? _value.productNameController + : productNameController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + productQuantityController: freezed == productQuantityController + ? _value.productQuantityController + : productQuantityController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + caloriesController: freezed == caloriesController + ? _value.caloriesController + : caloriesController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + fatsController: freezed == fatsController + ? _value.fatsController + : fatsController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + proteinsController: freezed == proteinsController + ? _value.proteinsController + : proteinsController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + carbsController: freezed == carbsController + ? _value.carbsController + : carbsController // ignore: cast_nullable_to_non_nullable + as TextEditingController?, + selectedMood: freezed == selectedMood + ? _value.selectedMood + : selectedMood // ignore: cast_nullable_to_non_nullable + as int?, + selectedSatiety: freezed == 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, )); } @@ -358,14 +752,134 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> /// @nodoc class _$DiaryStateLoadedImpl implements DiaryStateLoaded { - const _$DiaryStateLoadedImpl({required this.diary}); + const _$DiaryStateLoadedImpl( + {required this.diary, + this.diaryDate, + final List? autocompleteList, + required final List recommendedChartValues, + required final List consumedChartValues, + final List? portions, + final List? photos, + this.currentMeal, + this.portionController, + this.wakeupController, + this.retireController, + this.mealTimeController, + required this.commentController, + required this.productNameController, + required this.productQuantityController, + required this.caloriesController, + required this.fatsController, + required this.proteinsController, + required this.carbsController, + this.selectedMood, + this.selectedSatiety, + required this.wakeupExpanded, + required this.moderationExpanded, + required this.moodExpanded, + required this.isLoading, + required this.isAdded}) + : _autocompleteList = autocompleteList, + _recommendedChartValues = recommendedChartValues, + _consumedChartValues = consumedChartValues, + _portions = portions, + _photos = photos; @override final DiaryModel diary; + @override + final String? diaryDate; + final List? _autocompleteList; + @override + List? get autocompleteList { + final value = _autocompleteList; + if (value == null) return null; + if (_autocompleteList is EqualUnmodifiableListView) + return _autocompleteList; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + 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 { + final value = _portions; + if (value == null) return null; + if (_portions is EqualUnmodifiableListView) return _portions; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + final List? _photos; + @override + List? get photos { + final value = _photos; + if (value == null) return null; + if (_photos is EqualUnmodifiableListView) return _photos; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); + } + + @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? productNameController; + @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; @override String toString() { - return 'DiaryState.loaded(diary: $diary)'; + return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, autocompleteList: $autocompleteList, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, productNameController: $productNameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded)'; } @override @@ -373,11 +887,87 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return identical(this, other) || (other.runtimeType == runtimeType && other is _$DiaryStateLoadedImpl && - (identical(other.diary, diary) || other.diary == diary)); + (identical(other.diary, diary) || other.diary == diary) && + (identical(other.diaryDate, diaryDate) || + other.diaryDate == diaryDate) && + const DeepCollectionEquality() + .equals(other._autocompleteList, _autocompleteList) && + const DeepCollectionEquality().equals( + other._recommendedChartValues, _recommendedChartValues) && + const DeepCollectionEquality() + .equals(other._consumedChartValues, _consumedChartValues) && + const DeepCollectionEquality().equals(other._portions, _portions) && + const DeepCollectionEquality().equals(other._photos, _photos) && + (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.productNameController, productNameController) || + other.productNameController == productNameController) && + (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)); } @override - int get hashCode => Object.hash(runtimeType, diary); + int get hashCode => Object.hashAll([ + runtimeType, + diary, + diaryDate, + const DeepCollectionEquality().hash(_autocompleteList), + const DeepCollectionEquality().hash(_recommendedChartValues), + const DeepCollectionEquality().hash(_consumedChartValues), + const DeepCollectionEquality().hash(_portions), + const DeepCollectionEquality().hash(_photos), + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + productNameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded + ]); @JsonKey(ignore: true) @override @@ -391,10 +981,63 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult when( TResult Function() $default, { required TResult Function() loading, - required TResult Function(DiaryModel diary) loaded, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded) + loaded, required TResult Function(String errorMessage) error, }) { - return loaded(diary); + return loaded( + diary, + diaryDate, + autocompleteList, + recommendedChartValues, + consumedChartValues, + portions, + photos, + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + productNameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded); } @override @@ -402,10 +1045,63 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult? whenOrNull( TResult? Function()? $default, { TResult? Function()? loading, - TResult? Function(DiaryModel diary)? loaded, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult? Function(String errorMessage)? error, }) { - return loaded?.call(diary); + return loaded?.call( + diary, + diaryDate, + autocompleteList, + recommendedChartValues, + consumedChartValues, + portions, + photos, + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + productNameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded); } @override @@ -413,12 +1109,65 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult maybeWhen( TResult Function()? $default, { TResult Function()? loading, - TResult Function(DiaryModel diary)? loaded, + TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult Function(String errorMessage)? error, required TResult orElse(), }) { if (loaded != null) { - return loaded(diary); + return loaded( + diary, + diaryDate, + autocompleteList, + recommendedChartValues, + consumedChartValues, + portions, + photos, + currentMeal, + portionController, + wakeupController, + retireController, + mealTimeController, + commentController, + productNameController, + productQuantityController, + caloriesController, + fatsController, + proteinsController, + carbsController, + selectedMood, + selectedSatiety, + wakeupExpanded, + moderationExpanded, + moodExpanded, + isLoading, + isAdded); } return orElse(); } @@ -462,10 +1211,60 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { } abstract class DiaryStateLoaded implements DiaryState { - const factory DiaryStateLoaded({required final DiaryModel diary}) = - _$DiaryStateLoadedImpl; + const factory DiaryStateLoaded( + {required final DiaryModel diary, + final String? diaryDate, + final List? autocompleteList, + required final List recommendedChartValues, + required final List consumedChartValues, + final List? portions, + final List? photos, + final Meal? currentMeal, + final SelectionPopupModel? portionController, + final TimeOfDay? wakeupController, + final TimeOfDay? retireController, + final TimeOfDay? mealTimeController, + required final TextEditingController? commentController, + required final TextEditingController? productNameController, + required final TextEditingController? productQuantityController, + required final TextEditingController? caloriesController, + required final TextEditingController? fatsController, + required final TextEditingController? proteinsController, + required final TextEditingController? carbsController, + final int? selectedMood, + final int? selectedSatiety, + required final bool wakeupExpanded, + required final bool moderationExpanded, + required final bool moodExpanded, + required final bool isLoading, + required final bool isAdded}) = _$DiaryStateLoadedImpl; DiaryModel get diary; + String? get diaryDate; + List? get autocompleteList; + List get recommendedChartValues; + List get consumedChartValues; + List? get portions; + List? get photos; + Meal? get currentMeal; + SelectionPopupModel? get portionController; + TimeOfDay? get wakeupController; + TimeOfDay? get retireController; + TimeOfDay? get mealTimeController; + TextEditingController? get commentController; + TextEditingController? get productNameController; + 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; @JsonKey(ignore: true) _$$DiaryStateLoadedImplCopyWith<_$DiaryStateLoadedImpl> get copyWith => throw _privateConstructorUsedError; @@ -539,7 +1338,34 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult when( TResult Function() $default, { required TResult Function() loading, - required TResult Function(DiaryModel diary) loaded, + required TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded) + loaded, required TResult Function(String errorMessage) error, }) { return error(errorMessage); @@ -550,7 +1376,34 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult? whenOrNull( TResult? Function()? $default, { TResult? Function()? loading, - TResult? Function(DiaryModel diary)? loaded, + TResult? Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult? Function(String errorMessage)? error, }) { return error?.call(errorMessage); @@ -561,7 +1414,34 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult maybeWhen( TResult Function()? $default, { TResult Function()? loading, - TResult Function(DiaryModel diary)? loaded, + TResult Function( + DiaryModel diary, + String? diaryDate, + List? autocompleteList, + List recommendedChartValues, + List consumedChartValues, + List? portions, + List? photos, + Meal? currentMeal, + SelectionPopupModel? portionController, + TimeOfDay? wakeupController, + TimeOfDay? retireController, + TimeOfDay? mealTimeController, + TextEditingController? commentController, + TextEditingController? productNameController, + TextEditingController? productQuantityController, + TextEditingController? caloriesController, + TextEditingController? fatsController, + TextEditingController? proteinsController, + TextEditingController? carbsController, + int? selectedMood, + int? selectedSatiety, + bool wakeupExpanded, + bool moderationExpanded, + bool moodExpanded, + bool isLoading, + bool isAdded)? + loaded, TResult Function(String errorMessage)? error, required TResult orElse(), }) { diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 9cbf2045..da609814 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -1,7 +1,11 @@ // ignore_for_file: unused_local_variable -/*import 'bloc/diary_edit_bloc.dart'; -import 'models/diary_edit_model.dart'; +import 'package:eatvio_app/features/diary/models/diary_model.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/locator_service.dart'; +import 'package:flutter/cupertino.dart'; + import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; @@ -16,42 +20,45 @@ import 'package:eatvio_app/widgets/custom_scale_element.dart'; import 'package:carousel_slider/carousel_slider.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( - builder: (context, state) { - if (state is DiaryEditInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is DiaryEditLoadedState) { - // Данные загружены, можно строить экран. - return _buildDiaryEditScreen(context, state); - } else if (state is DiaryEditErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, + return BlocProvider( + create: (context) => sl()..add(LoadDiary()), + child: BlocBuilder( + builder: (context, state) { + 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("Неопределенная ошибка"), + ), + ), + ); + }, + ), ); } - Widget _buildDiaryEditScreen( - BuildContext context, DiaryEditLoadedState state) { + Widget _buildDiary(BuildContext context, DiaryStateLoaded state) { return RefreshIndicator( onRefresh: refreshPage(context), child: Stack( @@ -121,13 +128,13 @@ class DiaryEditScreen extends StatelessWidget { 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 +169,7 @@ class DiaryEditScreen extends StatelessWidget { ), SizedBox(height: 2.v), Text( - state.diaryDate.toString(), + state.diary.date.toString(), style: CustomTextStyles.bodyMediumBluegray800, ), ], @@ -174,7 +181,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 +192,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), @@ -258,14 +265,14 @@ 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(); @@ -329,17 +336,22 @@ 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: mealsToDropdown(diary!.meals), contentPadding: EdgeInsets.symmetric( horizontal: 10.h, vertical: 9.v, ), - defaultValue: diaryEditModelObj?.mealList[0], + defaultValue: mealsToDropdown(diary.meals)[0], onChanged: changeMeal(context, state), ); }, @@ -424,13 +436,20 @@ 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: [ + SelectionPopupModel(title: "gr"), + SelectionPopupModel(title: "pcs") + ], + defaultValue: SelectionPopupModel(title: "gr"), onChanged: changePortion(context, state), ); }, @@ -463,9 +482,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 +524,7 @@ class DiaryEditScreen extends StatelessWidget { ], ); } else { - return Container(); // Возвращаем пустой контейнер, если состояние не является DiaryEditLoadedState + return Container(); // Возвращаем пустой контейнер, если состояние не является DiaryState } }, ), @@ -514,7 +533,7 @@ class DiaryEditScreen extends StatelessWidget { ); } - openCaloriesDialog(BuildContext context, DiaryEditLoadedState state) { + openCaloriesDialog(BuildContext context, DiaryStateLoaded state) { showDialog( context: context, builder: (BuildContext dialogContext) { @@ -587,7 +606,7 @@ class DiaryEditScreen extends StatelessWidget { ) { return () { // Call function to send moderation with the entered values - context.read().add( + context.read().add( SendModeration( name: name, energyOn100gr: energyOn100gr, @@ -609,12 +628,12 @@ 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) { + DiaryStateLoaded state) { state.productNameController?.text = option; return () { onSelected(option); @@ -627,7 +646,7 @@ class DiaryEditScreen extends StatelessWidget { ?.map((dynamic item) => item as String) .toList());*/ if (value.length > 2) { - context.read().add(ProductInput(value)); + context.read().add(ProductInput(value)); } }; } @@ -640,27 +659,27 @@ 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)); + .read() + .add(ChangeMeal(meals: state.diary.meals, value: value)); }; } - changePortion(BuildContext context, DiaryEditLoadedState state) { + changePortion(BuildContext context, DiaryState 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) { + items: state.currentMeal!.photos!.map((photo) { return _buildPhoto( context, photo); // Assuming photos are stored as strings }).toList(), @@ -668,7 +687,7 @@ class DiaryEditScreen extends StatelessWidget { } } - _buildProduct(BuildContext context, Map portion) { + _buildProduct(BuildContext context, Portion portion) { return Container( margin: EdgeInsets.symmetric(horizontal: 10.h), padding: EdgeInsets.symmetric( @@ -688,9 +707,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.productName.length > 8 + ? portion.productName.substring(0, 8) + : portion.productName, style: CustomTextStyles.titleMedium16, ), ), @@ -701,9 +720,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 +739,7 @@ class DiaryEditScreen extends StatelessWidget { ); } - _buildPhoto(BuildContext context, Map photo) { + _buildPhoto(BuildContext context, Photo photo) { return Stack( children: [ Container( @@ -731,7 +748,7 @@ class DiaryEditScreen extends StatelessWidget { borderRadius: BorderRadiusStyle.roundedBorder5, ), child: Image.network( - dotenv.env['STORAGE_URL']! + photo['path'], + dotenv.env['STORAGE_URL']! + photo.path, ), ), Positioned( @@ -756,21 +773,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; // @@ -992,7 +1009,7 @@ 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 +1053,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 +1129,7 @@ class DiaryEditScreen extends StatelessWidget { toggleWakeup(BuildContext context) { return () { - BlocProvider.of(context).add(ToggleWakeupExpandedEvent()); + BlocProvider.of(context).add(ToggleWakeupExpandedEvent()); }; } @@ -1146,7 +1163,7 @@ class DiaryEditScreen extends StatelessWidget { BuildContext dialogContext, BuildContext context) { return () { closeDialog(dialogContext); - context.read().add(FinishDay()); + context.read().add(FinishDay()); }; } @@ -1156,7 +1173,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 +1255,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 +1310,13 @@ bool checkConsumedValues( // Если ни одно потребленное значение не превышает рекомендованное с соответствующим индексом return false; // Возвращаем true } -*/ \ No newline at end of file + +List mealsToDropdown(List meals) { + return meals + .map((meal) => SelectionPopupModel( + id: meal.id, + title: "Прием пищи ${meal.id}", + isSelected: false, + )) + .toList(); +} diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index c6b1dc4e..440f4195 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -14,7 +14,7 @@ class DiaryRepository { } } - Future getDiary(String diaryID) async { + Future getDiary(int diaryID) async { try { return await diaryService.getDiary(diaryID); } catch (e) { diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index bf56e853..dd27f0ba 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,5 +1,6 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:flutter/material.dart'; import 'package:retrofit/retrofit.dart'; part 'diary_service.g.dart'; @@ -11,6 +12,37 @@ abstract class DiaryService { @GET('/diary/index') Future getDiaryID(); - @GET('/feed/{id}/show/') - Future getDiary(@Path() String id); + @GET('/diary/{id}/show/') + Future getDiary(@Path() int id); + + @GET('/diary/{id}/dailyNutritionData/') + Future getChart(@Path() String id); + + @POST('/diary/{diaryID}/meal/{mealID}/satiety/fill') + Future sendSatiety( + @Path() String diaryID, + String mealID, + int satiety, + ); + + @POST('/diary/{diaryID}/meal/{mealID}/mood/fill') + Future sendMood( + @Path() String diaryID, + String mealID, + int mood, + ); + + @POST('/diary/{diaryID}/wakeup/fill') + Future sendWakeup( + @Path() String diaryID, + String mealID, + TimeOfDay wakeup, + ); + + @POST('/diary/{diaryID}/retire/fill') + Future sendRetire( + @Path() String diaryID, + String mealID, + TimeOfDay retire, + ); } diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index 09ce900d..294e4e3d 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -45,7 +45,7 @@ class _DiaryService implements DiaryService { } @override - Future getDiary(String id) async { + Future getDiary(int id) async { final _extra = {}; final queryParameters = {}; final _headers = {}; @@ -58,7 +58,158 @@ class _DiaryService implements DiaryService { ) .compose( _dio.options, - '/feed/${id}/show/', + '/diary/${id}/show/', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future getChart(String 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 = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future sendSatiety( + String diaryID, + String mealID, + int satiety, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diaryID}/meal/{mealID}/satiety/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future sendMood( + String diaryID, + String mealID, + int mood, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diaryID}/meal/{mealID}/mood/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future sendWakeup( + String diaryID, + String mealID, + TimeOfDay wakeup, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diaryID}/wakeup/fill', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future sendRetire( + String diaryID, + String mealID, + TimeOfDay retire, + ) async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _result = await _dio + .fetch>(_setStreamType(Options( + method: 'POST', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/diary/${diaryID}/retire/fill', queryParameters: queryParameters, data: _data, ) diff --git a/lib/locator_service.dart b/lib/locator_service.dart index 0328dc6f..7f2caf5d 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -9,7 +9,7 @@ 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/diary/presentation/bloc/diary_cubit.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_bloc.dart'; import 'package:eatvio_app/features/diary/repositories/diary_repository.dart'; import 'package:eatvio_app/features/diary/services/diary_service.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; @@ -19,18 +19,24 @@ final sl = GetIt.instance; Future init() async { // BLoC / Cubit - sl.registerLazySingleton(() => InitializationCubit(chatRepository: sl())); + sl.registerLazySingleton( + () => InitializationCubit(chatRepository: sl())); sl.registerFactory(() => ChatRoomCubit(chatRepository: sl())); sl.registerFactory(() => FeedCubit(feedRepository: sl())); - sl.registerFactory(() => BlogPostCubit(blogPostRepository: sl())); - sl.registerFactory(() => DiaryCubit(diaryRepository: 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(() => DiaryRepository(diaryService: sl())); + sl.registerLazySingleton( + () => ChatRepository(chatService: sl())); + sl.registerLazySingleton( + () => FeedRepository(feedService: sl())); + sl.registerLazySingleton( + () => BlogPostRepository(blogPostService: sl())); + sl.registerLazySingleton( + () => DiaryRepository(diaryService: sl())); // Services sl.registerLazySingleton(() => ChatService(sl())); diff --git a/lib/main.dart b/lib/main.dart index 684e227e..bd7e66cc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,8 +5,7 @@ import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/b import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/models/chat_select_model.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; 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'; @@ -42,13 +41,24 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (context) => InitializationCubit(chatRepository: sl())), - 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) => InitializationCubit(chatRepository: sl())), + 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) => sl()..add(LoadDiary()), + ), BlocProvider( - create: (context) => ChatSelectBloc(ChatSelectState(chatSelectModelObj: ChatSelectModel()))..add(ChatSelectInitialEvent()), + create: (context) => ChatSelectBloc( + ChatSelectState(chatSelectModelObj: ChatSelectModel())) + ..add(ChatSelectInitialEvent()), ), ], child: BlocListener( 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 e93f2957..00000000 --- a/lib/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart +++ /dev/null @@ -1,1078 +0,0 @@ -import 'dart:async'; -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/presentation/diary/diary_edit_screen/models/diary_edit_model.dart'; -import 'package:http/http.dart' as http; -import 'dart:convert'; -import 'package:hive/hive.dart'; -import 'package:flutter_dotenv/flutter_dotenv.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(dotenv.env['SERVER_ROOT']! + '/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(dotenv.env['SERVER_ROOT']! + '/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( - dotenv.env['SERVER_ROOT']! + '/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(dotenv.env['SERVER_ROOT']! + '/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(dotenv.env['SERVER_ROOT']! + '/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( - dotenv.env['SERVER_ROOT']! + '/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 = dotenv.env['SERVER_ROOT']! + '/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 = dotenv.env['SERVER_ROOT']! + '/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 = dotenv.env['SERVER_ROOT']! + '/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 = dotenv.env['SERVER_ROOT']! + '/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 = dotenv.env['SERVER_ROOT']! + '/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 = '${dotenv.env['SERVER_ROOT']!}/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( - '${dotenv.env['SERVER_ROOT']!}/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 = '${dotenv.env['SERVER_ROOT']!}/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 = '${dotenv.env['SERVER_ROOT']!}/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 = '${dotenv.env['SERVER_ROOT']!}/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 = '${dotenv.env['SERVER_ROOT']!}/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( - '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/sendToModeration', - ); - final Uri serverURL = Uri.parse('${dotenv.env['SERVER_ROOT']!}'); - 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 = dotenv.env['SERVER_ROOT']! + '/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 dfea7c25..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,6 +1,6 @@ // ignore_for_file: unused_local_variable -import 'bloc/diary_edit_bloc.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'; @@ -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 d403e452..00000000 --- a/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.freezed.dart +++ /dev/null @@ -1,235 +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 5dec0301..00000000 --- a/lib/presentation/feed/blog_post_create_screen/models/blog_post_create_credentials_model.g.dart +++ /dev/null @@ -1,25 +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 => []; -} diff --git a/test/diary_test.dart b/test/diary_test.dart index 56d1c582..d5063476 100644 --- a/test/diary_test.dart +++ b/test/diary_test.dart @@ -1,8 +1,8 @@ -import 'package:flutter/material.dart'; +/*import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:eatvio_app/presentation/diary/diary_edit_screen/diary_edit_screen.dart'; -import 'package:eatvio_app/presentation/diary/diary_edit_screen/bloc/diary_edit_bloc.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_bloc.dart'; import 'package:eatvio_app/presentation/diary/diary_edit_screen/models/diary_edit_model.dart'; void main() { @@ -69,3 +69,4 @@ void main() { // Add more tests for other scenarios if needed }); } +*/ \ No newline at end of file From 551debd4502da71dfc75934426d13ee112f14936 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Fri, 12 Jul 2024 13:16:01 +0300 Subject: [PATCH 04/19] refactor(diary): API connect attempt --- lib/features/diary/models/diary,dart | 19 ++ lib/features/diary/models/diary_model.dart | 126 +------- .../diary/models/diary_model.freezed.dart | 157 +++++----- lib/features/diary/models/diary_model.g.dart | 20 +- lib/features/diary/models/meal.dart | 21 ++ lib/features/diary/models/meal.freezed.dart | 291 ++++++++++++++++++ lib/features/diary/models/meal.g.dart | 32 ++ lib/features/diary/models/photo.dart | 16 + lib/features/diary/models/photo.freezed.dart | 204 ++++++++++++ lib/features/diary/models/photo.g.dart | 22 ++ lib/features/diary/models/portion.dart | 17 + .../diary/models/portion.freezed.dart | 206 +++++++++++++ lib/features/diary/models/portion.g.dart | 23 ++ .../diary/presentation/bloc/diary_bloc.dart | 12 +- .../diary/presentation/bloc/diary_state.dart | 3 + .../bloc/diary_state.freezed.dart | 13 + .../presentation/pages/diary_screen.dart | 11 +- .../diary/repositories/diary_repository.dart | 2 +- .../diary/services/diary_service.dart | 2 +- .../diary/services/diary_service.g.dart | 29 +- test/diary_test.dart | 72 ----- 21 files changed, 999 insertions(+), 299 deletions(-) create mode 100644 lib/features/diary/models/diary,dart create mode 100644 lib/features/diary/models/meal.dart create mode 100644 lib/features/diary/models/meal.freezed.dart create mode 100644 lib/features/diary/models/meal.g.dart create mode 100644 lib/features/diary/models/photo.dart create mode 100644 lib/features/diary/models/photo.freezed.dart create mode 100644 lib/features/diary/models/photo.g.dart create mode 100644 lib/features/diary/models/portion.dart create mode 100644 lib/features/diary/models/portion.freezed.dart create mode 100644 lib/features/diary/models/portion.g.dart delete mode 100644 test/diary_test.dart diff --git a/lib/features/diary/models/diary,dart b/lib/features/diary/models/diary,dart new file mode 100644 index 00000000..f7c59357 --- /dev/null +++ b/lib/features/diary/models/diary,dart @@ -0,0 +1,19 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'diary.freezed.dart'; +part 'diary.g.dart'; + +@freezed +class Diary with _$Diary { + const factory Diary({ + required int id, + required DateTime date, + required int closed, + String? comment, + DateTime? wakeup, + DateTime? retire, + }) = _Diary; + + factory Diary.fromJson(Map json) => + _$DiaryFromJson(json); +} diff --git a/lib/features/diary/models/diary_model.dart b/lib/features/diary/models/diary_model.dart index fe7d6a24..079d483f 100644 --- a/lib/features/diary/models/diary_model.dart +++ b/lib/features/diary/models/diary_model.dart @@ -1,127 +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 Meal { - late int id; - late String time; - late int type; - late int satiety; - late int mood; - List? portions; - List? photos; - - Meal( - {required this.id, - required this.time, - required this.type, - required this.satiety, - required this.mood, - this.portions, - this.photos}); - - Meal.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 Portion.fromJson(v)); - }); - } - if (json['photos'] != null) { - json['photos'].forEach((v) { - photos.add(new Photo.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 Portion { - late int id; - late String productName; - late int quantity; - late String portion; - - Portion( - {required this.id, - required this.productName, - required this.quantity, - required this.portion}); - - Portion.fromJson(v); - - 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 Photo { - late int id; - late String originalName; - late String path; - late int size; - - Photo( - {required this.id, - required this.originalName, - required this.path, - required this.size}); - - Photo.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; - } -} diff --git a/lib/features/diary/models/diary_model.freezed.dart b/lib/features/diary/models/diary_model.freezed.dart index 6705ecfe..2c612ec8 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? meals = freezed, + 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 + meals: freezed == 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? meals = freezed, + 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 + meals: freezed == 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,27 @@ 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 { + final value = _meals; + if (value == null) return null; if (_meals is EqualUnmodifiableListView) return _meals; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_meals); + return EqualUnmodifiableListView(value); } + @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 +225,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 +255,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 +269,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 9fabca81..fc9f7d0e 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) => Meal.fromJson(e as Map)) + meals: (json['meals'] as List?) + ?.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..f057ec50 --- /dev/null +++ b/lib/features/diary/models/photo.dart @@ -0,0 +1,16 @@ +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 originalName, + required String path, + required int size, + }) = _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..6b4520b8 --- /dev/null +++ b/lib/features/diary/models/photo.freezed.dart @@ -0,0 +1,204 @@ +// 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 originalName => throw _privateConstructorUsedError; + String get path => throw _privateConstructorUsedError; + int get size => 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 originalName, String path, int size}); +} + +/// @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? originalName = null, + Object? path = null, + Object? size = null, + }) { + return _then(_value.copyWith( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + originalName: null == originalName + ? _value.originalName + : originalName // ignore: cast_nullable_to_non_nullable + as String, + path: null == path + ? _value.path + : path // ignore: cast_nullable_to_non_nullable + as String, + size: null == size + ? _value.size + : size // ignore: cast_nullable_to_non_nullable + as int, + ) 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 originalName, String path, int size}); +} + +/// @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? originalName = null, + Object? path = null, + Object? size = null, + }) { + return _then(_$PhotoImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + originalName: null == originalName + ? _value.originalName + : originalName // ignore: cast_nullable_to_non_nullable + as String, + path: null == path + ? _value.path + : path // ignore: cast_nullable_to_non_nullable + as String, + size: null == size + ? _value.size + : size // ignore: cast_nullable_to_non_nullable + as int, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PhotoImpl implements _Photo { + const _$PhotoImpl( + {required this.id, + required this.originalName, + required this.path, + required this.size}); + + factory _$PhotoImpl.fromJson(Map json) => + _$$PhotoImplFromJson(json); + + @override + final int id; + @override + final String originalName; + @override + final String path; + @override + final int size; + + @override + String toString() { + return 'Photo(id: $id, originalName: $originalName, path: $path, size: $size)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PhotoImpl && + (identical(other.id, id) || other.id == id) && + (identical(other.originalName, originalName) || + other.originalName == originalName) && + (identical(other.path, path) || other.path == path) && + (identical(other.size, size) || other.size == size)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, id, originalName, path, size); + + @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 originalName, + required final String path, + required final int size}) = _$PhotoImpl; + + factory _Photo.fromJson(Map json) = _$PhotoImpl.fromJson; + + @override + int get id; + @override + String get originalName; + @override + String get path; + @override + int get size; + @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..9b212a83 --- /dev/null +++ b/lib/features/diary/models/photo.g.dart @@ -0,0 +1,22 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'photo.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$PhotoImpl _$$PhotoImplFromJson(Map json) => _$PhotoImpl( + id: (json['id'] as num).toInt(), + originalName: json['originalName'] as String, + path: json['path'] as String, + size: (json['size'] as num).toInt(), + ); + +Map _$$PhotoImplToJson(_$PhotoImpl instance) => + { + 'id': instance.id, + 'originalName': instance.originalName, + 'path': instance.path, + 'size': instance.size, + }; diff --git a/lib/features/diary/models/portion.dart b/lib/features/diary/models/portion.dart new file mode 100644 index 00000000..9712d9b3 --- /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 productName, + 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..ab792133 --- /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 productName => 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 productName, 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? productName = 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, + productName: null == productName + ? _value.productName + : productName // 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 productName, 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? productName = null, + Object? quantity = null, + Object? portion = null, + }) { + return _then(_$PortionImpl( + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int, + productName: null == productName + ? _value.productName + : productName // 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.productName, + required this.quantity, + required this.portion}); + + factory _$PortionImpl.fromJson(Map json) => + _$$PortionImplFromJson(json); + + @override + final int id; + @override + final String productName; + @override + final int quantity; + @override + final String portion; + + @override + String toString() { + return 'Portion(id: $id, productName: $productName, 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.productName, productName) || + other.productName == productName) && + (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, productName, 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 productName, + required final int quantity, + required final String portion}) = _$PortionImpl; + + factory _Portion.fromJson(Map json) = _$PortionImpl.fromJson; + + @override + int get id; + @override + String get productName; + @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..aae21620 --- /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(), + productName: json['productName'] as String, + quantity: (json['quantity'] as num).toInt(), + portion: json['portion'] as String, + ); + +Map _$$PortionImplToJson(_$PortionImpl instance) => + { + 'id': instance.id, + 'productName': instance.productName, + 'quantity': instance.quantity, + 'portion': instance.portion, + }; diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index efc7b268..f2d0b7f6 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -1,5 +1,5 @@ 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/repositories/diary_repository.dart'; import 'package:intl/intl.dart'; import 'package:equatable/equatable.dart'; @@ -53,10 +53,10 @@ class DiaryBloc extends Bloc { ) async { emit(const DiaryState.loading()); try { - final diary = - await diaryRepository.getDiary(await diaryRepository.getDiaryID()); + Map data = await diaryRepository.getDiaryID(); + final int? diaryID = data['id']; emit(DiaryState.loaded( - diary: diary, + diary: await diaryRepository.getDiary(diaryID ?? 45), commentController: TextEditingController(), productNameController: TextEditingController(), productQuantityController: TextEditingController(), @@ -359,8 +359,8 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - Meal? meal = - currentState.diary.meals.firstWhere((meal) => meal.id == event.value); + Meal? meal = currentState.diary.meals! + .firstWhere((meal) => meal.id == event.value); DiaryStateLoaded updatedState = currentState.copyWith( currentMeal: event.value, diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index d1c2c602..b9f26953 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -1,4 +1,7 @@ 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:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index d5d614a5..8a5aba44 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -592,6 +592,7 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { bool isAdded}); $DiaryModelCopyWith<$Res> get diary; + $MealCopyWith<$Res>? get currentMeal; } /// @nodoc @@ -747,6 +748,18 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> return _then(_value.copyWith(diary: value)); }); } + + @override + @pragma('vm:prefer-inline') + $MealCopyWith<$Res>? get currentMeal { + if (_value.currentMeal == null) { + return null; + } + + return $MealCopyWith<$Res>(_value.currentMeal!, (value) { + return _then(_value.copyWith(currentMeal: value)); + }); + } } /// @nodoc diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index da609814..7f46d092 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -1,6 +1,9 @@ // ignore_for_file: unused_local_variable 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/presentation/bloc/diary_bloc.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; import 'package:eatvio_app/locator_service.dart'; @@ -674,12 +677,12 @@ class DiaryScreen extends StatelessWidget { } _buildCarousel(BuildContext context, DiaryStateLoaded state) { - if (state.currentMeal!.photos!.isEmpty) { + if (state.currentMeal!.photos.isEmpty) { return Text("Фото нет"); } else { return CarouselSlider( options: CarouselOptions(height: 340.0), - items: state.currentMeal!.photos!.map((photo) { + items: state.currentMeal!.photos.map((photo) { return _buildPhoto( context, photo); // Assuming photos are stored as strings }).toList(), @@ -1311,8 +1314,8 @@ bool checkConsumedValues( return false; // Возвращаем true } -List mealsToDropdown(List meals) { - return meals +List mealsToDropdown(List? meals) { + return meals! .map((meal) => SelectionPopupModel( id: meal.id, title: "Прием пищи ${meal.id}", diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 440f4195..2cadfd8d 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -6,7 +6,7 @@ class DiaryRepository { DiaryRepository({required this.diaryService}); - Future getDiaryID() async { + Future> getDiaryID() async { try { return await diaryService.getDiaryID(); } catch (e) { diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index dd27f0ba..967c2af3 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -10,7 +10,7 @@ abstract class DiaryService { factory DiaryService(Dio dio, {String baseUrl}) = _DiaryService; @GET('/diary/index') - Future getDiaryID(); + Future> getDiaryID(); @GET('/diary/{id}/show/') Future getDiary(@Path() int id); diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index 294e4e3d..62ca8f67 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -19,28 +19,29 @@ class _DiaryService implements DiaryService { String? baseUrl; @override - Future getDiaryID() async { + Future> getDiaryID() async { final _extra = {}; final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch(_setStreamType(Options( + 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!; + .compose( + _dio.options, + '/diary/index', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data!.cast(); return _value; } diff --git a/test/diary_test.dart b/test/diary_test.dart deleted file mode 100644 index d5063476..00000000 --- a/test/diary_test.dart +++ /dev/null @@ -1,72 +0,0 @@ -/*import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:eatvio_app/presentation/diary/diary_edit_screen/diary_edit_screen.dart'; -import 'package:eatvio_app/features/diary/presentation/bloc/diary_bloc.dart'; -import 'package:eatvio_app/presentation/diary/diary_edit_screen/models/diary_edit_model.dart'; - -void main() { - group('DiaryEditScreen', () { - /*testWidgets('renders CircularProgressIndicator when in initial state', - (WidgetTester tester) async { - await tester.pumpWidget( - MaterialApp( - home: DiaryEditScreen(), - ), - ); - });*/ - - testWidgets('renders _buildDiaryEditScreen when in loaded state', (WidgetTester tester) async { - final diaryEditBloc = DiaryEditBloc(DiaryEditState(diaryEditModelObj: DiaryEditModel())); - final loadedState = DiaryEditLoadedState( - diaryId: 1, - selectedSatiety: 4, - autocompleteList: [], - photos: [], - portions: [], - wakeupExpanded: false, - moderationExpanded: false, - recommendedChartValues: [10, 10, 10, 10], - consumedChartValues: [1, 2, 3, 4], - moodExpanded: false,); - - await tester.pumpWidget( - MaterialApp( - home: BlocProvider.value( - value: diaryEditBloc, - child: DiaryEditScreen(), - ), - ), - ); - - diaryEditBloc.emit(loadedState); - await tester.pump(); - - //expect(find.byType(_buildDiaryEditScreen), findsOneWidget); - }); - - /*testWidgets('renders error message when in error state', - (WidgetTester tester) async { - final diaryEditBloc = - DiaryEditBloc(DiaryEditState(diaryEditModelObj: DiaryEditModel())); - final errorState = DiaryEditErrorState("error"); - - await tester.pumpWidget( - MaterialApp( - home: BlocProvider.value( - value: diaryEditBloc, - child: DiaryEditScreen(), - ), - ), - ); - - diaryEditBloc.emit(errorState); - await tester.pump(); - - expect(find.text('Ошибка'), findsOneWidget); - });*/ - - // Add more tests for other scenarios if needed - }); -} -*/ \ No newline at end of file From ed74fd99f087142620b778a37a083cacb1613c8a Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Fri, 12 Jul 2024 14:33:18 +0300 Subject: [PATCH 05/19] refactor(diary): fix service --- .../presentation/pages/diary_screen.dart | 58 +++++++++---------- .../diary/repositories/diary_repository.dart | 2 +- .../diary/services/diary_service.dart | 2 +- .../diary/services/diary_service.g.dart | 9 +-- lib/main.dart | 23 ++------ 5 files changed, 40 insertions(+), 54 deletions(-) diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 7f46d092..be3a7b44 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -6,7 +6,6 @@ import 'package:eatvio_app/features/diary/models/photo.dart'; import 'package:eatvio_app/features/diary/models/portion.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/locator_service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -26,38 +25,35 @@ import 'package:carousel_slider/carousel_slider.dart'; class DiaryScreen extends StatelessWidget { DiaryScreen({Key? key}) : super(key: key); Widget build(BuildContext context) { - return BlocProvider( - create: (context) => sl()..add(LoadDiary()), - child: BlocBuilder( - builder: (context, state) { - if (state is DiaryStateLoaded) { - return _buildDiary(context, state); - } else if (state is DiaryStateLoading) { - return Scaffold( - body: Center( - child: CupertinoActivityIndicator(), + return BlocBuilder( + builder: (context, state) { + 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 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 - return Scaffold( - body: Padding( - padding: const EdgeInsets.all(16), - child: Center( - child: Text("Неопределенная ошибка"), - ), - ), - ); - }, - ), + ), + ); + }, ); } diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 2cadfd8d..25903f14 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -16,7 +16,7 @@ class DiaryRepository { Future getDiary(int diaryID) async { try { - return await diaryService.getDiary(diaryID); + return (await diaryService.getDiary(diaryID))['diary']!; } catch (e) { rethrow; } diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index 967c2af3..e047b5e6 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -13,7 +13,7 @@ abstract class DiaryService { Future> getDiaryID(); @GET('/diary/{id}/show/') - Future getDiary(@Path() int id); + Future> getDiary(@Path() int id); @GET('/diary/{id}/dailyNutritionData/') Future getChart(@Path() String id); diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index 62ca8f67..3ea7bd1b 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -46,13 +46,13 @@ class _DiaryService implements DiaryService { } @override - Future getDiary(int id) async { + Future> getDiary(int id) async { final _extra = {}; final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio - .fetch>(_setStreamType(Options( + final _result = await _dio.fetch>( + _setStreamType>(Options( method: 'GET', headers: _headers, extra: _extra, @@ -68,7 +68,8 @@ class _DiaryService implements DiaryService { _dio.options.baseUrl, baseUrl, )))); - final _value = DiaryModel.fromJson(_result.data!); + var _value = _result.data!.map((k, dynamic v) => + MapEntry(k, DiaryModel.fromJson(v as Map))); return _value; } diff --git a/lib/main.dart b/lib/main.dart index bd7e66cc..f71b4a54 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -41,24 +41,13 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider( - create: (context) => InitializationCubit(chatRepository: sl())), - 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) => sl()..add(LoadDiary()), - ), + BlocProvider(create: (context) => InitializationCubit(chatRepository: sl())), + 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) => sl()..add(LoadDiary())), BlocProvider( - create: (context) => ChatSelectBloc( - ChatSelectState(chatSelectModelObj: ChatSelectModel())) - ..add(ChatSelectInitialEvent()), + create: (context) => ChatSelectBloc(ChatSelectState(chatSelectModelObj: ChatSelectModel()))..add(ChatSelectInitialEvent()), ), ], child: BlocListener( From f3a0df20b779dee428f5848f3f6a47cc87ec2b08 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Fri, 12 Jul 2024 16:49:50 +0300 Subject: [PATCH 06/19] refactor(diary): Fix --- lib/features/diary/models/diary_model.dart | 2 +- .../diary/models/diary_model.freezed.dart | 32 ++- lib/features/diary/models/diary_model.g.dart | 4 +- .../diary/presentation/bloc/diary_bloc.dart | 33 +-- .../diary/presentation/bloc/diary_state.dart | 22 +- .../bloc/diary_state.freezed.dart | 212 +++++++++--------- .../presentation/pages/diary_screen.dart | 13 +- 7 files changed, 155 insertions(+), 163 deletions(-) diff --git a/lib/features/diary/models/diary_model.dart b/lib/features/diary/models/diary_model.dart index 079d483f..3a899363 100644 --- a/lib/features/diary/models/diary_model.dart +++ b/lib/features/diary/models/diary_model.dart @@ -10,7 +10,7 @@ class DiaryModel with _$DiaryModel { required int id, required DateTime date, required int closed, - required List? meals, + required List meals, String? comment, DateTime? wakeup, DateTime? retire, diff --git a/lib/features/diary/models/diary_model.freezed.dart b/lib/features/diary/models/diary_model.freezed.dart index 2c612ec8..3fe59e15 100644 --- a/lib/features/diary/models/diary_model.freezed.dart +++ b/lib/features/diary/models/diary_model.freezed.dart @@ -23,7 +23,7 @@ mixin _$DiaryModel { int get id => throw _privateConstructorUsedError; DateTime get date => throw _privateConstructorUsedError; int get closed => 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; @@ -44,7 +44,7 @@ abstract class $DiaryModelCopyWith<$Res> { {int id, DateTime date, int closed, - List? meals, + List meals, String? comment, DateTime? wakeup, DateTime? retire}); @@ -66,7 +66,7 @@ class _$DiaryModelCopyWithImpl<$Res, $Val extends DiaryModel> Object? id = null, Object? date = null, Object? closed = null, - Object? meals = freezed, + Object? meals = null, Object? comment = freezed, Object? wakeup = freezed, Object? retire = freezed, @@ -84,10 +84,10 @@ class _$DiaryModelCopyWithImpl<$Res, $Val extends DiaryModel> ? _value.closed : closed // ignore: cast_nullable_to_non_nullable as int, - meals: freezed == meals + 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 @@ -116,7 +116,7 @@ abstract class _$$DiaryModelImplCopyWith<$Res> {int id, DateTime date, int closed, - List? meals, + List meals, String? comment, DateTime? wakeup, DateTime? retire}); @@ -136,7 +136,7 @@ class __$$DiaryModelImplCopyWithImpl<$Res> Object? id = null, Object? date = null, Object? closed = null, - Object? meals = freezed, + Object? meals = null, Object? comment = freezed, Object? wakeup = freezed, Object? retire = freezed, @@ -154,10 +154,10 @@ class __$$DiaryModelImplCopyWithImpl<$Res> ? _value.closed : closed // ignore: cast_nullable_to_non_nullable as int, - meals: freezed == meals + 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 @@ -181,7 +181,7 @@ class _$DiaryModelImpl implements _DiaryModel { {required this.id, required this.date, required this.closed, - required final List? meals, + required final List meals, this.comment, this.wakeup, this.retire}) @@ -196,14 +196,12 @@ class _$DiaryModelImpl implements _DiaryModel { final DateTime date; @override final int closed; - final List? _meals; + final List _meals; @override - List? get meals { - final value = _meals; - if (value == null) return null; + List get meals { if (_meals is EqualUnmodifiableListView) return _meals; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); + return EqualUnmodifiableListView(_meals); } @override @@ -256,7 +254,7 @@ abstract class _DiaryModel implements DiaryModel { {required final int id, required final DateTime date, required final int closed, - required final List? meals, + required final List meals, final String? comment, final DateTime? wakeup, final DateTime? retire}) = _$DiaryModelImpl; @@ -271,7 +269,7 @@ abstract class _DiaryModel implements DiaryModel { @override int get closed; @override - List? get meals; + List get meals; @override String? get comment; @override diff --git a/lib/features/diary/models/diary_model.g.dart b/lib/features/diary/models/diary_model.g.dart index fc9f7d0e..1a13c7d5 100644 --- a/lib/features/diary/models/diary_model.g.dart +++ b/lib/features/diary/models/diary_model.g.dart @@ -11,8 +11,8 @@ _$DiaryModelImpl _$$DiaryModelImplFromJson(Map json) => id: (json['id'] as num).toInt(), date: DateTime.parse(json['date'] as String), closed: (json['closed'] as num).toInt(), - meals: (json['meals'] as List?) - ?.map((e) => Meal.fromJson(e as Map)) + meals: (json['meals'] as List) + .map((e) => Meal.fromJson(e as Map)) .toList(), comment: json['comment'] as String?, wakeup: json['wakeup'] == null diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index f2d0b7f6..9cc1b778 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -1,4 +1,5 @@ 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/repositories/diary_repository.dart'; import 'package:intl/intl.dart'; @@ -55,8 +56,13 @@ class DiaryBloc extends Bloc { 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]; emit(DiaryState.loaded( - diary: await diaryRepository.getDiary(diaryID ?? 45), + diary: diary, + currentMeal: currentMeal, + portions: currentMeal.portions, + photos: currentMeal.photos, commentController: TextEditingController(), productNameController: TextEditingController(), productQuantityController: TextEditingController(), @@ -69,8 +75,9 @@ class DiaryBloc extends Bloc { moodExpanded: false, isLoading: false, isAdded: false, - recommendedChartValues: [0, 0, 0, 0], - consumedChartValues: [0, 0, 0, 0])); + autocompleteList: [], + recommendedChartValues: [1, 1, 1, 1], + consumedChartValues: [1, 1, 1, 1])); } catch (e) { emit(DiaryState.error(errorMessage: e.toString())); print(e); @@ -143,13 +150,13 @@ class DiaryBloc extends Bloc { // Отправляем данные по HTTP маршруту и ждем ответ var response = await sendSatietyData( event.selectedElement, - currentState.currentMeal?.id, + currentState.currentMeal.id, currentState.diary.id, ); if (response.statusCode == 200) { print( - 'Satiety change success! meal_id: ${currentState.currentMeal?.id}, mood: ${event.selectedElement}', + 'Satiety change success! meal_id: ${currentState.currentMeal.id}, mood: ${event.selectedElement}', ); emit(updatedState); // Передаем обновленное состояние в emit } @@ -189,13 +196,13 @@ class DiaryBloc extends Bloc { // Отправляем данные по HTTP маршруту и ждем ответ var response = await sendMoodData( event.selectedElement, - currentState.currentMeal?.id, + currentState.currentMeal.id, currentState.diary.id, ); if (response.statusCode == 200) { print( - 'Mood change success! meal_id: ${currentState.currentMeal?.id}, mood: ${event.selectedElement}', + 'Mood change success! meal_id: ${currentState.currentMeal.id}, mood: ${event.selectedElement}', ); emit(updatedState); // Передаем обновленное состояние в emit } @@ -359,8 +366,8 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - Meal? meal = currentState.diary.meals! - .firstWhere((meal) => meal.id == event.value); + Meal? meal = + currentState.diary.meals.firstWhere((meal) => meal.id == event.value); DiaryStateLoaded updatedState = currentState.copyWith( currentMeal: event.value, @@ -431,7 +438,7 @@ class DiaryBloc extends Bloc { currentState.productNameController?.text, currentState.portionController?.id == 0 ? 'pcs' : 'gr', int.parse(currentState.productQuantityController!.text), - currentState.currentMeal!.id, + currentState.currentMeal.id, currentState.diary.id, ); @@ -523,7 +530,7 @@ class DiaryBloc extends Bloc { var currentState = state as DiaryStateLoaded; int? mealId = - currentState.currentMeal?.id; // Rename id to mealId for clarity + currentState.currentMeal.id; // Rename id to mealId for clarity var response = await sendRemovePortion( event.portionId, @@ -570,7 +577,7 @@ class DiaryBloc extends Bloc { var response = await sendRemovePhoto( event.path, event.photoID, - currentState.currentMeal?.id, + currentState.currentMeal.id, currentState.diary.id, ); print(response.statusCode); @@ -668,7 +675,7 @@ class DiaryBloc extends Bloc { await uploadImageToServer( event.image.path, currentState.diary.id, - currentState.currentMeal!.id, + currentState.currentMeal.id, ); await reloadScreen(event, emit); } diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index b9f26953..4f324479 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -18,23 +18,23 @@ abstract class DiaryState with _$DiaryState { const factory DiaryState.loaded({ required DiaryModel diary, String? diaryDate, - List? autocompleteList, + required List autocompleteList, required List recommendedChartValues, required List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + required List portions, + required List photos, + required Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - required TextEditingController? commentController, - required TextEditingController? productNameController, - required TextEditingController? productQuantityController, - required TextEditingController? caloriesController, - required TextEditingController? fatsController, - required TextEditingController? proteinsController, - required TextEditingController? carbsController, + required TextEditingController commentController, + required TextEditingController productNameController, + required TextEditingController productQuantityController, + required TextEditingController caloriesController, + required TextEditingController fatsController, + required TextEditingController proteinsController, + required TextEditingController carbsController, int? selectedMood, int? selectedSatiety, required bool wakeupExpanded, diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 8a5aba44..6a06e2e4 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -23,12 +23,12 @@ mixin _$DiaryState { required TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -58,12 +58,12 @@ mixin _$DiaryState { TResult? Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -93,12 +93,12 @@ mixin _$DiaryState { TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -210,12 +210,12 @@ class _$DiaryStateImpl implements _DiaryState { required TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -248,12 +248,12 @@ class _$DiaryStateImpl implements _DiaryState { TResult? Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -286,12 +286,12 @@ class _$DiaryStateImpl implements _DiaryState { TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -405,12 +405,12 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { required TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -443,12 +443,12 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult? Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -481,12 +481,12 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -566,12 +566,12 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { $Res call( {DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -592,7 +592,7 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { bool isAdded}); $DiaryModelCopyWith<$Res> get diary; - $MealCopyWith<$Res>? get currentMeal; + $MealCopyWith<$Res> get currentMeal; } /// @nodoc @@ -608,12 +608,12 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> $Res call({ Object? diary = null, Object? diaryDate = freezed, - Object? autocompleteList = freezed, + Object? autocompleteList = null, Object? recommendedChartValues = null, Object? consumedChartValues = null, - Object? portions = freezed, - Object? photos = freezed, - Object? currentMeal = freezed, + Object? portions = null, + Object? photos = null, + Object? currentMeal = null, Object? portionController = freezed, Object? wakeupController = freezed, Object? retireController = freezed, @@ -642,10 +642,10 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value.diaryDate : diaryDate // ignore: cast_nullable_to_non_nullable as String?, - autocompleteList: freezed == autocompleteList + autocompleteList: null == autocompleteList ? _value._autocompleteList : autocompleteList // ignore: cast_nullable_to_non_nullable - as List?, + as List, recommendedChartValues: null == recommendedChartValues ? _value._recommendedChartValues : recommendedChartValues // ignore: cast_nullable_to_non_nullable @@ -654,18 +654,18 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value._consumedChartValues : consumedChartValues // ignore: cast_nullable_to_non_nullable as List, - portions: freezed == portions + portions: null == portions ? _value._portions : portions // ignore: cast_nullable_to_non_nullable - as List?, - photos: freezed == photos + as List, + photos: null == photos ? _value._photos : photos // ignore: cast_nullable_to_non_nullable - as List?, - currentMeal: freezed == currentMeal + as List, + currentMeal: null == currentMeal ? _value.currentMeal : currentMeal // ignore: cast_nullable_to_non_nullable - as Meal?, + as Meal, portionController: freezed == portionController ? _value.portionController : portionController // ignore: cast_nullable_to_non_nullable @@ -751,12 +751,8 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> @override @pragma('vm:prefer-inline') - $MealCopyWith<$Res>? get currentMeal { - if (_value.currentMeal == null) { - return null; - } - - return $MealCopyWith<$Res>(_value.currentMeal!, (value) { + $MealCopyWith<$Res> get currentMeal { + return $MealCopyWith<$Res>(_value.currentMeal, (value) { return _then(_value.copyWith(currentMeal: value)); }); } @@ -768,12 +764,12 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { const _$DiaryStateLoadedImpl( {required this.diary, this.diaryDate, - final List? autocompleteList, + required final List autocompleteList, required final List recommendedChartValues, required final List consumedChartValues, - final List? portions, - final List? photos, - this.currentMeal, + required final List portions, + required final List photos, + required this.currentMeal, this.portionController, this.wakeupController, this.retireController, @@ -802,15 +798,13 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { final DiaryModel diary; @override final String? diaryDate; - final List? _autocompleteList; + final List _autocompleteList; @override - List? get autocompleteList { - final value = _autocompleteList; - if (value == null) return null; + List get autocompleteList { if (_autocompleteList is EqualUnmodifiableListView) return _autocompleteList; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); + return EqualUnmodifiableListView(_autocompleteList); } final List _recommendedChartValues; @@ -831,28 +825,24 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return EqualUnmodifiableListView(_consumedChartValues); } - final List? _portions; + final List _portions; @override - List? get portions { - final value = _portions; - if (value == null) return null; + List get portions { if (_portions is EqualUnmodifiableListView) return _portions; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); + return EqualUnmodifiableListView(_portions); } - final List? _photos; + final List _photos; @override - List? get photos { - final value = _photos; - if (value == null) return null; + List get photos { if (_photos is EqualUnmodifiableListView) return _photos; // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(value); + return EqualUnmodifiableListView(_photos); } @override - final Meal? currentMeal; + final Meal currentMeal; @override final SelectionPopupModel? portionController; @override @@ -997,12 +987,12 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -1061,12 +1051,12 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult? Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -1125,12 +1115,12 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -1227,12 +1217,12 @@ abstract class DiaryStateLoaded implements DiaryState { const factory DiaryStateLoaded( {required final DiaryModel diary, final String? diaryDate, - final List? autocompleteList, + required final List autocompleteList, required final List recommendedChartValues, required final List consumedChartValues, - final List? portions, - final List? photos, - final Meal? currentMeal, + required final List portions, + required final List photos, + required final Meal currentMeal, final SelectionPopupModel? portionController, final TimeOfDay? wakeupController, final TimeOfDay? retireController, @@ -1254,12 +1244,12 @@ abstract class DiaryStateLoaded implements DiaryState { DiaryModel get diary; String? get diaryDate; - List? get autocompleteList; + List get autocompleteList; List get recommendedChartValues; List get consumedChartValues; - List? get portions; - List? get photos; - Meal? get currentMeal; + List get portions; + List get photos; + Meal get currentMeal; SelectionPopupModel? get portionController; TimeOfDay? get wakeupController; TimeOfDay? get retireController; @@ -1354,12 +1344,12 @@ class _$DiaryStateErrorImpl implements DiaryStateError { required TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -1392,12 +1382,12 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult? Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, @@ -1430,12 +1420,12 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult Function( DiaryModel diary, String? diaryDate, - List? autocompleteList, + List autocompleteList, List recommendedChartValues, List consumedChartValues, - List? portions, - List? photos, - Meal? currentMeal, + List portions, + List photos, + Meal currentMeal, SelectionPopupModel? portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index be3a7b44..af39f0b1 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -274,8 +274,7 @@ class DiaryScreen extends StatelessWidget { _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((dynamic item) => item as String).toList(); FocusNode focusNodeName = FocusNode(); return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -350,7 +349,6 @@ class DiaryScreen extends StatelessWidget { horizontal: 10.h, vertical: 9.v, ), - defaultValue: mealsToDropdown(diary.meals)[0], onChanged: changeMeal(context, state), ); }, @@ -448,7 +446,6 @@ class DiaryScreen extends StatelessWidget { SelectionPopupModel(title: "gr"), SelectionPopupModel(title: "pcs") ], - defaultValue: SelectionPopupModel(title: "gr"), onChanged: changePortion(context, state), ); }, @@ -461,7 +458,7 @@ class DiaryScreen 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), @@ -673,12 +670,12 @@ class DiaryScreen extends StatelessWidget { } _buildCarousel(BuildContext context, DiaryStateLoaded state) { - if (state.currentMeal!.photos.isEmpty) { + if (state.currentMeal.photos.isEmpty) { return Text("Фото нет"); } else { return CarouselSlider( options: CarouselOptions(height: 340.0), - items: state.currentMeal!.photos.map((photo) { + items: state.currentMeal.photos.map((photo) { return _buildPhoto( context, photo); // Assuming photos are stored as strings }).toList(), @@ -1314,7 +1311,7 @@ List mealsToDropdown(List? meals) { return meals! .map((meal) => SelectionPopupModel( id: meal.id, - title: "Прием пищи ${meal.id}", + title: "Прием пищи ${meal.type}", isSelected: false, )) .toList(); From b4993c827c64a0e477642e2b9cb570c6210c4817 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 15 Jul 2024 11:46:32 +0300 Subject: [PATCH 07/19] fix(diary): UI errors fix --- .../diary/presentation/bloc/diary_bloc.dart | 19 +- .../diary/presentation/bloc/diary_event.dart | 8 - .../diary/presentation/bloc/diary_state.dart | 7 +- .../bloc/diary_state.freezed.dart | 397 ++++++++++-------- .../presentation/pages/diary_screen.dart | 28 +- 5 files changed, 248 insertions(+), 211 deletions(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 9cc1b778..6bef4932 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -58,11 +58,19 @@ class DiaryBloc extends Bloc { final int? diaryID = data['id']; final DiaryModel diary = await diaryRepository.getDiary(diaryID ?? 45); final Meal currentMeal = diary.meals[0]; + List portions = [ + SelectionPopupModel(title: "gr"), + SelectionPopupModel(title: "pcs") + ]; emit(DiaryState.loaded( diary: diary, currentMeal: currentMeal, portions: currentMeal.portions, photos: currentMeal.photos, + portionList: portions, + portionController: portions[0], + selectedMood: 3, + selectedSatiety: 3, commentController: TextEditingController(), productNameController: TextEditingController(), productQuantityController: TextEditingController(), @@ -159,7 +167,8 @@ class DiaryBloc extends Bloc { 'Satiety change success! meal_id: ${currentState.currentMeal.id}, mood: ${event.selectedElement}', ); emit(updatedState); // Передаем обновленное состояние в emit - } + } else + print("dad"); } } @@ -435,9 +444,9 @@ class DiaryBloc extends Bloc { var currentState = state as DiaryStateLoaded; var response = await sendPortionData( - currentState.productNameController?.text, - currentState.portionController?.id == 0 ? 'pcs' : 'gr', - int.parse(currentState.productQuantityController!.text), + currentState.productNameController.text, + currentState.portionController.id == 0 ? 'pcs' : 'gr', + int.parse(currentState.productQuantityController.text), currentState.currentMeal.id, currentState.diary.id, ); @@ -623,7 +632,7 @@ class DiaryBloc extends Bloc { currentState.diary.id, currentState.wakeupController, currentState.retireController, - currentState.commentController?.text, + currentState.commentController.text, ); if (response.statusCode == 200) { diff --git a/lib/features/diary/presentation/bloc/diary_event.dart b/lib/features/diary/presentation/bloc/diary_event.dart index 6568873f..91445ffb 100644 --- a/lib/features/diary/presentation/bloc/diary_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -20,7 +20,6 @@ class ChangeSatiety extends DiaryEvent { this.selectedElement, ); final int selectedElement; - @override List get props => [selectedElement]; } @@ -30,7 +29,6 @@ class ChangeMood extends DiaryEvent { this.selectedElement, ); final int selectedElement; - @override List get props => [selectedElement]; } @@ -38,7 +36,6 @@ class ChangeMood extends DiaryEvent { class ChangeMealTime extends DiaryEvent { ChangeMealTime(this.time); final TimeOfDay time; - @override List get props => [time]; } @@ -47,7 +44,6 @@ class AddComment extends DiaryEvent { AddComment(this.diaryId, this.comment); final String comment; final int diaryId; - @override List get props => [comment, diaryId]; } @@ -115,7 +111,6 @@ class ProductInput extends DiaryEvent { class ChangeMeal extends DiaryEvent { ChangeMeal({required this.value, required this.meals}); - Meal value; List? meals; @override @@ -124,7 +119,6 @@ class ChangeMeal extends DiaryEvent { class ClearInput extends DiaryEvent { ClearInput({required this.value}); - TextEditingController value; @override List get props => [value]; @@ -132,7 +126,6 @@ class ClearInput extends DiaryEvent { class ChangePortion extends DiaryEvent { ChangePortion({required this.value}); - SelectionPopupModel value; @override List get props => [value]; @@ -140,7 +133,6 @@ class ChangePortion extends DiaryEvent { class FinishDay extends DiaryEvent { FinishDay(); - @override List get props => []; } diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index 4f324479..957dafc0 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -23,8 +23,9 @@ abstract class DiaryState with _$DiaryState { required List consumedChartValues, required List portions, required List photos, + required List portionList, required Meal currentMeal, - SelectionPopupModel? portionController, + required SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, @@ -35,8 +36,8 @@ abstract class DiaryState with _$DiaryState { required TextEditingController fatsController, required TextEditingController proteinsController, required TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + required int selectedMood, + required int selectedSatiety, required bool wakeupExpanded, required bool moderationExpanded, required bool moodExpanded, diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 6a06e2e4..5acd8d21 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -28,18 +28,19 @@ mixin _$DiaryState { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -63,18 +64,19 @@ mixin _$DiaryState { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -98,18 +100,19 @@ mixin _$DiaryState { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -215,18 +218,19 @@ class _$DiaryStateImpl implements _DiaryState { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -253,18 +257,19 @@ class _$DiaryStateImpl implements _DiaryState { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -291,18 +296,19 @@ class _$DiaryStateImpl implements _DiaryState { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -410,18 +416,19 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -448,18 +455,19 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -486,18 +494,19 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -571,18 +580,19 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -613,18 +623,19 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> Object? consumedChartValues = null, Object? portions = null, Object? photos = null, + Object? portionList = null, Object? currentMeal = null, - Object? portionController = freezed, + Object? portionController = null, Object? wakeupController = freezed, Object? retireController = freezed, Object? mealTimeController = freezed, - Object? commentController = freezed, - Object? productNameController = freezed, - Object? productQuantityController = freezed, - Object? caloriesController = freezed, - Object? fatsController = freezed, - Object? proteinsController = freezed, - Object? carbsController = freezed, + Object? commentController = null, + Object? productNameController = null, + Object? productQuantityController = null, + Object? caloriesController = null, + Object? fatsController = null, + Object? proteinsController = null, + Object? carbsController = null, Object? selectedMood = freezed, Object? selectedSatiety = freezed, Object? wakeupExpanded = null, @@ -662,14 +673,18 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value._photos : photos // ignore: cast_nullable_to_non_nullable as List, + portionList: null == portionList + ? _value._portionList + : portionList // ignore: cast_nullable_to_non_nullable + as List, currentMeal: null == currentMeal ? _value.currentMeal : currentMeal // ignore: cast_nullable_to_non_nullable as Meal, - portionController: freezed == portionController + portionController: null == portionController ? _value.portionController : portionController // ignore: cast_nullable_to_non_nullable - as SelectionPopupModel?, + as SelectionPopupModel, wakeupController: freezed == wakeupController ? _value.wakeupController : wakeupController // ignore: cast_nullable_to_non_nullable @@ -682,34 +697,34 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value.mealTimeController : mealTimeController // ignore: cast_nullable_to_non_nullable as TimeOfDay?, - commentController: freezed == commentController + commentController: null == commentController ? _value.commentController : commentController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, - productNameController: freezed == productNameController + as TextEditingController, + productNameController: null == productNameController ? _value.productNameController : productNameController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, - productQuantityController: freezed == productQuantityController + as TextEditingController, + productQuantityController: null == productQuantityController ? _value.productQuantityController : productQuantityController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, - caloriesController: freezed == caloriesController + as TextEditingController, + caloriesController: null == caloriesController ? _value.caloriesController : caloriesController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, - fatsController: freezed == fatsController + as TextEditingController, + fatsController: null == fatsController ? _value.fatsController : fatsController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, - proteinsController: freezed == proteinsController + as TextEditingController, + proteinsController: null == proteinsController ? _value.proteinsController : proteinsController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, - carbsController: freezed == carbsController + as TextEditingController, + carbsController: null == carbsController ? _value.carbsController : carbsController // ignore: cast_nullable_to_non_nullable - as TextEditingController?, + as TextEditingController, selectedMood: freezed == selectedMood ? _value.selectedMood : selectedMood // ignore: cast_nullable_to_non_nullable @@ -769,8 +784,9 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required final List consumedChartValues, required final List portions, required final List photos, + required final List portionList, required this.currentMeal, - this.portionController, + required this.portionController, this.wakeupController, this.retireController, this.mealTimeController, @@ -792,7 +808,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { _recommendedChartValues = recommendedChartValues, _consumedChartValues = consumedChartValues, _portions = portions, - _photos = photos; + _photos = photos, + _portionList = portionList; @override final DiaryModel diary; @@ -841,10 +858,18 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return EqualUnmodifiableListView(_photos); } + final List _portionList; + @override + List get portionList { + if (_portionList is EqualUnmodifiableListView) return _portionList; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_portionList); + } + @override final Meal currentMeal; @override - final SelectionPopupModel? portionController; + final SelectionPopupModel portionController; @override final TimeOfDay? wakeupController; @override @@ -852,19 +877,19 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override final TimeOfDay? mealTimeController; @override - final TextEditingController? commentController; + final TextEditingController commentController; @override - final TextEditingController? productNameController; + final TextEditingController productNameController; @override - final TextEditingController? productQuantityController; + final TextEditingController productQuantityController; @override - final TextEditingController? caloriesController; + final TextEditingController caloriesController; @override - final TextEditingController? fatsController; + final TextEditingController fatsController; @override - final TextEditingController? proteinsController; + final TextEditingController proteinsController; @override - final TextEditingController? carbsController; + final TextEditingController carbsController; @override final int? selectedMood; @override @@ -882,7 +907,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override String toString() { - return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, autocompleteList: $autocompleteList, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, productNameController: $productNameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded)'; + return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, autocompleteList: $autocompleteList, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, portionList: $portionList, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, productNameController: $productNameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded)'; } @override @@ -901,6 +926,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { .equals(other._consumedChartValues, _consumedChartValues) && const DeepCollectionEquality().equals(other._portions, _portions) && const DeepCollectionEquality().equals(other._photos, _photos) && + const DeepCollectionEquality() + .equals(other._portionList, _portionList) && (identical(other.currentMeal, currentMeal) || other.currentMeal == currentMeal) && (identical(other.portionController, portionController) || @@ -951,6 +978,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { const DeepCollectionEquality().hash(_consumedChartValues), const DeepCollectionEquality().hash(_portions), const DeepCollectionEquality().hash(_photos), + const DeepCollectionEquality().hash(_portionList), currentMeal, portionController, wakeupController, @@ -992,18 +1020,19 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -1022,6 +1051,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { consumedChartValues, portions, photos, + portionList, currentMeal, portionController, wakeupController, @@ -1056,18 +1086,19 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -1086,6 +1117,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { consumedChartValues, portions, photos, + portionList, currentMeal, portionController, wakeupController, @@ -1120,18 +1152,19 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -1152,6 +1185,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { consumedChartValues, portions, photos, + portionList, currentMeal, portionController, wakeupController, @@ -1222,18 +1256,19 @@ abstract class DiaryStateLoaded implements DiaryState { required final List consumedChartValues, required final List portions, required final List photos, + required final List portionList, required final Meal currentMeal, - final SelectionPopupModel? portionController, + required final SelectionPopupModel portionController, final TimeOfDay? wakeupController, final TimeOfDay? retireController, final TimeOfDay? mealTimeController, - required final TextEditingController? commentController, - required final TextEditingController? productNameController, - required final TextEditingController? productQuantityController, - required final TextEditingController? caloriesController, - required final TextEditingController? fatsController, - required final TextEditingController? proteinsController, - required final TextEditingController? carbsController, + required final TextEditingController commentController, + required final TextEditingController productNameController, + required final TextEditingController productQuantityController, + required final TextEditingController caloriesController, + required final TextEditingController fatsController, + required final TextEditingController proteinsController, + required final TextEditingController carbsController, final int? selectedMood, final int? selectedSatiety, required final bool wakeupExpanded, @@ -1249,18 +1284,19 @@ abstract class DiaryStateLoaded implements DiaryState { List get consumedChartValues; List get portions; List get photos; + List get portionList; Meal get currentMeal; - SelectionPopupModel? get portionController; + SelectionPopupModel get portionController; TimeOfDay? get wakeupController; TimeOfDay? get retireController; TimeOfDay? get mealTimeController; - TextEditingController? get commentController; - TextEditingController? get productNameController; - TextEditingController? get productQuantityController; - TextEditingController? get caloriesController; - TextEditingController? get fatsController; - TextEditingController? get proteinsController; - TextEditingController? get carbsController; + TextEditingController get commentController; + TextEditingController get productNameController; + TextEditingController get productQuantityController; + TextEditingController get caloriesController; + TextEditingController get fatsController; + TextEditingController get proteinsController; + TextEditingController get carbsController; int? get selectedMood; int? get selectedSatiety; bool get wakeupExpanded; @@ -1349,18 +1385,19 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -1387,18 +1424,19 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, @@ -1425,18 +1463,19 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List consumedChartValues, List portions, List photos, + List portionList, Meal currentMeal, - SelectionPopupModel? portionController, + SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, + TextEditingController commentController, + TextEditingController productNameController, + TextEditingController productQuantityController, + TextEditingController caloriesController, + TextEditingController fatsController, + TextEditingController proteinsController, + TextEditingController carbsController, int? selectedMood, int? selectedSatiety, bool wakeupExpanded, diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index af39f0b1..8dcdbb75 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -342,9 +342,10 @@ class DiaryScreen extends StatelessWidget { return null; }, builder: (context, diary) { + List meals = mealsToDropdown(diary!.meals); return CustomDropDown( - hintText: "Прием пищи", - items: mealsToDropdown(diary!.meals), + hintText: meals[0].title, + items: meals, contentPadding: EdgeInsets.symmetric( horizontal: 10.h, vertical: 9.v, @@ -442,10 +443,8 @@ class DiaryScreen extends StatelessWidget { }, builder: (context, diary) { return CustomDropDown( - items: [ - SelectionPopupModel(title: "gr"), - SelectionPopupModel(title: "pcs") - ], + items: state.portionList, + defaultValue: state.portionController, onChanged: changePortion(context, state), ); }, @@ -576,11 +575,11 @@ class DiaryScreen extends StatelessWidget { TextButton( onPressed: triggerModeration( context, - state.productNameController!.text, - state.caloriesController!.text, - state.proteinsController!.text, - state.fatsController!.text, - state.carbsController!.text, + state.productNameController.text, + state.caloriesController.text, + state.proteinsController.text, + state.fatsController.text, + state.carbsController.text, dialogContext, ), child: Text('Отправить'), @@ -630,7 +629,7 @@ class DiaryScreen extends StatelessWidget { selectProduct(AutocompleteOnSelected onSelected, String option, DiaryStateLoaded state) { - state.productNameController?.text = option; + state.productNameController.text = option; return () { onSelected(option); }; @@ -638,9 +637,6 @@ class DiaryScreen 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)); } @@ -663,7 +659,7 @@ class DiaryScreen extends StatelessWidget { }; } - changePortion(BuildContext context, DiaryState state) { + changePortion(BuildContext context, DiaryStateLoaded state) { return (value) { context.read().add(ChangePortion(value: value)); }; From b8227a492d6494b497da9c2264f9b233f98fc255 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 15 Jul 2024 15:06:14 +0300 Subject: [PATCH 08/19] fix(diary): Satiety and mood change API method call fix --- .../diary/presentation/bloc/diary_bloc.dart | 131 ++++-------------- .../bloc/diary_state.freezed.dart | 92 ++++++------ .../diary/repositories/diary_repository.dart | 29 ++++ .../diary/services/diary_service.dart | 20 +-- .../diary/services/diary_service.g.dart | 28 ++-- 5 files changed, 127 insertions(+), 173 deletions(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 6bef4932..4691b34f 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -18,8 +18,7 @@ part 'diary_event.dart'; class DiaryBloc extends Bloc { final DiaryRepository diaryRepository; - DiaryBloc({required this.diaryRepository}) - : super(const DiaryState.loading()) { + DiaryBloc({required this.diaryRepository}) : super(const DiaryState.loading()) { on(loadDiary); on(_changeSatiety); // пользователь нажимает на шкалу сытости on(_changeMood); // пользователь нажимает на шкалу настроения @@ -58,10 +57,7 @@ class DiaryBloc extends Bloc { final int? diaryID = data['id']; final DiaryModel diary = await diaryRepository.getDiary(diaryID ?? 45); final Meal currentMeal = diary.meals[0]; - List portions = [ - SelectionPopupModel(title: "gr"), - SelectionPopupModel(title: "pcs") - ]; + List portions = [SelectionPopupModel(title: "gr"), SelectionPopupModel(title: "pcs")]; emit(DiaryState.loaded( diary: diary, currentMeal: currentMeal, @@ -69,8 +65,8 @@ class DiaryBloc extends Bloc { photos: currentMeal.photos, portionList: portions, portionController: portions[0], - selectedMood: 3, - selectedSatiety: 3, + selectedMood: currentMeal.mood, + selectedSatiety: currentMeal.satiety, commentController: TextEditingController(), productNameController: TextEditingController(), productQuantityController: TextEditingController(), @@ -88,7 +84,6 @@ class DiaryBloc extends Bloc { consumedChartValues: [1, 1, 1, 1])); } catch (e) { emit(DiaryState.error(errorMessage: e.toString())); - print(e); } } @@ -110,22 +105,14 @@ class DiaryBloc extends Bloc { if (responseChart.statusCode == 200) { final responseBody = jsonDecode(responseChart.body); - final recommendedChartValues = - responseBody['dailyNutritionRecommendation'] - .values - .map((value) => convertToInt(value)) - .toList(); + final recommendedChartValues = responseBody['dailyNutritionRecommendation'].values.map((value) => convertToInt(value)).toList(); - final consumedChartValues = responseBody['dailyNutritionIntake'] - .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: 'Ошибка при декодировании данных КБЖУ')); + emit(DiaryStateError(errorMessage: 'Ошибка при декодировании данных КБЖУ')); print('fail'); return [[], []]; // Return empty lists instead of -1 } @@ -152,69 +139,23 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var updatedState = - currentState.copyWith(selectedMood: event.selectedElement); - - // Отправляем данные по HTTP маршруту и ждем ответ - var response = await sendSatietyData( - event.selectedElement, - currentState.currentMeal.id, - currentState.diary.id, - ); - - if (response.statusCode == 200) { - print( - 'Satiety change success! meal_id: ${currentState.currentMeal.id}, mood: ${event.selectedElement}', - ); - emit(updatedState); // Передаем обновленное состояние в emit - } else - print("dad"); + var updatedState = currentState.copyWith(selectedSatiety: event.selectedElement); + diaryRepository.changeSatiety(event.selectedElement, currentState.currentMeal.id, currentState.diary.id); + emit(updatedState); } } - Future sendSatietyData( - int selectedSatiety, - int? mealID, - int diaryID, - ) async { - String url = dotenv.env['SERVER_ROOT']! + - '/diary/$diaryID/meal/$mealID/satiety/fill'; - final Map credentials = { - 'satiety': selectedSatiety, - }; - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - return response; - } - Future _changeMood( ChangeMood event, Emitter emit, ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var updatedState = - currentState.copyWith(selectedMood: event.selectedElement); + var updatedState = currentState.copyWith(selectedMood: event.selectedElement); - // Отправляем данные по HTTP маршруту и ждем ответ - var response = await sendMoodData( - event.selectedElement, - currentState.currentMeal.id, - currentState.diary.id, - ); + diaryRepository.changeMood(event.selectedElement, currentState.currentMeal.id, currentState.diary.id); - if (response.statusCode == 200) { - print( - 'Mood change success! meal_id: ${currentState.currentMeal.id}, mood: ${event.selectedElement}', - ); - emit(updatedState); // Передаем обновленное состояние в emit - } + emit(updatedState); // Передаем обновленное состояние в emit } } @@ -223,8 +164,7 @@ class DiaryBloc extends Bloc { int? mealID, int diaryID, ) async { - String url = - dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/meal/$mealID/mood/fill'; + String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/meal/$mealID/mood/fill'; final Map credentials = { 'mood': selectedMood, }; @@ -253,8 +193,7 @@ class DiaryBloc extends Bloc { ); if (response.statusCode == 200) { await reloadScreen(event, emit); - var updatedState = - currentState.copyWith(wakeupController: event.selectedTime); + var updatedState = currentState.copyWith(wakeupController: event.selectedTime); print("Wakeup time changed to ${event.selectedTime}"); emit(updatedState); // Передаем обновленное состояние в emit } else @@ -274,8 +213,7 @@ class DiaryBloc extends Bloc { ); if (response.statusCode == 200) { await reloadScreen(event, emit); - var updatedState = - currentState.copyWith(retireController: event.selectedTime); + var updatedState = currentState.copyWith(retireController: event.selectedTime); print("Retire time changed to ${event.selectedTime}"); emit(updatedState); // Передаем обновленное состояние в emit } else @@ -289,8 +227,7 @@ class DiaryBloc extends Bloc { ) async { String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/wakeUp/fill'; final formatter = DateFormat('HH:mm'); - final wakeupString = - formatter.format(DateTime(2022, 1, 1, wakeup.hour, wakeup.minute)); + final wakeupString = formatter.format(DateTime(2022, 1, 1, wakeup.hour, wakeup.minute)); final Map credentials = { 'wakeUp': wakeupString, }; @@ -313,8 +250,7 @@ class DiaryBloc extends Bloc { ) async { String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/retire/fill'; final formatter = DateFormat('HH:mm'); - final retireString = - formatter.format(DateTime(2022, 1, 1, retire.hour, retire.minute)); + final retireString = formatter.format(DateTime(2022, 1, 1, retire.hour, retire.minute)); final Map credentials = { 'retire': retireString, }; @@ -375,8 +311,7 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - Meal? meal = - currentState.diary.meals.firstWhere((meal) => meal.id == event.value); + Meal? meal = currentState.diary.meals.firstWhere((meal) => meal.id == event.value); DiaryStateLoaded updatedState = currentState.copyWith( currentMeal: event.value, @@ -469,8 +404,7 @@ class DiaryBloc extends Bloc { int? mealID, int diaryID, ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/create'; + String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/create'; final Map credentials = { 'product_name': name, @@ -509,16 +443,13 @@ class DiaryBloc extends Bloc { }, ); - final productNutritionalValues = - jsonDecode(response.body)['product_nutritional_value']; + 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(), + autocompleteList: productNutritionalValues.map((product) => product['name']).toList(), ); if (event.input.length > 3) { updatedState = updatedState.copyWith(moderationExpanded: true); @@ -538,8 +469,7 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - int? mealId = - currentState.currentMeal.id; // Rename id to mealId for clarity + int? mealId = currentState.currentMeal.id; // Rename id to mealId for clarity var response = await sendRemovePortion( event.portionId, @@ -562,8 +492,7 @@ class DiaryBloc extends Bloc { int? mealID, int diaryID, ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; + String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; var response = await http.delete( Uri.parse(url), @@ -606,8 +535,7 @@ class DiaryBloc extends Bloc { int? mealID, int diaryID, ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/photo/delete'; + String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/photo/delete'; final Map credentials = { 'id': photoID, 'path': path, @@ -648,10 +576,8 @@ class DiaryBloc extends Bloc { 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 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, @@ -695,8 +621,7 @@ class DiaryBloc extends Bloc { int diaryID, int mealId, ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload'; + String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload'; var request = http.MultipartRequest('POST', Uri.parse(url)); diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 5acd8d21..32931040 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -41,8 +41,8 @@ mixin _$DiaryState { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -77,8 +77,8 @@ mixin _$DiaryState { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -113,8 +113,8 @@ mixin _$DiaryState { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -231,8 +231,8 @@ class _$DiaryStateImpl implements _DiaryState { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -270,8 +270,8 @@ class _$DiaryStateImpl implements _DiaryState { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -309,8 +309,8 @@ class _$DiaryStateImpl implements _DiaryState { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -429,8 +429,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -468,8 +468,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -507,8 +507,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -593,8 +593,8 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -636,8 +636,8 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> Object? fatsController = null, Object? proteinsController = null, Object? carbsController = null, - Object? selectedMood = freezed, - Object? selectedSatiety = freezed, + Object? selectedMood = null, + Object? selectedSatiety = null, Object? wakeupExpanded = null, Object? moderationExpanded = null, Object? moodExpanded = null, @@ -725,14 +725,14 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value.carbsController : carbsController // ignore: cast_nullable_to_non_nullable as TextEditingController, - selectedMood: freezed == selectedMood + selectedMood: null == selectedMood ? _value.selectedMood : selectedMood // ignore: cast_nullable_to_non_nullable - as int?, - selectedSatiety: freezed == selectedSatiety + as int, + selectedSatiety: null == selectedSatiety ? _value.selectedSatiety : selectedSatiety // ignore: cast_nullable_to_non_nullable - as int?, + as int, wakeupExpanded: null == wakeupExpanded ? _value.wakeupExpanded : wakeupExpanded // ignore: cast_nullable_to_non_nullable @@ -797,8 +797,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required this.fatsController, required this.proteinsController, required this.carbsController, - this.selectedMood, - this.selectedSatiety, + required this.selectedMood, + required this.selectedSatiety, required this.wakeupExpanded, required this.moderationExpanded, required this.moodExpanded, @@ -891,9 +891,9 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override final TextEditingController carbsController; @override - final int? selectedMood; + final int selectedMood; @override - final int? selectedSatiety; + final int selectedSatiety; @override final bool wakeupExpanded; @override @@ -1033,8 +1033,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -1099,8 +1099,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -1165,8 +1165,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -1269,8 +1269,8 @@ abstract class DiaryStateLoaded implements DiaryState { required final TextEditingController fatsController, required final TextEditingController proteinsController, required final TextEditingController carbsController, - final int? selectedMood, - final int? selectedSatiety, + required final int selectedMood, + required final int selectedSatiety, required final bool wakeupExpanded, required final bool moderationExpanded, required final bool moodExpanded, @@ -1297,8 +1297,8 @@ abstract class DiaryStateLoaded implements DiaryState { TextEditingController get fatsController; TextEditingController get proteinsController; TextEditingController get carbsController; - int? get selectedMood; - int? get selectedSatiety; + int get selectedMood; + int get selectedSatiety; bool get wakeupExpanded; bool get moderationExpanded; bool get moodExpanded; @@ -1398,8 +1398,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -1437,8 +1437,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, @@ -1476,8 +1476,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TextEditingController fatsController, TextEditingController proteinsController, TextEditingController carbsController, - int? selectedMood, - int? selectedSatiety, + int selectedMood, + int selectedSatiety, bool wakeupExpanded, bool moderationExpanded, bool moodExpanded, diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 25903f14..c915d600 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,5 +1,10 @@ +import 'package:eatvio_app/core/app_export.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/presentation/bloc/diary_bloc.dart'; +import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; import 'package:eatvio_app/features/diary/services/diary_service.dart'; +import 'package:flutter/widgets.dart'; class DiaryRepository { final DiaryService diaryService; @@ -21,4 +26,28 @@ class DiaryRepository { 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; + } + } } diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index e047b5e6..ad025394 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -18,18 +18,18 @@ abstract class DiaryService { @GET('/diary/{id}/dailyNutritionData/') Future getChart(@Path() String id); - @POST('/diary/{diaryID}/meal/{mealID}/satiety/fill') - Future sendSatiety( - @Path() String diaryID, - String mealID, - int satiety, + @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/{diaryID}/meal/{mealID}/mood/fill') - Future sendMood( - @Path() String diaryID, - String mealID, - int mood, + @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/{diaryID}/wakeup/fill') diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index 3ea7bd1b..ddbf2199 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -101,24 +101,24 @@ class _DiaryService implements DiaryService { } @override - Future sendSatiety( - String diaryID, - String mealID, + Future> sendSatietyData( + int diary_id, + int meal_id, int satiety, ) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = {r'satiety': satiety}; final _headers = {}; const Map? _data = null; final _result = await _dio - .fetch>(_setStreamType(Options( + .fetch>(_setStreamType>(Options( method: 'POST', headers: _headers, extra: _extra, ) .compose( _dio.options, - '/diary/${diaryID}/meal/{mealID}/satiety/fill', + '/diary/${diary_id}/meal/${meal_id}/satiety/fill', queryParameters: queryParameters, data: _data, ) @@ -127,29 +127,29 @@ class _DiaryService implements DiaryService { _dio.options.baseUrl, baseUrl, )))); - final _value = DiaryModel.fromJson(_result.data!); + final _value = _result.data!.cast(); return _value; } @override - Future sendMood( - String diaryID, - String mealID, + Future> sendMoodData( + int diary_id, + int meal_id, int mood, ) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = {r'mood': mood}; final _headers = {}; const Map? _data = null; final _result = await _dio - .fetch>(_setStreamType(Options( + .fetch>(_setStreamType>(Options( method: 'POST', headers: _headers, extra: _extra, ) .compose( _dio.options, - '/diary/${diaryID}/meal/{mealID}/mood/fill', + '/diary/${diary_id}/meal/${meal_id}/mood/fill', queryParameters: queryParameters, data: _data, ) @@ -158,7 +158,7 @@ class _DiaryService implements DiaryService { _dio.options.baseUrl, baseUrl, )))); - final _value = DiaryModel.fromJson(_result.data!); + final _value = _result.data!.cast(); return _value; } From 76c1effe122b208cf7466ee1d317997c28d8368c Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 15 Jul 2024 15:37:18 +0300 Subject: [PATCH 09/19] fix(diary): Wakeup and retire time API method call fix --- .../diary/presentation/bloc/diary_bloc.dart | 130 ++---------------- .../diary/presentation/bloc/diary_event.dart | 3 +- .../diary/repositories/diary_repository.dart | 33 ++++- .../diary/services/diary_service.dart | 17 +-- .../diary/services/diary_service.g.dart | 20 ++- 5 files changed, 60 insertions(+), 143 deletions(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 4691b34f..8cebe1a9 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -159,45 +159,20 @@ class DiaryBloc extends Bloc { } } - Future sendMoodData( - int selectedMood, - int? mealID, - int diaryID, - ) async { - String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/meal/$mealID/mood/fill'; - final Map credentials = { - 'mood': selectedMood, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - FutureOr _changeWakeup( WakeupEvent event, Emitter emit, ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var response = await sendWakeupData( - event.selectedTime, + 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, ); - 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"); + emit(updatedState); } } @@ -207,66 +182,17 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var response = await sendRetireData( - event.selectedTime, + 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, ); - 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"); + emit(updatedState); } } - Future sendWakeupData( - TimeOfDay wakeup, - int diaryID, - ) async { - String url = dotenv.env['SERVER_ROOT']! + '/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', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - Future sendRetireData( - TimeOfDay retire, - int diaryID, - ) async { - String url = dotenv.env['SERVER_ROOT']! + '/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', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - FutureOr _changeMealTime( ChangeMealTime event, Emitter emit, @@ -274,53 +200,27 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; var updatedState = currentState.copyWith(mealTimeController: event.time); - emit(updatedState); } } - Future sendMealTimeData( - String? token, - TimeOfDay mealTime, - int? mealID, - int diaryID, - ) async { - String url = dotenv.env['SERVER_ROOT']! + '/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 DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - Meal? meal = currentState.diary.meals.firstWhere((meal) => meal.id == event.value); + Meal? meal = currentState.diary.meals.firstWhere((meal) => meal.id == event.value.id); DiaryStateLoaded updatedState = currentState.copyWith( - currentMeal: event.value, + currentMeal: meal, portions: meal.portions, photos: meal.photos, mealTimeController: toTime(meal.time), selectedMood: meal.mood, selectedSatiety: meal.satiety, ); + print(updatedState.currentMeal.id); emit(updatedState); } } diff --git a/lib/features/diary/presentation/bloc/diary_event.dart b/lib/features/diary/presentation/bloc/diary_event.dart index 91445ffb..eb4742e8 100644 --- a/lib/features/diary/presentation/bloc/diary_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -158,6 +158,5 @@ class SendModeration extends DiaryEvent { 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/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index c915d600..68511c77 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,10 +1,5 @@ -import 'package:eatvio_app/core/app_export.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/presentation/bloc/diary_bloc.dart'; -import 'package:eatvio_app/features/diary/presentation/bloc/diary_state.dart'; import 'package:eatvio_app/features/diary/services/diary_service.dart'; -import 'package:flutter/widgets.dart'; class DiaryRepository { final DiaryService diaryService; @@ -50,4 +45,32 @@ class DiaryRepository { 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; + } + } } diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index ad025394..b412594b 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,6 +1,5 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/features/diary/models/diary_model.dart'; -import 'package:flutter/material.dart'; import 'package:retrofit/retrofit.dart'; part 'diary_service.g.dart'; @@ -32,17 +31,15 @@ abstract class DiaryService { @Query('mood') int mood, ); - @POST('/diary/{diaryID}/wakeup/fill') - Future sendWakeup( - @Path() String diaryID, - String mealID, - TimeOfDay wakeup, + @POST('/diary/{diary_id}/wakeup/fill') + Future sendWakeupData( + @Path() int diary_id, + @Query('wakeup') String wakeup, ); - @POST('/diary/{diaryID}/retire/fill') + @POST('/diary/{diary_id}/retire/fill') Future sendRetire( - @Path() String diaryID, - String mealID, - TimeOfDay retire, + @Path() int diary_id, + @Query('retire') String retire, ); } diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index ddbf2199..a33a19e5 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -163,13 +163,12 @@ class _DiaryService implements DiaryService { } @override - Future sendWakeup( - String diaryID, - String mealID, - TimeOfDay wakeup, + Future sendWakeupData( + int diary_id, + String wakeup, ) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = {r'wakeup': wakeup}; final _headers = {}; const Map? _data = null; final _result = await _dio @@ -180,7 +179,7 @@ class _DiaryService implements DiaryService { ) .compose( _dio.options, - '/diary/${diaryID}/wakeup/fill', + '/diary/${diary_id}/wakeup/fill', queryParameters: queryParameters, data: _data, ) @@ -195,12 +194,11 @@ class _DiaryService implements DiaryService { @override Future sendRetire( - String diaryID, - String mealID, - TimeOfDay retire, + int diary_id, + String retire, ) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = {r'retire': retire}; final _headers = {}; const Map? _data = null; final _result = await _dio @@ -211,7 +209,7 @@ class _DiaryService implements DiaryService { ) .compose( _dio.options, - '/diary/${diaryID}/retire/fill', + '/diary/${diary_id}/retire/fill', queryParameters: queryParameters, data: _data, ) From ae213f39a5d56c59f157bfee42e35f9b2586d69b Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 15 Jul 2024 17:10:55 +0300 Subject: [PATCH 10/19] fix(diary): Meal change method fix --- .../diary/presentation/bloc/diary_bloc.dart | 20 ++-- .../diary/presentation/bloc/diary_event.dart | 7 +- .../diary/presentation/bloc/diary_state.dart | 1 + .../bloc/diary_state.freezed.dart | 40 +++++++- .../presentation/pages/diary_screen.dart | 93 ++++++------------- 5 files changed, 83 insertions(+), 78 deletions(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 8cebe1a9..c50210b7 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -57,14 +57,23 @@ class DiaryBloc extends Bloc { final int? diaryID = data['id']; final DiaryModel diary = await diaryRepository.getDiary(diaryID ?? 45); final Meal currentMeal = diary.meals[0]; - List portions = [SelectionPopupModel(title: "gr"), SelectionPopupModel(title: "pcs")]; + List portionList = [SelectionPopupModel(title: "gr"), SelectionPopupModel(title: "pcs")]; + 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), + ]; emit(DiaryState.loaded( diary: diary, currentMeal: currentMeal, portions: currentMeal.portions, photos: currentMeal.photos, - portionList: portions, - portionController: portions[0], + portionList: portionList, + portionController: portionList[0], + mealList: mealList, selectedMood: currentMeal.mood, selectedSatiety: currentMeal.satiety, commentController: TextEditingController(), @@ -209,9 +218,8 @@ class DiaryBloc extends Bloc { Emitter emit, ) async { if (state is DiaryStateLoaded) { - var currentState = state as DiaryStateLoaded; - Meal? meal = currentState.diary.meals.firstWhere((meal) => meal.id == event.value.id); - + 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, diff --git a/lib/features/diary/presentation/bloc/diary_event.dart b/lib/features/diary/presentation/bloc/diary_event.dart index eb4742e8..d6637528 100644 --- a/lib/features/diary/presentation/bloc/diary_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -110,11 +110,10 @@ class ProductInput extends DiaryEvent { } class ChangeMeal extends DiaryEvent { - ChangeMeal({required this.value, required this.meals}); - Meal value; - List? meals; + ChangeMeal({required this.value}); + SelectionPopupModel value; @override - List get props => [value, meals]; + List get props => [value]; } class ClearInput extends DiaryEvent { diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index 957dafc0..fa490162 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -23,6 +23,7 @@ abstract class DiaryState with _$DiaryState { required List consumedChartValues, required List portions, required List photos, + required List mealList, required List portionList, required Meal currentMeal, required SelectionPopupModel portionController, diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 32931040..2ecc30d9 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -28,6 +28,7 @@ mixin _$DiaryState { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -64,6 +65,7 @@ mixin _$DiaryState { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -100,6 +102,7 @@ mixin _$DiaryState { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -218,6 +221,7 @@ class _$DiaryStateImpl implements _DiaryState { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -257,6 +261,7 @@ class _$DiaryStateImpl implements _DiaryState { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -296,6 +301,7 @@ class _$DiaryStateImpl implements _DiaryState { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -416,6 +422,7 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -455,6 +462,7 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -494,6 +502,7 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -580,6 +589,7 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -623,6 +633,7 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> Object? consumedChartValues = null, Object? portions = null, Object? photos = null, + Object? mealList = null, Object? portionList = null, Object? currentMeal = null, Object? portionController = null, @@ -673,6 +684,10 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value._photos : photos // 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 @@ -784,6 +799,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required final List consumedChartValues, required final List portions, required final List photos, + required final List mealList, required final List portionList, required this.currentMeal, required this.portionController, @@ -809,6 +825,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { _consumedChartValues = consumedChartValues, _portions = portions, _photos = photos, + _mealList = mealList, _portionList = portionList; @override @@ -858,6 +875,14 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return EqualUnmodifiableListView(_photos); } + 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 { @@ -907,7 +932,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override String toString() { - return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, autocompleteList: $autocompleteList, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, portionList: $portionList, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, productNameController: $productNameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded)'; + return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, autocompleteList: $autocompleteList, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, mealList: $mealList, portionList: $portionList, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, productNameController: $productNameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded)'; } @override @@ -926,6 +951,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { .equals(other._consumedChartValues, _consumedChartValues) && const DeepCollectionEquality().equals(other._portions, _portions) && const DeepCollectionEquality().equals(other._photos, _photos) && + const DeepCollectionEquality().equals(other._mealList, _mealList) && const DeepCollectionEquality() .equals(other._portionList, _portionList) && (identical(other.currentMeal, currentMeal) || @@ -978,6 +1004,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { const DeepCollectionEquality().hash(_consumedChartValues), const DeepCollectionEquality().hash(_portions), const DeepCollectionEquality().hash(_photos), + const DeepCollectionEquality().hash(_mealList), const DeepCollectionEquality().hash(_portionList), currentMeal, portionController, @@ -1020,6 +1047,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -1051,6 +1079,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { consumedChartValues, portions, photos, + mealList, portionList, currentMeal, portionController, @@ -1086,6 +1115,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -1117,6 +1147,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { consumedChartValues, portions, photos, + mealList, portionList, currentMeal, portionController, @@ -1152,6 +1183,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -1185,6 +1217,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { consumedChartValues, portions, photos, + mealList, portionList, currentMeal, portionController, @@ -1256,6 +1289,7 @@ abstract class DiaryStateLoaded implements DiaryState { required final List consumedChartValues, required final List portions, required final List photos, + required final List mealList, required final List portionList, required final Meal currentMeal, required final SelectionPopupModel portionController, @@ -1284,6 +1318,7 @@ abstract class DiaryStateLoaded implements DiaryState { List get consumedChartValues; List get portions; List get photos; + List get mealList; List get portionList; Meal get currentMeal; SelectionPopupModel get portionController; @@ -1385,6 +1420,7 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -1424,6 +1460,7 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, @@ -1463,6 +1500,7 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List consumedChartValues, List portions, List photos, + List mealList, List portionList, Meal currentMeal, SelectionPopupModel portionController, diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 8dcdbb75..422d8bc7 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -247,9 +247,7 @@ class DiaryScreen extends StatelessWidget { borderRadius: BorderRadiusStyle.roundedBorder5, ), child: Center( - child: CircularProgressIndicator( - color: appTheme - .blueGray300), // Замените на свой прелоадер при необходимости + child: CircularProgressIndicator(color: appTheme.blueGray300), // Замените на свой прелоадер при необходимости ), ), ], @@ -273,8 +271,7 @@ class DiaryScreen extends StatelessWidget { _buildMeal(BuildContext context, DiaryStateLoaded state) { final digitsOnly = FilteringTextInputFormatter.digitsOnly; - List _options = - state.autocompleteList.map((dynamic item) => item as String).toList(); + List _options = state.autocompleteList.map((dynamic item) => item as String).toList(); FocusNode focusNodeName = FocusNode(); return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -318,9 +315,7 @@ class DiaryScreen extends StatelessWidget { onTap: () => _selectMealTime(context, state), child: AbsorbPointer( child: CustomTextFormField( - hintText: state.mealTimeController - ?.format(context) - .toString(), + hintText: state.mealTimeController?.format(context).toString(), autofocus: false, ), ), @@ -342,14 +337,13 @@ class DiaryScreen extends StatelessWidget { return null; }, builder: (context, diary) { - List meals = mealsToDropdown(diary!.meals); return CustomDropDown( - hintText: meals[0].title, - items: meals, + items: state.mealList, contentPadding: EdgeInsets.symmetric( horizontal: 10.h, vertical: 9.v, ), + defaultValue: state.mealList[0], onChanged: changeMeal(context, state), ); }, @@ -457,9 +451,7 @@ class DiaryScreen extends StatelessWidget { SizedBox(height: 30.v), _buildAddProduct(context, state), SizedBox(height: 30.v), - ...state.portions - .map((portion) => _buildProduct(context, portion)) - .toList(), + ...state.portions.map((portion) => _buildProduct(context, portion)).toList(), SizedBox(height: 30.v), /*...state.photos != null ? state.photos!.isEmpty @@ -616,8 +608,7 @@ class DiaryScreen extends StatelessWidget { popDialog(BuildContext dialogContext) { return () { - Navigator.of(dialogContext) - .pop(); // Dismiss the dialog on Cancel button press + Navigator.of(dialogContext).pop(); // Dismiss the dialog on Cancel button press }; } @@ -627,8 +618,7 @@ class DiaryScreen extends StatelessWidget { }; } - selectProduct(AutocompleteOnSelected onSelected, String option, - DiaryStateLoaded state) { + selectProduct(AutocompleteOnSelected onSelected, String option, DiaryStateLoaded state) { state.productNameController.text = option; return () { onSelected(option); @@ -653,9 +643,7 @@ class DiaryScreen extends StatelessWidget { changeMeal(BuildContext context, DiaryStateLoaded state) { return (value) { - context - .read() - .add(ChangeMeal(meals: state.diary.meals, value: value)); + context.read().add(ChangeMeal(value: value)); }; } @@ -672,8 +660,7 @@ class DiaryScreen extends StatelessWidget { return CarouselSlider( options: CarouselOptions(height: 340.0), items: state.currentMeal.photos.map((photo) { - return _buildPhoto( - context, photo); // Assuming photos are stored as strings + return _buildPhoto(context, photo); // Assuming photos are stored as strings }).toList(), ); } @@ -699,9 +686,7 @@ class DiaryScreen extends StatelessWidget { top: 5.v, ), child: Text( - portion.productName.length > 8 - ? portion.productName.substring(0, 8) - : portion.productName, + portion.productName.length > 8 ? portion.productName.substring(0, 8) : portion.productName, style: CustomTextStyles.titleMedium16, ), ), @@ -773,15 +758,12 @@ class DiaryScreen extends StatelessWidget { removePhoto(BuildContext context, Photo photo) { return () { - context - .read() - .add(RemoveImageEvent(photo.id.toString(), photo.path)); + context.read().add(RemoveImageEvent(photo.id.toString(), photo.path)); }; } _buildNutritionChart(BuildContext context, DiaryStateLoaded state) { - final List recommendedValues = state - .recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы + final List recommendedValues = state.recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы final List consumedValues = state.consumedChartValues; // return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -845,10 +827,7 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[0] / recommendedValues[0] * 100, - color: checkConsumedValues( - [recommendedValues[0]], [consumedValues[1]]) - ? Colors.red - : Colors.blue, + color: checkConsumedValues([recommendedValues[0]], [consumedValues[1]]) ? Colors.red : Colors.blue, ), ], ), @@ -857,10 +836,7 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[1] / recommendedValues[1] * 100, - color: checkConsumedValues( - [recommendedValues[1]], [consumedValues[1]]) - ? Colors.red - : Colors.blue, + color: checkConsumedValues([recommendedValues[1]], [consumedValues[1]]) ? Colors.red : Colors.blue, ), ], ), @@ -869,10 +845,7 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[2] / recommendedValues[2] * 100, - color: checkConsumedValues( - [recommendedValues[2]], [consumedValues[2]]) - ? Colors.red - : Colors.blue, + color: checkConsumedValues([recommendedValues[2]], [consumedValues[2]]) ? Colors.red : Colors.blue, ), ], ), @@ -881,10 +854,7 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[3] / recommendedValues[3] * 100, - color: checkConsumedValues( - [recommendedValues[3]], [consumedValues[3]]) - ? Colors.red - : Colors.blue, + color: checkConsumedValues([recommendedValues[3]], [consumedValues[3]]) ? Colors.red : Colors.blue, ), ], ), @@ -1075,9 +1045,7 @@ class DiaryScreen extends StatelessWidget { r"Подъем \ отход ко сну", style: CustomTextStyles.bodyMediumBlack900, ), - Icon(state.wakeupExpanded - ? Icons.arrow_drop_up - : Icons.arrow_drop_down), + Icon(state.wakeupExpanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), ], ), ), @@ -1091,8 +1059,7 @@ class DiaryScreen extends StatelessWidget { onTap: () => _selectWakeupTime(context, state), child: AbsorbPointer( child: CustomTextFormField( - hintText: - state.wakeupController?.format(context).toString(), + hintText: state.wakeupController?.format(context).toString(), prefix: Icon(Icons.sunny), autofocus: false, ), @@ -1103,8 +1070,7 @@ class DiaryScreen extends StatelessWidget { onTap: () => _selectRetireTime(context, state), child: AbsorbPointer( child: CustomTextFormField( - hintText: - state.retireController?.format(context).toString(), + hintText: state.retireController?.format(context).toString(), prefix: Icon(Icons.bed), autofocus: false, ), @@ -1151,8 +1117,7 @@ class DiaryScreen extends StatelessWidget { }; } - Function() sendFinishDayData( - BuildContext dialogContext, BuildContext context) { + Function() sendFinishDayData(BuildContext dialogContext, BuildContext context) { return () { closeDialog(dialogContext); context.read().add(FinishDay()); @@ -1195,9 +1160,7 @@ class DiaryScreen extends StatelessWidget { "Ваше настроение после приема пищи", style: CustomTextStyles.bodyMediumBlack900, ), - Icon(state.moodExpanded - ? Icons.arrow_drop_up - : Icons.arrow_drop_down), + Icon(state.moodExpanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), ], ), ), @@ -1257,8 +1220,7 @@ class DiaryScreen extends StatelessWidget { }; } - Future _selectWakeupTime( - BuildContext context, DiaryStateLoaded state) async { + Future _selectWakeupTime(BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.wakeupController ?? TimeOfDay.now(), @@ -1268,8 +1230,7 @@ class DiaryScreen extends StatelessWidget { } } - Future _selectRetireTime( - BuildContext context, DiaryStateLoaded state) async { + Future _selectRetireTime(BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.retireController ?? TimeOfDay.now(), @@ -1279,8 +1240,7 @@ class DiaryScreen extends StatelessWidget { } } - Future _selectMealTime( - BuildContext context, DiaryStateLoaded state) async { + Future _selectMealTime(BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.mealTimeController ?? TimeOfDay.now(), @@ -1291,8 +1251,7 @@ class DiaryScreen extends StatelessWidget { } } -bool checkConsumedValues( - List recommendedValues, List consumedValues) { +bool checkConsumedValues(List recommendedValues, List consumedValues) { for (int i = 0; i < recommendedValues.length; i++) { if (consumedValues[i] > recommendedValues[i]) { // Если хотя бы одно потребленное значение превышает рекомендованное From 8610cacc6f832b776d4eac0b2c44356b39a281c3 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 15 Jul 2024 17:44:33 +0300 Subject: [PATCH 11/19] refactor(diary): Refactor product input --- .../diary/presentation/bloc/diary_bloc.dart | 63 ++--- .../diary/repositories/diary_repository.dart | 8 + .../diary/services/diary_service.dart | 3 + .../diary/services/diary_service.g.dart | 254 ------------------ 4 files changed, 35 insertions(+), 293 deletions(-) delete mode 100644 lib/features/diary/services/diary_service.g.dart diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index c50210b7..06d76c47 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -228,11 +228,34 @@ class DiaryBloc extends Bloc { selectedMood: meal.mood, selectedSatiety: meal.satiety, ); - print(updatedState.currentMeal.id); emit(updatedState); } } + Future _inputProduct( + ProductInput event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + final productNutritionalValues = await diaryRepository.inputProduct(event.input); + + // 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 + } + } + FutureOr _clearInput( ClearInput event, Emitter emit, @@ -332,44 +355,6 @@ class DiaryBloc extends Bloc { return response; } - Future _inputProduct( - ProductInput event, - Emitter emit, - ) async { - if (state is DiaryStateLoaded) { - var currentState = state as DiaryStateLoaded; - - final Map credentials = {'name': event.input}; - final uri = Uri.parse( - '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/filter?${Uri(queryParameters: credentials).query}', - ); - - final response = await http.get( - uri, - headers: { - 'Content-Type': 'application/json', - }, - ); - - 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, diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 68511c77..ce9e0fa1 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -22,6 +22,14 @@ class DiaryRepository { } } + Future> inputProduct(String name) async { + try { + return await diaryService.sendInputProduct(name); + } catch (e) { + rethrow; + } + } + Future changeSatiety(int satiety, int mealID, int diaryID) async { try { await diaryService.sendSatietyData( diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index b412594b..f1ad9d92 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -17,6 +17,9 @@ abstract class DiaryService { @GET('/diary/{id}/dailyNutritionData/') Future getChart(@Path() String id); + @GET('/diary/product_nutritional_values/filter?{name}') + Future> sendInputProduct(@Path() String name); + @POST('/diary/{diary_id}/meal/{meal_id}/satiety/fill') Future> sendSatietyData( @Path() int diary_id, diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart deleted file mode 100644 index a33a19e5..00000000 --- a/lib/features/diary/services/diary_service.g.dart +++ /dev/null @@ -1,254 +0,0 @@ -// 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(String 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 = DiaryModel.fromJson(_result.data!); - 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 sendRetire( - 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; - } - - 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(); - } -} From 20d253313a2d4174bb79884b151bad08bcd3ba8d Mon Sep 17 00:00:00 2001 From: maxxkim Date: Mon, 15 Jul 2024 18:13:44 +0300 Subject: [PATCH 12/19] refactor(diary): Merge conflic resolve --- .../diary/presentation/bloc/diary_bloc.dart | 4 +- .../diary/repositories/diary_repository.dart | 2 +- .../diary/services/diary_service.dart | 2 +- .../diary/services/diary_service.g.dart | 270 ++++++++++++++++++ 4 files changed, 274 insertions(+), 4 deletions(-) create mode 100644 lib/features/diary/services/diary_service.g.dart diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 06d76c47..3bd4a6e2 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -242,7 +242,7 @@ class DiaryBloc extends Bloc { final productNutritionalValues = await diaryRepository.inputProduct(event.input); // Create a new controller with the input text and update the autocomplete list - var updatedState = currentState.copyWith( + /*var updatedState = currentState.copyWith( productNameController: TextEditingController(text: event.input), autocompleteList: productNutritionalValues.map((product) => product['name']).toList(), ); @@ -252,7 +252,7 @@ class DiaryBloc extends Bloc { updatedState = updatedState.copyWith(moderationExpanded: false); } - emit(updatedState); // Emit the updated state + emit(updatedState); */ } } diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index ce9e0fa1..57aa1426 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -22,7 +22,7 @@ class DiaryRepository { } } - Future> inputProduct(String name) async { + Future inputProduct(String name) async { try { return await diaryService.sendInputProduct(name); } catch (e) { diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index f1ad9d92..01b6b93a 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -18,7 +18,7 @@ abstract class DiaryService { Future getChart(@Path() String id); @GET('/diary/product_nutritional_values/filter?{name}') - Future> sendInputProduct(@Path() String name); + Future sendInputProduct(@Path() String name); @POST('/diary/{diary_id}/meal/{meal_id}/satiety/fill') Future> sendSatietyData( 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..e0bff56f --- /dev/null +++ b/lib/features/diary/services/diary_service.g.dart @@ -0,0 +1,270 @@ +// 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(String 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 = DiaryModel.fromJson(_result.data!); + return _value; + } + + @override + Future sendInputProduct(String name) 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/product_nutritional_values/filter?${name}', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = DiaryModel.fromJson(_result.data!); + 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 sendRetire( + 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; + } + + 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(); + } +} From b5becbe6656d38ebbe89554f62a4731bfd369a37 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 17 Jul 2024 12:39:09 +0300 Subject: [PATCH 13/19] refactor(diary): API mor produc nutritional and new Product model --- lib/features/diary/models/diary,dart | 19 - lib/features/diary/models/product.dart | 32 + .../diary/models/product.freezed.dart | 548 ++++++++++++++++++ lib/features/diary/models/product.g.dart | 53 ++ .../diary/presentation/bloc/diary_bloc.dart | 119 ++-- .../diary/repositories/diary_repository.dart | 41 +- .../diary/services/diary_service.dart | 24 +- .../diary/services/diary_service.g.dart | 287 +++++---- 8 files changed, 935 insertions(+), 188 deletions(-) delete mode 100644 lib/features/diary/models/diary,dart create mode 100644 lib/features/diary/models/product.dart create mode 100644 lib/features/diary/models/product.freezed.dart create mode 100644 lib/features/diary/models/product.g.dart diff --git a/lib/features/diary/models/diary,dart b/lib/features/diary/models/diary,dart deleted file mode 100644 index f7c59357..00000000 --- a/lib/features/diary/models/diary,dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'diary.freezed.dart'; -part 'diary.g.dart'; - -@freezed -class Diary with _$Diary { - const factory Diary({ - required int id, - required DateTime date, - required int closed, - String? comment, - DateTime? wakeup, - DateTime? retire, - }) = _Diary; - - factory Diary.fromJson(Map json) => - _$DiaryFromJson(json); -} diff --git a/lib/features/diary/models/product.dart b/lib/features/diary/models/product.dart new file mode 100644 index 00000000..fdac1bf7 --- /dev/null +++ b/lib/features/diary/models/product.dart @@ -0,0 +1,32 @@ +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, + required String image, + required int productGroupId, + required String description, + required String formulations, + required int energyOn100gr, + required double proteinsOn100gr, + required double fatsOn100gr, + required double carbohydratesOn100gr, + required int portionMassGr, + required int energyOnPortion, + required int proteinsOnPortion, + required int fatsOnPortion, + required int carbohydratesOnPortion, + required String createdAt, + required String updatedAt, + required String lastState, + String? reqjectReason, + }) = _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..0b829ebc --- /dev/null +++ b/lib/features/diary/models/product.freezed.dart @@ -0,0 +1,548 @@ +// 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; + String get image => throw _privateConstructorUsedError; + int get productGroupId => throw _privateConstructorUsedError; + String get description => throw _privateConstructorUsedError; + String get formulations => throw _privateConstructorUsedError; + int get energyOn100gr => throw _privateConstructorUsedError; + double get proteinsOn100gr => throw _privateConstructorUsedError; + double get fatsOn100gr => throw _privateConstructorUsedError; + double get carbohydratesOn100gr => throw _privateConstructorUsedError; + int get portionMassGr => throw _privateConstructorUsedError; + int get energyOnPortion => throw _privateConstructorUsedError; + int get proteinsOnPortion => throw _privateConstructorUsedError; + int get fatsOnPortion => throw _privateConstructorUsedError; + int get carbohydratesOnPortion => throw _privateConstructorUsedError; + String get createdAt => throw _privateConstructorUsedError; + String get updatedAt => throw _privateConstructorUsedError; + String get lastState => throw _privateConstructorUsedError; + String? get reqjectReason => 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, + String image, + int productGroupId, + String description, + String formulations, + int energyOn100gr, + double proteinsOn100gr, + double fatsOn100gr, + double carbohydratesOn100gr, + int portionMassGr, + int energyOnPortion, + int proteinsOnPortion, + int fatsOnPortion, + int carbohydratesOnPortion, + String createdAt, + String updatedAt, + String lastState, + String? reqjectReason}); +} + +/// @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, + Object? image = null, + Object? productGroupId = null, + Object? description = null, + Object? formulations = null, + Object? energyOn100gr = null, + Object? proteinsOn100gr = null, + Object? fatsOn100gr = null, + Object? carbohydratesOn100gr = null, + Object? portionMassGr = null, + Object? energyOnPortion = null, + Object? proteinsOnPortion = null, + Object? fatsOnPortion = null, + Object? carbohydratesOnPortion = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? lastState = null, + Object? reqjectReason = freezed, + }) { + 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, + image: null == image + ? _value.image + : image // ignore: cast_nullable_to_non_nullable + as String, + productGroupId: null == productGroupId + ? _value.productGroupId + : productGroupId // ignore: cast_nullable_to_non_nullable + as int, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + formulations: null == formulations + ? _value.formulations + : formulations // ignore: cast_nullable_to_non_nullable + as String, + energyOn100gr: null == energyOn100gr + ? _value.energyOn100gr + : energyOn100gr // ignore: cast_nullable_to_non_nullable + as int, + proteinsOn100gr: null == proteinsOn100gr + ? _value.proteinsOn100gr + : proteinsOn100gr // ignore: cast_nullable_to_non_nullable + as double, + fatsOn100gr: null == fatsOn100gr + ? _value.fatsOn100gr + : fatsOn100gr // ignore: cast_nullable_to_non_nullable + as double, + carbohydratesOn100gr: null == carbohydratesOn100gr + ? _value.carbohydratesOn100gr + : carbohydratesOn100gr // ignore: cast_nullable_to_non_nullable + as double, + portionMassGr: null == portionMassGr + ? _value.portionMassGr + : portionMassGr // ignore: cast_nullable_to_non_nullable + as int, + energyOnPortion: null == energyOnPortion + ? _value.energyOnPortion + : energyOnPortion // ignore: cast_nullable_to_non_nullable + as int, + proteinsOnPortion: null == proteinsOnPortion + ? _value.proteinsOnPortion + : proteinsOnPortion // ignore: cast_nullable_to_non_nullable + as int, + fatsOnPortion: null == fatsOnPortion + ? _value.fatsOnPortion + : fatsOnPortion // ignore: cast_nullable_to_non_nullable + as int, + carbohydratesOnPortion: null == carbohydratesOnPortion + ? _value.carbohydratesOnPortion + : carbohydratesOnPortion // ignore: cast_nullable_to_non_nullable + as int, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as String, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as String, + lastState: null == lastState + ? _value.lastState + : lastState // ignore: cast_nullable_to_non_nullable + as String, + reqjectReason: freezed == reqjectReason + ? _value.reqjectReason + : reqjectReason // 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, + String image, + int productGroupId, + String description, + String formulations, + int energyOn100gr, + double proteinsOn100gr, + double fatsOn100gr, + double carbohydratesOn100gr, + int portionMassGr, + int energyOnPortion, + int proteinsOnPortion, + int fatsOnPortion, + int carbohydratesOnPortion, + String createdAt, + String updatedAt, + String lastState, + String? reqjectReason}); +} + +/// @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, + Object? image = null, + Object? productGroupId = null, + Object? description = null, + Object? formulations = null, + Object? energyOn100gr = null, + Object? proteinsOn100gr = null, + Object? fatsOn100gr = null, + Object? carbohydratesOn100gr = null, + Object? portionMassGr = null, + Object? energyOnPortion = null, + Object? proteinsOnPortion = null, + Object? fatsOnPortion = null, + Object? carbohydratesOnPortion = null, + Object? createdAt = null, + Object? updatedAt = null, + Object? lastState = null, + Object? reqjectReason = freezed, + }) { + 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, + image: null == image + ? _value.image + : image // ignore: cast_nullable_to_non_nullable + as String, + productGroupId: null == productGroupId + ? _value.productGroupId + : productGroupId // ignore: cast_nullable_to_non_nullable + as int, + description: null == description + ? _value.description + : description // ignore: cast_nullable_to_non_nullable + as String, + formulations: null == formulations + ? _value.formulations + : formulations // ignore: cast_nullable_to_non_nullable + as String, + energyOn100gr: null == energyOn100gr + ? _value.energyOn100gr + : energyOn100gr // ignore: cast_nullable_to_non_nullable + as int, + proteinsOn100gr: null == proteinsOn100gr + ? _value.proteinsOn100gr + : proteinsOn100gr // ignore: cast_nullable_to_non_nullable + as double, + fatsOn100gr: null == fatsOn100gr + ? _value.fatsOn100gr + : fatsOn100gr // ignore: cast_nullable_to_non_nullable + as double, + carbohydratesOn100gr: null == carbohydratesOn100gr + ? _value.carbohydratesOn100gr + : carbohydratesOn100gr // ignore: cast_nullable_to_non_nullable + as double, + portionMassGr: null == portionMassGr + ? _value.portionMassGr + : portionMassGr // ignore: cast_nullable_to_non_nullable + as int, + energyOnPortion: null == energyOnPortion + ? _value.energyOnPortion + : energyOnPortion // ignore: cast_nullable_to_non_nullable + as int, + proteinsOnPortion: null == proteinsOnPortion + ? _value.proteinsOnPortion + : proteinsOnPortion // ignore: cast_nullable_to_non_nullable + as int, + fatsOnPortion: null == fatsOnPortion + ? _value.fatsOnPortion + : fatsOnPortion // ignore: cast_nullable_to_non_nullable + as int, + carbohydratesOnPortion: null == carbohydratesOnPortion + ? _value.carbohydratesOnPortion + : carbohydratesOnPortion // ignore: cast_nullable_to_non_nullable + as int, + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as String, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as String, + lastState: null == lastState + ? _value.lastState + : lastState // ignore: cast_nullable_to_non_nullable + as String, + reqjectReason: freezed == reqjectReason + ? _value.reqjectReason + : reqjectReason // ignore: cast_nullable_to_non_nullable + as String?, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$ProductImpl implements _Product { + const _$ProductImpl( + {required this.id, + required this.name, + required this.image, + required this.productGroupId, + required this.description, + required this.formulations, + required this.energyOn100gr, + required this.proteinsOn100gr, + required this.fatsOn100gr, + required this.carbohydratesOn100gr, + required this.portionMassGr, + required this.energyOnPortion, + required this.proteinsOnPortion, + required this.fatsOnPortion, + required this.carbohydratesOnPortion, + required this.createdAt, + required this.updatedAt, + required this.lastState, + this.reqjectReason}); + + factory _$ProductImpl.fromJson(Map json) => + _$$ProductImplFromJson(json); + + @override + final int id; + @override + final String name; + @override + final String image; + @override + final int productGroupId; + @override + final String description; + @override + final String formulations; + @override + final int energyOn100gr; + @override + final double proteinsOn100gr; + @override + final double fatsOn100gr; + @override + final double carbohydratesOn100gr; + @override + final int portionMassGr; + @override + final int energyOnPortion; + @override + final int proteinsOnPortion; + @override + final int fatsOnPortion; + @override + final int carbohydratesOnPortion; + @override + final String createdAt; + @override + final String updatedAt; + @override + final String lastState; + @override + final String? reqjectReason; + + @override + String toString() { + return 'Product(id: $id, name: $name, image: $image, productGroupId: $productGroupId, description: $description, formulations: $formulations, energyOn100gr: $energyOn100gr, proteinsOn100gr: $proteinsOn100gr, fatsOn100gr: $fatsOn100gr, carbohydratesOn100gr: $carbohydratesOn100gr, portionMassGr: $portionMassGr, energyOnPortion: $energyOnPortion, proteinsOnPortion: $proteinsOnPortion, fatsOnPortion: $fatsOnPortion, carbohydratesOnPortion: $carbohydratesOnPortion, createdAt: $createdAt, updatedAt: $updatedAt, lastState: $lastState, reqjectReason: $reqjectReason)'; + } + + @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) && + (identical(other.image, image) || other.image == image) && + (identical(other.productGroupId, productGroupId) || + other.productGroupId == productGroupId) && + (identical(other.description, description) || + other.description == description) && + (identical(other.formulations, formulations) || + other.formulations == formulations) && + (identical(other.energyOn100gr, energyOn100gr) || + other.energyOn100gr == energyOn100gr) && + (identical(other.proteinsOn100gr, proteinsOn100gr) || + other.proteinsOn100gr == proteinsOn100gr) && + (identical(other.fatsOn100gr, fatsOn100gr) || + other.fatsOn100gr == fatsOn100gr) && + (identical(other.carbohydratesOn100gr, carbohydratesOn100gr) || + other.carbohydratesOn100gr == carbohydratesOn100gr) && + (identical(other.portionMassGr, portionMassGr) || + other.portionMassGr == portionMassGr) && + (identical(other.energyOnPortion, energyOnPortion) || + other.energyOnPortion == energyOnPortion) && + (identical(other.proteinsOnPortion, proteinsOnPortion) || + other.proteinsOnPortion == proteinsOnPortion) && + (identical(other.fatsOnPortion, fatsOnPortion) || + other.fatsOnPortion == fatsOnPortion) && + (identical(other.carbohydratesOnPortion, carbohydratesOnPortion) || + other.carbohydratesOnPortion == carbohydratesOnPortion) && + (identical(other.createdAt, createdAt) || + other.createdAt == createdAt) && + (identical(other.updatedAt, updatedAt) || + other.updatedAt == updatedAt) && + (identical(other.lastState, lastState) || + other.lastState == lastState) && + (identical(other.reqjectReason, reqjectReason) || + other.reqjectReason == reqjectReason)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hashAll([ + runtimeType, + id, + name, + image, + productGroupId, + description, + formulations, + energyOn100gr, + proteinsOn100gr, + fatsOn100gr, + carbohydratesOn100gr, + portionMassGr, + energyOnPortion, + proteinsOnPortion, + fatsOnPortion, + carbohydratesOnPortion, + createdAt, + updatedAt, + lastState, + reqjectReason + ]); + + @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, + required final String image, + required final int productGroupId, + required final String description, + required final String formulations, + required final int energyOn100gr, + required final double proteinsOn100gr, + required final double fatsOn100gr, + required final double carbohydratesOn100gr, + required final int portionMassGr, + required final int energyOnPortion, + required final int proteinsOnPortion, + required final int fatsOnPortion, + required final int carbohydratesOnPortion, + required final String createdAt, + required final String updatedAt, + required final String lastState, + final String? reqjectReason}) = _$ProductImpl; + + factory _Product.fromJson(Map json) = _$ProductImpl.fromJson; + + @override + int get id; + @override + String get name; + @override + String get image; + @override + int get productGroupId; + @override + String get description; + @override + String get formulations; + @override + int get energyOn100gr; + @override + double get proteinsOn100gr; + @override + double get fatsOn100gr; + @override + double get carbohydratesOn100gr; + @override + int get portionMassGr; + @override + int get energyOnPortion; + @override + int get proteinsOnPortion; + @override + int get fatsOnPortion; + @override + int get carbohydratesOnPortion; + @override + String get createdAt; + @override + String get updatedAt; + @override + String get lastState; + @override + String? get reqjectReason; + @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..566a7b46 --- /dev/null +++ b/lib/features/diary/models/product.g.dart @@ -0,0 +1,53 @@ +// 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, + image: json['image'] as String, + productGroupId: (json['productGroupId'] as num).toInt(), + description: json['description'] as String, + formulations: json['formulations'] as String, + energyOn100gr: (json['energyOn100gr'] as num).toInt(), + proteinsOn100gr: (json['proteinsOn100gr'] as num).toDouble(), + fatsOn100gr: (json['fatsOn100gr'] as num).toDouble(), + carbohydratesOn100gr: (json['carbohydratesOn100gr'] as num).toDouble(), + portionMassGr: (json['portionMassGr'] as num).toInt(), + energyOnPortion: (json['energyOnPortion'] as num).toInt(), + proteinsOnPortion: (json['proteinsOnPortion'] as num).toInt(), + fatsOnPortion: (json['fatsOnPortion'] as num).toInt(), + carbohydratesOnPortion: (json['carbohydratesOnPortion'] as num).toInt(), + createdAt: json['createdAt'] as String, + updatedAt: json['updatedAt'] as String, + lastState: json['lastState'] as String, + reqjectReason: json['reqjectReason'] as String?, + ); + +Map _$$ProductImplToJson(_$ProductImpl instance) => + { + 'id': instance.id, + 'name': instance.name, + 'image': instance.image, + 'productGroupId': instance.productGroupId, + 'description': instance.description, + 'formulations': instance.formulations, + 'energyOn100gr': instance.energyOn100gr, + 'proteinsOn100gr': instance.proteinsOn100gr, + 'fatsOn100gr': instance.fatsOn100gr, + 'carbohydratesOn100gr': instance.carbohydratesOn100gr, + 'portionMassGr': instance.portionMassGr, + 'energyOnPortion': instance.energyOnPortion, + 'proteinsOnPortion': instance.proteinsOnPortion, + 'fatsOnPortion': instance.fatsOnPortion, + 'carbohydratesOnPortion': instance.carbohydratesOnPortion, + 'createdAt': instance.createdAt, + 'updatedAt': instance.updatedAt, + 'lastState': instance.lastState, + 'reqjectReason': instance.reqjectReason, + }; diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 3bd4a6e2..4df22dff 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -1,6 +1,7 @@ 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'; @@ -18,7 +19,8 @@ part 'diary_event.dart'; class DiaryBloc extends Bloc { final DiaryRepository diaryRepository; - DiaryBloc({required this.diaryRepository}) : super(const DiaryState.loading()) { + DiaryBloc({required this.diaryRepository}) + : super(const DiaryState.loading()) { on(loadDiary); on(_changeSatiety); // пользователь нажимает на шкалу сытости on(_changeMood); // пользователь нажимает на шкалу настроения @@ -57,7 +59,10 @@ class DiaryBloc extends Bloc { 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")]; + List portionList = [ + SelectionPopupModel(title: "gr"), + SelectionPopupModel(title: "pcs") + ]; List mealList = [ SelectionPopupModel(title: "Прием пищи 1", id: 1), SelectionPopupModel(title: "Прием пищи 2", id: 2), @@ -114,14 +119,22 @@ class DiaryBloc extends Bloc { if (responseChart.statusCode == 200) { final responseBody = jsonDecode(responseChart.body); - final recommendedChartValues = responseBody['dailyNutritionRecommendation'].values.map((value) => convertToInt(value)).toList(); + final recommendedChartValues = + responseBody['dailyNutritionRecommendation'] + .values + .map((value) => convertToInt(value)) + .toList(); - final consumedChartValues = responseBody['dailyNutritionIntake'].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: 'Ошибка при декодировании данных КБЖУ')); + emit(DiaryStateError( + errorMessage: 'Ошибка при декодировании данных КБЖУ')); print('fail'); return [[], []]; // Return empty lists instead of -1 } @@ -148,8 +161,10 @@ class DiaryBloc extends Bloc { ) 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); + var updatedState = + currentState.copyWith(selectedSatiety: event.selectedElement); + diaryRepository.changeSatiety(event.selectedElement, + currentState.currentMeal.id, currentState.diary.id); emit(updatedState); } } @@ -160,9 +175,11 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var updatedState = currentState.copyWith(selectedMood: event.selectedElement); + var updatedState = + currentState.copyWith(selectedMood: event.selectedElement); - diaryRepository.changeMood(event.selectedElement, currentState.currentMeal.id, currentState.diary.id); + diaryRepository.changeMood(event.selectedElement, + currentState.currentMeal.id, currentState.diary.id); emit(updatedState); // Передаем обновленное состояние в emit } @@ -174,9 +191,11 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var updatedState = currentState.copyWith(wakeupController: event.selectedTime); + 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)); + final String wakeupString = formatter.format(DateTime( + 2022, 1, 1, event.selectedTime.hour, event.selectedTime.minute)); await diaryRepository.changeWakeup( currentState.diary.id, wakeupString, @@ -191,9 +210,11 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var updatedState = currentState.copyWith(retireController: event.selectedTime); + 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)); + final String retireString = formatter.format(DateTime( + 2022, 1, 1, event.selectedTime.hour, event.selectedTime.minute)); await diaryRepository.changeRetire( currentState.diary.id, retireString, @@ -219,7 +240,8 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { final currentState = state as DiaryStateLoaded; - final Meal meal = currentState.diary.meals.firstWhere((meal) => meal.type == event.value.id); + final Meal meal = currentState.diary.meals + .firstWhere((meal) => meal.type == event.value.id); DiaryStateLoaded updatedState = currentState.copyWith( currentMeal: meal, portions: meal.portions, @@ -239,8 +261,9 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - final productNutritionalValues = await diaryRepository.inputProduct(event.input); - + final Map> productNutritionalValues = + await diaryRepository.inputProduct(event.input); + print(productNutritionalValues); // Create a new controller with the input text and update the autocomplete list /*var updatedState = currentState.copyWith( productNameController: TextEditingController(text: event.input), @@ -309,52 +332,18 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var response = await sendPortionData( - currentState.productNameController.text, - currentState.portionController.id == 0 ? 'pcs' : 'gr', - int.parse(currentState.productQuantityController.text), - currentState.currentMeal.id, + await diaryRepository.addPortion( currentState.diary.id, + currentState.currentMeal.id, + currentState.productNameController.text, + currentState.portionController.value, + int.parse(currentState.productQuantityController.text), ); - 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}', - ); - } + emit(currentState.copyWith(isAdded: true)); } } - FutureOr sendPortionData( - String? name, - String portion, - int? quantity, - int? mealID, - int diaryID, - ) async { - String url = '${dotenv.env['SERVER_ROOT']!}/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', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - Future _removePortion( RemovePortionEvent event, Emitter emit, @@ -362,7 +351,8 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - int? mealId = currentState.currentMeal.id; // Rename id to mealId for clarity + int? mealId = + currentState.currentMeal.id; // Rename id to mealId for clarity var response = await sendRemovePortion( event.portionId, @@ -385,7 +375,8 @@ class DiaryBloc extends Bloc { int? mealID, int diaryID, ) async { - String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; + String url = + '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; var response = await http.delete( Uri.parse(url), @@ -428,7 +419,8 @@ class DiaryBloc extends Bloc { int? mealID, int diaryID, ) async { - String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/photo/delete'; + String url = + '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/photo/delete'; final Map credentials = { 'id': photoID, 'path': path, @@ -469,8 +461,10 @@ class DiaryBloc extends Bloc { 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 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, @@ -514,7 +508,8 @@ class DiaryBloc extends Bloc { int diaryID, int mealId, ) async { - String url = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload'; + String url = + '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload'; var request = http.MultipartRequest('POST', Uri.parse(url)); diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 57aa1426..12268fb7 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,4 +1,5 @@ import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; import 'package:eatvio_app/features/diary/services/diary_service.dart'; class DiaryRepository { @@ -22,9 +23,9 @@ class DiaryRepository { } } - Future inputProduct(String name) async { + Future>> inputProduct(String name) async { try { - return await diaryService.sendInputProduct(name); + return await diaryService.getInputProduct(name); } catch (e) { rethrow; } @@ -81,4 +82,40 @@ class DiaryRepository { rethrow; } } + + Future addPortion( + int diaryID, + int mealID, + String name, + String product, + int quantity, + ) async { + try { + await diaryService.sendPortionData( + diaryID, + mealID, + name, + product, + quantity, + ); + } catch (e) { + rethrow; + } + } + + Future removePortion( + int diaryID, + int mealID, + int portionID, + ) async { + try { + await diaryService.sendRemovePortionData( + diaryID, + mealID, + portionID, + ); + } catch (e) { + rethrow; + } + } } diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index 01b6b93a..3ec5a5be 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,5 +1,6 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/features/diary/models/diary_model.dart'; +import 'package:eatvio_app/features/diary/models/product.dart'; import 'package:retrofit/retrofit.dart'; part 'diary_service.g.dart'; @@ -17,8 +18,9 @@ abstract class DiaryService { @GET('/diary/{id}/dailyNutritionData/') Future getChart(@Path() String id); - @GET('/diary/product_nutritional_values/filter?{name}') - Future sendInputProduct(@Path() String name); + @GET('/diary/product_nutritional_values/filter') + Future>> getInputProduct( + @Query('name') String name); @POST('/diary/{diary_id}/meal/{meal_id}/satiety/fill') Future> sendSatietyData( @@ -41,8 +43,24 @@ abstract class DiaryService { ); @POST('/diary/{diary_id}/retire/fill') - Future sendRetire( + 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}/portions/{portion_id}/delete') + Future> sendRemovePortionData( + @Path() int diary_id, + @Path() int meal_id, + @Path() int portion_id, + ); } diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index e0bff56f..80461b5e 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -24,22 +24,23 @@ class _DiaryService implements DiaryService { final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType>(Options( + 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, - )))); + .compose( + _dio.options, + '/diary/index', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); final _value = _result.data!.cast(); return _value; } @@ -50,23 +51,25 @@ class _DiaryService implements DiaryService { final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType>(Options( + 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))); + .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; } @@ -76,49 +79,55 @@ class _DiaryService implements DiaryService { final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType(Options( + 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, - )))); + .compose( + _dio.options, + '/diary/${id}/dailyNutritionData/', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); final _value = DiaryModel.fromJson(_result.data!); return _value; } @override - Future sendInputProduct(String name) async { + Future>> getInputProduct(String name) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = {r'name': name}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType(Options( + final _result = await _dio.fetch>( + _setStreamType>>(Options( method: 'GET', headers: _headers, extra: _extra, ) - .compose( - _dio.options, - '/diary/product_nutritional_values/filter?${name}', - queryParameters: queryParameters, - data: _data, - ) - .copyWith( - baseUrl: _combineBaseUrls( - _dio.options.baseUrl, - baseUrl, - )))); - final _value = DiaryModel.fromJson(_result.data!); + .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; } @@ -132,22 +141,23 @@ class _DiaryService implements DiaryService { final queryParameters = {r'satiety': satiety}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType>(Options( + 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, - )))); + .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; } @@ -162,22 +172,23 @@ class _DiaryService implements DiaryService { final queryParameters = {r'mood': mood}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType>(Options( + 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, - )))); + .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; } @@ -191,28 +202,29 @@ class _DiaryService implements DiaryService { final queryParameters = {r'wakeup': wakeup}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType(Options( + 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, - )))); + .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 sendRetire( + Future sendRetireData( int diary_id, String retire, ) async { @@ -220,28 +232,99 @@ class _DiaryService implements DiaryService { final queryParameters = {r'retire': retire}; final _headers = {}; const Map? _data = null; - final _result = await _dio.fetch>(_setStreamType(Options( + 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, - )))); + .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, + )))); + final _value = _result.data!.cast(); + return _value; + } + + @override + Future> sendRemovePortionData( + int diary_id, + int meal_id, + int portion_id, + ) async { + final _extra = {}; + final queryParameters = {}; + 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/${portion_id}/delete', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data!.cast(); + return _value; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { - if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || requestOptions.responseType == ResponseType.stream)) { + if (T != dynamic && + !(requestOptions.responseType == ResponseType.bytes || + requestOptions.responseType == ResponseType.stream)) { if (T == String) { requestOptions.responseType = ResponseType.plain; } else { From dbe8ac09992eeb26b39b0675db24db0523eeed13 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 17 Jul 2024 12:39:31 +0300 Subject: [PATCH 14/19] refactor(diary): API mor produc nutritional and new Product model --- lib/features/diary/presentation/bloc/diary_bloc.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 4df22dff..216131f5 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -259,7 +259,7 @@ class DiaryBloc extends Bloc { Emitter emit, ) async { if (state is DiaryStateLoaded) { - var currentState = state as DiaryStateLoaded; + //var currentState = state as DiaryStateLoaded; final Map> productNutritionalValues = await diaryRepository.inputProduct(event.input); From be461e4183fe196db53fb2a284b112e9440fe4a6 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Fri, 19 Jul 2024 11:55:48 +0300 Subject: [PATCH 15/19] feat(diary): New models for calendar and autocomplete fix --- .../calendar/models/calendar_model.dart | 21 + .../models/calendar_model.freezed.dart | 309 +++++++++ .../calendar/models/calendar_model.g.dart | 31 + .../presentation/bloc/calendar_cubit.dart | 20 + .../presentation/bloc/calendar_state.dart | 19 + .../bloc/calendar_state.freezed.dart | 621 ++++++++++++++++++ .../repositories/calendar_repository.dart | 19 + .../calendar/services/calendar_service.dart | 13 + .../calendar/services/calendar_service.g.dart | 78 +++ lib/features/diary/models/product.dart | 17 - .../diary/models/product.freezed.dart | 400 +---------- lib/features/diary/models/product.g.dart | 34 - .../diary/presentation/bloc/diary_bloc.dart | 2 +- 13 files changed, 1140 insertions(+), 444 deletions(-) create mode 100644 lib/features/calendar/models/calendar_model.dart create mode 100644 lib/features/calendar/models/calendar_model.freezed.dart create mode 100644 lib/features/calendar/models/calendar_model.g.dart create mode 100644 lib/features/calendar/presentation/bloc/calendar_cubit.dart create mode 100644 lib/features/calendar/presentation/bloc/calendar_state.dart create mode 100644 lib/features/calendar/presentation/bloc/calendar_state.freezed.dart create mode 100644 lib/features/calendar/repositories/calendar_repository.dart create mode 100644 lib/features/calendar/services/calendar_service.dart create mode 100644 lib/features/calendar/services/calendar_service.g.dart 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/calendar/services/calendar_service.g.dart b/lib/features/calendar/services/calendar_service.g.dart new file mode 100644 index 00000000..57033789 --- /dev/null +++ b/lib/features/calendar/services/calendar_service.g.dart @@ -0,0 +1,78 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'calendar_service.dart'; + +// ************************************************************************** +// RetrofitGenerator +// ************************************************************************** + +// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element + +class _CalendarService implements CalendarService { + _CalendarService( + this._dio, { + this.baseUrl, + }); + + final Dio _dio; + + String? baseUrl; + + @override + Future> getCalendar() 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, + '/calendar/index', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + var _value = _result.data!.map((k, dynamic v) => + MapEntry(k, CalendarModel.fromJson(v as Map))); + return _value; + } + + 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/features/diary/models/product.dart b/lib/features/diary/models/product.dart index fdac1bf7..a11896d3 100644 --- a/lib/features/diary/models/product.dart +++ b/lib/features/diary/models/product.dart @@ -8,23 +8,6 @@ class Product with _$Product { const factory Product({ required int id, required String name, - required String image, - required int productGroupId, - required String description, - required String formulations, - required int energyOn100gr, - required double proteinsOn100gr, - required double fatsOn100gr, - required double carbohydratesOn100gr, - required int portionMassGr, - required int energyOnPortion, - required int proteinsOnPortion, - required int fatsOnPortion, - required int carbohydratesOnPortion, - required String createdAt, - required String updatedAt, - required String lastState, - String? reqjectReason, }) = _Product; factory Product.fromJson(Map json) => diff --git a/lib/features/diary/models/product.freezed.dart b/lib/features/diary/models/product.freezed.dart index 0b829ebc..d30ada33 100644 --- a/lib/features/diary/models/product.freezed.dart +++ b/lib/features/diary/models/product.freezed.dart @@ -22,23 +22,6 @@ Product _$ProductFromJson(Map json) { mixin _$Product { int get id => throw _privateConstructorUsedError; String get name => throw _privateConstructorUsedError; - String get image => throw _privateConstructorUsedError; - int get productGroupId => throw _privateConstructorUsedError; - String get description => throw _privateConstructorUsedError; - String get formulations => throw _privateConstructorUsedError; - int get energyOn100gr => throw _privateConstructorUsedError; - double get proteinsOn100gr => throw _privateConstructorUsedError; - double get fatsOn100gr => throw _privateConstructorUsedError; - double get carbohydratesOn100gr => throw _privateConstructorUsedError; - int get portionMassGr => throw _privateConstructorUsedError; - int get energyOnPortion => throw _privateConstructorUsedError; - int get proteinsOnPortion => throw _privateConstructorUsedError; - int get fatsOnPortion => throw _privateConstructorUsedError; - int get carbohydratesOnPortion => throw _privateConstructorUsedError; - String get createdAt => throw _privateConstructorUsedError; - String get updatedAt => throw _privateConstructorUsedError; - String get lastState => throw _privateConstructorUsedError; - String? get reqjectReason => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -50,26 +33,7 @@ abstract class $ProductCopyWith<$Res> { factory $ProductCopyWith(Product value, $Res Function(Product) then) = _$ProductCopyWithImpl<$Res, Product>; @useResult - $Res call( - {int id, - String name, - String image, - int productGroupId, - String description, - String formulations, - int energyOn100gr, - double proteinsOn100gr, - double fatsOn100gr, - double carbohydratesOn100gr, - int portionMassGr, - int energyOnPortion, - int proteinsOnPortion, - int fatsOnPortion, - int carbohydratesOnPortion, - String createdAt, - String updatedAt, - String lastState, - String? reqjectReason}); + $Res call({int id, String name}); } /// @nodoc @@ -87,23 +51,6 @@ class _$ProductCopyWithImpl<$Res, $Val extends Product> $Res call({ Object? id = null, Object? name = null, - Object? image = null, - Object? productGroupId = null, - Object? description = null, - Object? formulations = null, - Object? energyOn100gr = null, - Object? proteinsOn100gr = null, - Object? fatsOn100gr = null, - Object? carbohydratesOn100gr = null, - Object? portionMassGr = null, - Object? energyOnPortion = null, - Object? proteinsOnPortion = null, - Object? fatsOnPortion = null, - Object? carbohydratesOnPortion = null, - Object? createdAt = null, - Object? updatedAt = null, - Object? lastState = null, - Object? reqjectReason = freezed, }) { return _then(_value.copyWith( id: null == id @@ -114,74 +61,6 @@ class _$ProductCopyWithImpl<$Res, $Val extends Product> ? _value.name : name // ignore: cast_nullable_to_non_nullable as String, - image: null == image - ? _value.image - : image // ignore: cast_nullable_to_non_nullable - as String, - productGroupId: null == productGroupId - ? _value.productGroupId - : productGroupId // ignore: cast_nullable_to_non_nullable - as int, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - formulations: null == formulations - ? _value.formulations - : formulations // ignore: cast_nullable_to_non_nullable - as String, - energyOn100gr: null == energyOn100gr - ? _value.energyOn100gr - : energyOn100gr // ignore: cast_nullable_to_non_nullable - as int, - proteinsOn100gr: null == proteinsOn100gr - ? _value.proteinsOn100gr - : proteinsOn100gr // ignore: cast_nullable_to_non_nullable - as double, - fatsOn100gr: null == fatsOn100gr - ? _value.fatsOn100gr - : fatsOn100gr // ignore: cast_nullable_to_non_nullable - as double, - carbohydratesOn100gr: null == carbohydratesOn100gr - ? _value.carbohydratesOn100gr - : carbohydratesOn100gr // ignore: cast_nullable_to_non_nullable - as double, - portionMassGr: null == portionMassGr - ? _value.portionMassGr - : portionMassGr // ignore: cast_nullable_to_non_nullable - as int, - energyOnPortion: null == energyOnPortion - ? _value.energyOnPortion - : energyOnPortion // ignore: cast_nullable_to_non_nullable - as int, - proteinsOnPortion: null == proteinsOnPortion - ? _value.proteinsOnPortion - : proteinsOnPortion // ignore: cast_nullable_to_non_nullable - as int, - fatsOnPortion: null == fatsOnPortion - ? _value.fatsOnPortion - : fatsOnPortion // ignore: cast_nullable_to_non_nullable - as int, - carbohydratesOnPortion: null == carbohydratesOnPortion - ? _value.carbohydratesOnPortion - : carbohydratesOnPortion // ignore: cast_nullable_to_non_nullable - as int, - createdAt: null == createdAt - ? _value.createdAt - : createdAt // ignore: cast_nullable_to_non_nullable - as String, - updatedAt: null == updatedAt - ? _value.updatedAt - : updatedAt // ignore: cast_nullable_to_non_nullable - as String, - lastState: null == lastState - ? _value.lastState - : lastState // ignore: cast_nullable_to_non_nullable - as String, - reqjectReason: freezed == reqjectReason - ? _value.reqjectReason - : reqjectReason // ignore: cast_nullable_to_non_nullable - as String?, ) as $Val); } } @@ -193,26 +72,7 @@ abstract class _$$ProductImplCopyWith<$Res> implements $ProductCopyWith<$Res> { __$$ProductImplCopyWithImpl<$Res>; @override @useResult - $Res call( - {int id, - String name, - String image, - int productGroupId, - String description, - String formulations, - int energyOn100gr, - double proteinsOn100gr, - double fatsOn100gr, - double carbohydratesOn100gr, - int portionMassGr, - int energyOnPortion, - int proteinsOnPortion, - int fatsOnPortion, - int carbohydratesOnPortion, - String createdAt, - String updatedAt, - String lastState, - String? reqjectReason}); + $Res call({int id, String name}); } /// @nodoc @@ -228,23 +88,6 @@ class __$$ProductImplCopyWithImpl<$Res> $Res call({ Object? id = null, Object? name = null, - Object? image = null, - Object? productGroupId = null, - Object? description = null, - Object? formulations = null, - Object? energyOn100gr = null, - Object? proteinsOn100gr = null, - Object? fatsOn100gr = null, - Object? carbohydratesOn100gr = null, - Object? portionMassGr = null, - Object? energyOnPortion = null, - Object? proteinsOnPortion = null, - Object? fatsOnPortion = null, - Object? carbohydratesOnPortion = null, - Object? createdAt = null, - Object? updatedAt = null, - Object? lastState = null, - Object? reqjectReason = freezed, }) { return _then(_$ProductImpl( id: null == id @@ -255,74 +98,6 @@ class __$$ProductImplCopyWithImpl<$Res> ? _value.name : name // ignore: cast_nullable_to_non_nullable as String, - image: null == image - ? _value.image - : image // ignore: cast_nullable_to_non_nullable - as String, - productGroupId: null == productGroupId - ? _value.productGroupId - : productGroupId // ignore: cast_nullable_to_non_nullable - as int, - description: null == description - ? _value.description - : description // ignore: cast_nullable_to_non_nullable - as String, - formulations: null == formulations - ? _value.formulations - : formulations // ignore: cast_nullable_to_non_nullable - as String, - energyOn100gr: null == energyOn100gr - ? _value.energyOn100gr - : energyOn100gr // ignore: cast_nullable_to_non_nullable - as int, - proteinsOn100gr: null == proteinsOn100gr - ? _value.proteinsOn100gr - : proteinsOn100gr // ignore: cast_nullable_to_non_nullable - as double, - fatsOn100gr: null == fatsOn100gr - ? _value.fatsOn100gr - : fatsOn100gr // ignore: cast_nullable_to_non_nullable - as double, - carbohydratesOn100gr: null == carbohydratesOn100gr - ? _value.carbohydratesOn100gr - : carbohydratesOn100gr // ignore: cast_nullable_to_non_nullable - as double, - portionMassGr: null == portionMassGr - ? _value.portionMassGr - : portionMassGr // ignore: cast_nullable_to_non_nullable - as int, - energyOnPortion: null == energyOnPortion - ? _value.energyOnPortion - : energyOnPortion // ignore: cast_nullable_to_non_nullable - as int, - proteinsOnPortion: null == proteinsOnPortion - ? _value.proteinsOnPortion - : proteinsOnPortion // ignore: cast_nullable_to_non_nullable - as int, - fatsOnPortion: null == fatsOnPortion - ? _value.fatsOnPortion - : fatsOnPortion // ignore: cast_nullable_to_non_nullable - as int, - carbohydratesOnPortion: null == carbohydratesOnPortion - ? _value.carbohydratesOnPortion - : carbohydratesOnPortion // ignore: cast_nullable_to_non_nullable - as int, - createdAt: null == createdAt - ? _value.createdAt - : createdAt // ignore: cast_nullable_to_non_nullable - as String, - updatedAt: null == updatedAt - ? _value.updatedAt - : updatedAt // ignore: cast_nullable_to_non_nullable - as String, - lastState: null == lastState - ? _value.lastState - : lastState // ignore: cast_nullable_to_non_nullable - as String, - reqjectReason: freezed == reqjectReason - ? _value.reqjectReason - : reqjectReason // ignore: cast_nullable_to_non_nullable - as String?, )); } } @@ -330,26 +105,7 @@ class __$$ProductImplCopyWithImpl<$Res> /// @nodoc @JsonSerializable() class _$ProductImpl implements _Product { - const _$ProductImpl( - {required this.id, - required this.name, - required this.image, - required this.productGroupId, - required this.description, - required this.formulations, - required this.energyOn100gr, - required this.proteinsOn100gr, - required this.fatsOn100gr, - required this.carbohydratesOn100gr, - required this.portionMassGr, - required this.energyOnPortion, - required this.proteinsOnPortion, - required this.fatsOnPortion, - required this.carbohydratesOnPortion, - required this.createdAt, - required this.updatedAt, - required this.lastState, - this.reqjectReason}); + const _$ProductImpl({required this.id, required this.name}); factory _$ProductImpl.fromJson(Map json) => _$$ProductImplFromJson(json); @@ -358,44 +114,10 @@ class _$ProductImpl implements _Product { final int id; @override final String name; - @override - final String image; - @override - final int productGroupId; - @override - final String description; - @override - final String formulations; - @override - final int energyOn100gr; - @override - final double proteinsOn100gr; - @override - final double fatsOn100gr; - @override - final double carbohydratesOn100gr; - @override - final int portionMassGr; - @override - final int energyOnPortion; - @override - final int proteinsOnPortion; - @override - final int fatsOnPortion; - @override - final int carbohydratesOnPortion; - @override - final String createdAt; - @override - final String updatedAt; - @override - final String lastState; - @override - final String? reqjectReason; @override String toString() { - return 'Product(id: $id, name: $name, image: $image, productGroupId: $productGroupId, description: $description, formulations: $formulations, energyOn100gr: $energyOn100gr, proteinsOn100gr: $proteinsOn100gr, fatsOn100gr: $fatsOn100gr, carbohydratesOn100gr: $carbohydratesOn100gr, portionMassGr: $portionMassGr, energyOnPortion: $energyOnPortion, proteinsOnPortion: $proteinsOnPortion, fatsOnPortion: $fatsOnPortion, carbohydratesOnPortion: $carbohydratesOnPortion, createdAt: $createdAt, updatedAt: $updatedAt, lastState: $lastState, reqjectReason: $reqjectReason)'; + return 'Product(id: $id, name: $name)'; } @override @@ -404,66 +126,12 @@ class _$ProductImpl implements _Product { (other.runtimeType == runtimeType && other is _$ProductImpl && (identical(other.id, id) || other.id == id) && - (identical(other.name, name) || other.name == name) && - (identical(other.image, image) || other.image == image) && - (identical(other.productGroupId, productGroupId) || - other.productGroupId == productGroupId) && - (identical(other.description, description) || - other.description == description) && - (identical(other.formulations, formulations) || - other.formulations == formulations) && - (identical(other.energyOn100gr, energyOn100gr) || - other.energyOn100gr == energyOn100gr) && - (identical(other.proteinsOn100gr, proteinsOn100gr) || - other.proteinsOn100gr == proteinsOn100gr) && - (identical(other.fatsOn100gr, fatsOn100gr) || - other.fatsOn100gr == fatsOn100gr) && - (identical(other.carbohydratesOn100gr, carbohydratesOn100gr) || - other.carbohydratesOn100gr == carbohydratesOn100gr) && - (identical(other.portionMassGr, portionMassGr) || - other.portionMassGr == portionMassGr) && - (identical(other.energyOnPortion, energyOnPortion) || - other.energyOnPortion == energyOnPortion) && - (identical(other.proteinsOnPortion, proteinsOnPortion) || - other.proteinsOnPortion == proteinsOnPortion) && - (identical(other.fatsOnPortion, fatsOnPortion) || - other.fatsOnPortion == fatsOnPortion) && - (identical(other.carbohydratesOnPortion, carbohydratesOnPortion) || - other.carbohydratesOnPortion == carbohydratesOnPortion) && - (identical(other.createdAt, createdAt) || - other.createdAt == createdAt) && - (identical(other.updatedAt, updatedAt) || - other.updatedAt == updatedAt) && - (identical(other.lastState, lastState) || - other.lastState == lastState) && - (identical(other.reqjectReason, reqjectReason) || - other.reqjectReason == reqjectReason)); + (identical(other.name, name) || other.name == name)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hashAll([ - runtimeType, - id, - name, - image, - productGroupId, - description, - formulations, - energyOn100gr, - proteinsOn100gr, - fatsOn100gr, - carbohydratesOn100gr, - portionMassGr, - energyOnPortion, - proteinsOnPortion, - fatsOnPortion, - carbohydratesOnPortion, - createdAt, - updatedAt, - lastState, - reqjectReason - ]); + int get hashCode => Object.hash(runtimeType, id, name); @JsonKey(ignore: true) @override @@ -480,26 +148,8 @@ class _$ProductImpl implements _Product { } abstract class _Product implements Product { - const factory _Product( - {required final int id, - required final String name, - required final String image, - required final int productGroupId, - required final String description, - required final String formulations, - required final int energyOn100gr, - required final double proteinsOn100gr, - required final double fatsOn100gr, - required final double carbohydratesOn100gr, - required final int portionMassGr, - required final int energyOnPortion, - required final int proteinsOnPortion, - required final int fatsOnPortion, - required final int carbohydratesOnPortion, - required final String createdAt, - required final String updatedAt, - required final String lastState, - final String? reqjectReason}) = _$ProductImpl; + const factory _Product({required final int id, required final String name}) = + _$ProductImpl; factory _Product.fromJson(Map json) = _$ProductImpl.fromJson; @@ -508,40 +158,6 @@ abstract class _Product implements Product { @override String get name; @override - String get image; - @override - int get productGroupId; - @override - String get description; - @override - String get formulations; - @override - int get energyOn100gr; - @override - double get proteinsOn100gr; - @override - double get fatsOn100gr; - @override - double get carbohydratesOn100gr; - @override - int get portionMassGr; - @override - int get energyOnPortion; - @override - int get proteinsOnPortion; - @override - int get fatsOnPortion; - @override - int get carbohydratesOnPortion; - @override - String get createdAt; - @override - String get updatedAt; - @override - String get lastState; - @override - String? get reqjectReason; - @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 index 566a7b46..74331101 100644 --- a/lib/features/diary/models/product.g.dart +++ b/lib/features/diary/models/product.g.dart @@ -10,44 +10,10 @@ _$ProductImpl _$$ProductImplFromJson(Map json) => _$ProductImpl( id: (json['id'] as num).toInt(), name: json['name'] as String, - image: json['image'] as String, - productGroupId: (json['productGroupId'] as num).toInt(), - description: json['description'] as String, - formulations: json['formulations'] as String, - energyOn100gr: (json['energyOn100gr'] as num).toInt(), - proteinsOn100gr: (json['proteinsOn100gr'] as num).toDouble(), - fatsOn100gr: (json['fatsOn100gr'] as num).toDouble(), - carbohydratesOn100gr: (json['carbohydratesOn100gr'] as num).toDouble(), - portionMassGr: (json['portionMassGr'] as num).toInt(), - energyOnPortion: (json['energyOnPortion'] as num).toInt(), - proteinsOnPortion: (json['proteinsOnPortion'] as num).toInt(), - fatsOnPortion: (json['fatsOnPortion'] as num).toInt(), - carbohydratesOnPortion: (json['carbohydratesOnPortion'] as num).toInt(), - createdAt: json['createdAt'] as String, - updatedAt: json['updatedAt'] as String, - lastState: json['lastState'] as String, - reqjectReason: json['reqjectReason'] as String?, ); Map _$$ProductImplToJson(_$ProductImpl instance) => { 'id': instance.id, 'name': instance.name, - 'image': instance.image, - 'productGroupId': instance.productGroupId, - 'description': instance.description, - 'formulations': instance.formulations, - 'energyOn100gr': instance.energyOn100gr, - 'proteinsOn100gr': instance.proteinsOn100gr, - 'fatsOn100gr': instance.fatsOn100gr, - 'carbohydratesOn100gr': instance.carbohydratesOn100gr, - 'portionMassGr': instance.portionMassGr, - 'energyOnPortion': instance.energyOnPortion, - 'proteinsOnPortion': instance.proteinsOnPortion, - 'fatsOnPortion': instance.fatsOnPortion, - 'carbohydratesOnPortion': instance.carbohydratesOnPortion, - 'createdAt': instance.createdAt, - 'updatedAt': instance.updatedAt, - 'lastState': instance.lastState, - 'reqjectReason': instance.reqjectReason, }; diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 216131f5..faaac8af 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -261,9 +261,9 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { //var currentState = state as DiaryStateLoaded; + print(await diaryRepository.inputProduct(event.input)); final Map> productNutritionalValues = await diaryRepository.inputProduct(event.input); - print(productNutritionalValues); // Create a new controller with the input text and update the autocomplete list /*var updatedState = currentState.copyWith( productNameController: TextEditingController(text: event.input), From 7535e824221bbd64ee8883d28016d4468aee2afe Mon Sep 17 00:00:00 2001 From: maxxkim Date: Fri, 19 Jul 2024 15:51:39 +0300 Subject: [PATCH 16/19] fix(diary): Remove portion API call fixed --- lib/features/diary/models/portion.dart | 2 +- .../diary/models/portion.freezed.dart | 38 ++--- lib/features/diary/models/portion.g.dart | 4 +- .../diary/presentation/bloc/diary_bloc.dart | 70 +++------ .../diary/presentation/bloc/diary_state.dart | 5 +- .../bloc/diary_state.freezed.dart | 146 +++++++++--------- .../presentation/pages/diary_screen.dart | 91 +++++++---- .../diary/repositories/diary_repository.dart | 9 +- .../diary/services/diary_service.dart | 7 +- .../diary/services/diary_service.g.dart | 40 +++-- 10 files changed, 217 insertions(+), 195 deletions(-) diff --git a/lib/features/diary/models/portion.dart b/lib/features/diary/models/portion.dart index 9712d9b3..ec4ab1de 100644 --- a/lib/features/diary/models/portion.dart +++ b/lib/features/diary/models/portion.dart @@ -7,7 +7,7 @@ part 'portion.g.dart'; class Portion with _$Portion { const factory Portion({ required int id, - required String productName, + required String product_name, required int quantity, required String portion, }) = _Portion; diff --git a/lib/features/diary/models/portion.freezed.dart b/lib/features/diary/models/portion.freezed.dart index ab792133..a7a35a29 100644 --- a/lib/features/diary/models/portion.freezed.dart +++ b/lib/features/diary/models/portion.freezed.dart @@ -21,7 +21,7 @@ Portion _$PortionFromJson(Map json) { /// @nodoc mixin _$Portion { int get id => throw _privateConstructorUsedError; - String get productName => throw _privateConstructorUsedError; + String get product_name => throw _privateConstructorUsedError; int get quantity => throw _privateConstructorUsedError; String get portion => throw _privateConstructorUsedError; @@ -35,7 +35,7 @@ abstract class $PortionCopyWith<$Res> { factory $PortionCopyWith(Portion value, $Res Function(Portion) then) = _$PortionCopyWithImpl<$Res, Portion>; @useResult - $Res call({int id, String productName, int quantity, String portion}); + $Res call({int id, String product_name, int quantity, String portion}); } /// @nodoc @@ -52,7 +52,7 @@ class _$PortionCopyWithImpl<$Res, $Val extends Portion> @override $Res call({ Object? id = null, - Object? productName = null, + Object? product_name = null, Object? quantity = null, Object? portion = null, }) { @@ -61,9 +61,9 @@ class _$PortionCopyWithImpl<$Res, $Val extends Portion> ? _value.id : id // ignore: cast_nullable_to_non_nullable as int, - productName: null == productName - ? _value.productName - : productName // ignore: cast_nullable_to_non_nullable + product_name: null == product_name + ? _value.product_name + : product_name // ignore: cast_nullable_to_non_nullable as String, quantity: null == quantity ? _value.quantity @@ -84,7 +84,7 @@ abstract class _$$PortionImplCopyWith<$Res> implements $PortionCopyWith<$Res> { __$$PortionImplCopyWithImpl<$Res>; @override @useResult - $Res call({int id, String productName, int quantity, String portion}); + $Res call({int id, String product_name, int quantity, String portion}); } /// @nodoc @@ -99,7 +99,7 @@ class __$$PortionImplCopyWithImpl<$Res> @override $Res call({ Object? id = null, - Object? productName = null, + Object? product_name = null, Object? quantity = null, Object? portion = null, }) { @@ -108,9 +108,9 @@ class __$$PortionImplCopyWithImpl<$Res> ? _value.id : id // ignore: cast_nullable_to_non_nullable as int, - productName: null == productName - ? _value.productName - : productName // ignore: cast_nullable_to_non_nullable + product_name: null == product_name + ? _value.product_name + : product_name // ignore: cast_nullable_to_non_nullable as String, quantity: null == quantity ? _value.quantity @@ -129,7 +129,7 @@ class __$$PortionImplCopyWithImpl<$Res> class _$PortionImpl implements _Portion { const _$PortionImpl( {required this.id, - required this.productName, + required this.product_name, required this.quantity, required this.portion}); @@ -139,7 +139,7 @@ class _$PortionImpl implements _Portion { @override final int id; @override - final String productName; + final String product_name; @override final int quantity; @override @@ -147,7 +147,7 @@ class _$PortionImpl implements _Portion { @override String toString() { - return 'Portion(id: $id, productName: $productName, quantity: $quantity, portion: $portion)'; + return 'Portion(id: $id, product_name: $product_name, quantity: $quantity, portion: $portion)'; } @override @@ -156,8 +156,8 @@ class _$PortionImpl implements _Portion { (other.runtimeType == runtimeType && other is _$PortionImpl && (identical(other.id, id) || other.id == id) && - (identical(other.productName, productName) || - other.productName == productName) && + (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)); @@ -166,7 +166,7 @@ class _$PortionImpl implements _Portion { @JsonKey(ignore: true) @override int get hashCode => - Object.hash(runtimeType, id, productName, quantity, portion); + Object.hash(runtimeType, id, product_name, quantity, portion); @JsonKey(ignore: true) @override @@ -185,7 +185,7 @@ class _$PortionImpl implements _Portion { abstract class _Portion implements Portion { const factory _Portion( {required final int id, - required final String productName, + required final String product_name, required final int quantity, required final String portion}) = _$PortionImpl; @@ -194,7 +194,7 @@ abstract class _Portion implements Portion { @override int get id; @override - String get productName; + String get product_name; @override int get quantity; @override diff --git a/lib/features/diary/models/portion.g.dart b/lib/features/diary/models/portion.g.dart index aae21620..c8bd109f 100644 --- a/lib/features/diary/models/portion.g.dart +++ b/lib/features/diary/models/portion.g.dart @@ -9,7 +9,7 @@ part of 'portion.dart'; _$PortionImpl _$$PortionImplFromJson(Map json) => _$PortionImpl( id: (json['id'] as num).toInt(), - productName: json['productName'] as String, + product_name: json['product_name'] as String, quantity: (json['quantity'] as num).toInt(), portion: json['portion'] as String, ); @@ -17,7 +17,7 @@ _$PortionImpl _$$PortionImplFromJson(Map json) => Map _$$PortionImplToJson(_$PortionImpl instance) => { 'id': instance.id, - 'productName': instance.productName, + 'product_name': instance.product_name, 'quantity': instance.quantity, 'portion': instance.portion, }; diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index faaac8af..37abfdca 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -1,6 +1,7 @@ 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/portion.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'; @@ -82,7 +83,7 @@ class DiaryBloc extends Bloc { selectedMood: currentMeal.mood, selectedSatiety: currentMeal.satiety, commentController: TextEditingController(), - productNameController: TextEditingController(), + product_nameController: TextEditingController(), productQuantityController: TextEditingController(), caloriesController: TextEditingController(), fatsController: TextEditingController(), @@ -259,15 +260,14 @@ class DiaryBloc extends Bloc { Emitter emit, ) async { if (state is DiaryStateLoaded) { - //var currentState = state as DiaryStateLoaded; + var currentState = state as DiaryStateLoaded; - print(await diaryRepository.inputProduct(event.input)); final Map> productNutritionalValues = await diaryRepository.inputProduct(event.input); - // 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(), + 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); @@ -275,7 +275,7 @@ class DiaryBloc extends Bloc { updatedState = updatedState.copyWith(moderationExpanded: false); } - emit(updatedState); */ + emit(updatedState); } } @@ -331,16 +331,25 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; + print(currentState.diary.id); + print(currentState.currentMeal.id); + print(currentState.product_nameController.text); + print(currentState.portionController.title); + print(currentState.productQuantityController.text); - await diaryRepository.addPortion( + Map data = await diaryRepository.addPortion( currentState.diary.id, currentState.currentMeal.id, - currentState.productNameController.text, - currentState.portionController.value, + currentState.product_nameController.text, + currentState.portionController.title, int.parse(currentState.productQuantityController.text), ); + List newPortions = currentState.portions; - emit(currentState.copyWith(isAdded: true)); + final Portion newPortion = data['portion'] ?? + new Portion(id: 1, portion: 'gr', product_name: '1', quantity: 1); + newPortions.add(newPortion); + emit(currentState.copyWith(isAdded: true, portions: newPortions)); } } @@ -350,45 +359,14 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - - int? mealId = - currentState.currentMeal.id; // Rename id to mealId for clarity - - var response = await sendRemovePortion( - event.portionId, - mealId, + await diaryRepository.removePortion( currentState.diary.id, + currentState.currentMeal.id, + event.portionId, ); - - if (response.statusCode == 204) { - await reloadScreen(event, emit); - } else { - print( - 'Failed to add portion. Status Code: ${response.statusCode} ${response.body}', - ); - } } } - Future sendRemovePortion( - int? portionID, - int? mealID, - int diaryID, - ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealID/portions/$portionID/delete'; - - var response = await http.delete( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - encoding: utf8, - ); - - return response; - } - FutureOr _removeImage( RemoveImageEvent event, Emitter emit, diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index fa490162..57b3768a 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -2,6 +2,7 @@ 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:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; @@ -18,20 +19,20 @@ abstract class DiaryState with _$DiaryState { const factory DiaryState.loaded({ required DiaryModel diary, String? diaryDate, - required List autocompleteList, required List recommendedChartValues, required List consumedChartValues, required List portions, required List photos, 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 productNameController, + required TextEditingController product_nameController, required TextEditingController productQuantityController, required TextEditingController caloriesController, required TextEditingController fatsController, diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 2ecc30d9..981a027d 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -23,20 +23,20 @@ mixin _$DiaryState { required TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -60,20 +60,20 @@ mixin _$DiaryState { TResult? Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -97,20 +97,20 @@ mixin _$DiaryState { TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -216,20 +216,20 @@ class _$DiaryStateImpl implements _DiaryState { required TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -256,20 +256,20 @@ class _$DiaryStateImpl implements _DiaryState { TResult? Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -296,20 +296,20 @@ class _$DiaryStateImpl implements _DiaryState { TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -417,20 +417,20 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { required TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -457,20 +457,20 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult? Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -497,20 +497,20 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -584,20 +584,20 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { $Res call( {DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -628,20 +628,20 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> $Res call({ Object? diary = null, Object? diaryDate = freezed, - Object? autocompleteList = null, Object? recommendedChartValues = null, Object? consumedChartValues = null, Object? portions = null, Object? photos = 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? productNameController = null, + Object? product_nameController = null, Object? productQuantityController = null, Object? caloriesController = null, Object? fatsController = null, @@ -664,10 +664,6 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value.diaryDate : diaryDate // ignore: cast_nullable_to_non_nullable as String?, - autocompleteList: null == autocompleteList - ? _value._autocompleteList - : autocompleteList // ignore: cast_nullable_to_non_nullable - as List, recommendedChartValues: null == recommendedChartValues ? _value._recommendedChartValues : recommendedChartValues // ignore: cast_nullable_to_non_nullable @@ -692,6 +688,10 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _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 @@ -716,9 +716,9 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value.commentController : commentController // ignore: cast_nullable_to_non_nullable as TextEditingController, - productNameController: null == productNameController - ? _value.productNameController - : productNameController // ignore: cast_nullable_to_non_nullable + product_nameController: null == product_nameController + ? _value.product_nameController + : product_nameController // ignore: cast_nullable_to_non_nullable as TextEditingController, productQuantityController: null == productQuantityController ? _value.productQuantityController @@ -794,20 +794,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { const _$DiaryStateLoadedImpl( {required this.diary, this.diaryDate, - required final List autocompleteList, required final List recommendedChartValues, required final List consumedChartValues, required final List portions, required final List photos, 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.productNameController, + required this.product_nameController, required this.productQuantityController, required this.caloriesController, required this.fatsController, @@ -820,27 +820,18 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required this.moodExpanded, required this.isLoading, required this.isAdded}) - : _autocompleteList = autocompleteList, - _recommendedChartValues = recommendedChartValues, + : _recommendedChartValues = recommendedChartValues, _consumedChartValues = consumedChartValues, _portions = portions, _photos = photos, _mealList = mealList, - _portionList = portionList; + _portionList = portionList, + _autocompleteList = autocompleteList; @override final DiaryModel diary; @override final String? diaryDate; - final List _autocompleteList; - @override - List get autocompleteList { - if (_autocompleteList is EqualUnmodifiableListView) - return _autocompleteList; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_autocompleteList); - } - final List _recommendedChartValues; @override List get recommendedChartValues { @@ -891,6 +882,15 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { 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 @@ -904,7 +904,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override final TextEditingController commentController; @override - final TextEditingController productNameController; + final TextEditingController product_nameController; @override final TextEditingController productQuantityController; @override @@ -932,7 +932,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override String toString() { - return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, autocompleteList: $autocompleteList, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, mealList: $mealList, portionList: $portionList, currentMeal: $currentMeal, portionController: $portionController, wakeupController: $wakeupController, retireController: $retireController, mealTimeController: $mealTimeController, commentController: $commentController, productNameController: $productNameController, productQuantityController: $productQuantityController, caloriesController: $caloriesController, fatsController: $fatsController, proteinsController: $proteinsController, carbsController: $carbsController, selectedMood: $selectedMood, selectedSatiety: $selectedSatiety, wakeupExpanded: $wakeupExpanded, moderationExpanded: $moderationExpanded, moodExpanded: $moodExpanded, isLoading: $isLoading, isAdded: $isAdded)'; + return 'DiaryState.loaded(diary: $diary, diaryDate: $diaryDate, recommendedChartValues: $recommendedChartValues, consumedChartValues: $consumedChartValues, portions: $portions, photos: $photos, 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)'; } @override @@ -943,8 +943,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { (identical(other.diary, diary) || other.diary == diary) && (identical(other.diaryDate, diaryDate) || other.diaryDate == diaryDate) && - const DeepCollectionEquality() - .equals(other._autocompleteList, _autocompleteList) && const DeepCollectionEquality().equals( other._recommendedChartValues, _recommendedChartValues) && const DeepCollectionEquality() @@ -954,6 +952,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { 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) || @@ -966,8 +966,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { other.mealTimeController == mealTimeController) && (identical(other.commentController, commentController) || other.commentController == commentController) && - (identical(other.productNameController, productNameController) || - other.productNameController == productNameController) && + (identical(other.product_nameController, product_nameController) || + other.product_nameController == product_nameController) && (identical(other.productQuantityController, productQuantityController) || other.productQuantityController == productQuantityController) && @@ -999,20 +999,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { runtimeType, diary, diaryDate, - const DeepCollectionEquality().hash(_autocompleteList), const DeepCollectionEquality().hash(_recommendedChartValues), const DeepCollectionEquality().hash(_consumedChartValues), const DeepCollectionEquality().hash(_portions), const DeepCollectionEquality().hash(_photos), const DeepCollectionEquality().hash(_mealList), const DeepCollectionEquality().hash(_portionList), + const DeepCollectionEquality().hash(_autocompleteList), currentMeal, portionController, wakeupController, retireController, mealTimeController, commentController, - productNameController, + product_nameController, productQuantityController, caloriesController, fatsController, @@ -1042,20 +1042,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -1074,20 +1074,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return loaded( diary, diaryDate, - autocompleteList, recommendedChartValues, consumedChartValues, portions, photos, mealList, portionList, + autocompleteList, currentMeal, portionController, wakeupController, retireController, mealTimeController, commentController, - productNameController, + product_nameController, productQuantityController, caloriesController, fatsController, @@ -1110,20 +1110,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult? Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -1142,20 +1142,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return loaded?.call( diary, diaryDate, - autocompleteList, recommendedChartValues, consumedChartValues, portions, photos, mealList, portionList, + autocompleteList, currentMeal, portionController, wakeupController, retireController, mealTimeController, commentController, - productNameController, + product_nameController, productQuantityController, caloriesController, fatsController, @@ -1178,20 +1178,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -1212,20 +1212,20 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return loaded( diary, diaryDate, - autocompleteList, recommendedChartValues, consumedChartValues, portions, photos, mealList, portionList, + autocompleteList, currentMeal, portionController, wakeupController, retireController, mealTimeController, commentController, - productNameController, + product_nameController, productQuantityController, caloriesController, fatsController, @@ -1284,20 +1284,20 @@ abstract class DiaryStateLoaded implements DiaryState { const factory DiaryStateLoaded( {required final DiaryModel diary, final String? diaryDate, - required final List autocompleteList, required final List recommendedChartValues, required final List consumedChartValues, required final List portions, required final List photos, 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 productNameController, + required final TextEditingController product_nameController, required final TextEditingController productQuantityController, required final TextEditingController caloriesController, required final TextEditingController fatsController, @@ -1313,20 +1313,20 @@ abstract class DiaryStateLoaded implements DiaryState { DiaryModel get diary; String? get diaryDate; - List get autocompleteList; List get recommendedChartValues; List get consumedChartValues; List get portions; List get photos; 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 productNameController; + TextEditingController get product_nameController; TextEditingController get productQuantityController; TextEditingController get caloriesController; TextEditingController get fatsController; @@ -1415,20 +1415,20 @@ class _$DiaryStateErrorImpl implements DiaryStateError { required TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -1455,20 +1455,20 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult? Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, @@ -1495,20 +1495,20 @@ class _$DiaryStateErrorImpl implements DiaryStateError { TResult Function( DiaryModel diary, String? diaryDate, - List autocompleteList, List recommendedChartValues, List consumedChartValues, List portions, List photos, List mealList, List portionList, + List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, TimeOfDay? wakeupController, TimeOfDay? retireController, TimeOfDay? mealTimeController, TextEditingController commentController, - TextEditingController productNameController, + TextEditingController product_nameController, TextEditingController productQuantityController, TextEditingController caloriesController, TextEditingController fatsController, diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 422d8bc7..5603abb3 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -4,6 +4,7 @@ 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:flutter/cupertino.dart'; @@ -247,7 +248,9 @@ class DiaryScreen extends StatelessWidget { borderRadius: BorderRadiusStyle.roundedBorder5, ), child: Center( - child: CircularProgressIndicator(color: appTheme.blueGray300), // Замените на свой прелоадер при необходимости + child: CircularProgressIndicator( + color: appTheme + .blueGray300), // Замените на свой прелоадер при необходимости ), ), ], @@ -271,7 +274,8 @@ class DiaryScreen extends StatelessWidget { _buildMeal(BuildContext context, DiaryStateLoaded state) { final digitsOnly = FilteringTextInputFormatter.digitsOnly; - List _options = state.autocompleteList.map((dynamic item) => item as String).toList(); + List _options = + state.autocompleteList.map((Product item) => item.name).toList(); FocusNode focusNodeName = FocusNode(); return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -315,7 +319,9 @@ class DiaryScreen extends StatelessWidget { onTap: () => _selectMealTime(context, state), child: AbsorbPointer( child: CustomTextFormField( - hintText: state.mealTimeController?.format(context).toString(), + hintText: state.mealTimeController + ?.format(context) + .toString(), autofocus: false, ), ), @@ -451,7 +457,9 @@ class DiaryScreen extends StatelessWidget { SizedBox(height: 30.v), _buildAddProduct(context, state), SizedBox(height: 30.v), - ...state.portions.map((portion) => _buildProduct(context, portion)).toList(), + ...state.portions + .map((portion) => _buildProduct(context, portion)) + .toList(), SizedBox(height: 30.v), /*...state.photos != null ? state.photos!.isEmpty @@ -531,7 +539,7 @@ class DiaryScreen extends StatelessWidget { children: [ CustomTextFormField( hintText: "Название", - controller: state.productNameController, + controller: state.product_nameController, ), SizedBox(height: 10.v), CustomTextFormField( @@ -567,7 +575,7 @@ class DiaryScreen extends StatelessWidget { TextButton( onPressed: triggerModeration( context, - state.productNameController.text, + state.product_nameController.text, state.caloriesController.text, state.proteinsController.text, state.fatsController.text, @@ -608,7 +616,8 @@ class DiaryScreen extends StatelessWidget { popDialog(BuildContext dialogContext) { return () { - Navigator.of(dialogContext).pop(); // Dismiss the dialog on Cancel button press + Navigator.of(dialogContext) + .pop(); // Dismiss the dialog on Cancel button press }; } @@ -618,8 +627,9 @@ class DiaryScreen extends StatelessWidget { }; } - selectProduct(AutocompleteOnSelected onSelected, String option, DiaryStateLoaded state) { - state.productNameController.text = option; + selectProduct(AutocompleteOnSelected onSelected, String option, + DiaryStateLoaded state) { + state.product_nameController.text = option; return () { onSelected(option); }; @@ -660,7 +670,8 @@ class DiaryScreen extends StatelessWidget { return CarouselSlider( options: CarouselOptions(height: 340.0), items: state.currentMeal.photos.map((photo) { - return _buildPhoto(context, photo); // Assuming photos are stored as strings + return _buildPhoto( + context, photo); // Assuming photos are stored as strings }).toList(), ); } @@ -686,7 +697,9 @@ class DiaryScreen extends StatelessWidget { top: 5.v, ), child: Text( - portion.productName.length > 8 ? portion.productName.substring(0, 8) : portion.productName, + portion.product_name.length > 8 + ? portion.product_name.substring(0, 8) + : portion.product_name, style: CustomTextStyles.titleMedium16, ), ), @@ -758,12 +771,15 @@ class DiaryScreen extends StatelessWidget { removePhoto(BuildContext context, Photo photo) { return () { - context.read().add(RemoveImageEvent(photo.id.toString(), photo.path)); + context + .read() + .add(RemoveImageEvent(photo.id.toString(), photo.path)); }; } _buildNutritionChart(BuildContext context, DiaryStateLoaded state) { - final List recommendedValues = state.recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы + final List recommendedValues = state + .recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы final List consumedValues = state.consumedChartValues; // return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -827,7 +843,10 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[0] / recommendedValues[0] * 100, - color: checkConsumedValues([recommendedValues[0]], [consumedValues[1]]) ? Colors.red : Colors.blue, + color: checkConsumedValues( + [recommendedValues[0]], [consumedValues[1]]) + ? Colors.red + : Colors.blue, ), ], ), @@ -836,7 +855,10 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[1] / recommendedValues[1] * 100, - color: checkConsumedValues([recommendedValues[1]], [consumedValues[1]]) ? Colors.red : Colors.blue, + color: checkConsumedValues( + [recommendedValues[1]], [consumedValues[1]]) + ? Colors.red + : Colors.blue, ), ], ), @@ -845,7 +867,10 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[2] / recommendedValues[2] * 100, - color: checkConsumedValues([recommendedValues[2]], [consumedValues[2]]) ? Colors.red : Colors.blue, + color: checkConsumedValues( + [recommendedValues[2]], [consumedValues[2]]) + ? Colors.red + : Colors.blue, ), ], ), @@ -854,7 +879,10 @@ class DiaryScreen extends StatelessWidget { barRods: [ BarChartRodData( toY: consumedValues[3] / recommendedValues[3] * 100, - color: checkConsumedValues([recommendedValues[3]], [consumedValues[3]]) ? Colors.red : Colors.blue, + color: checkConsumedValues( + [recommendedValues[3]], [consumedValues[3]]) + ? Colors.red + : Colors.blue, ), ], ), @@ -1045,7 +1073,9 @@ class DiaryScreen extends StatelessWidget { r"Подъем \ отход ко сну", style: CustomTextStyles.bodyMediumBlack900, ), - Icon(state.wakeupExpanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), + Icon(state.wakeupExpanded + ? Icons.arrow_drop_up + : Icons.arrow_drop_down), ], ), ), @@ -1059,7 +1089,8 @@ class DiaryScreen extends StatelessWidget { onTap: () => _selectWakeupTime(context, state), child: AbsorbPointer( child: CustomTextFormField( - hintText: state.wakeupController?.format(context).toString(), + hintText: + state.wakeupController?.format(context).toString(), prefix: Icon(Icons.sunny), autofocus: false, ), @@ -1070,7 +1101,8 @@ class DiaryScreen extends StatelessWidget { onTap: () => _selectRetireTime(context, state), child: AbsorbPointer( child: CustomTextFormField( - hintText: state.retireController?.format(context).toString(), + hintText: + state.retireController?.format(context).toString(), prefix: Icon(Icons.bed), autofocus: false, ), @@ -1117,7 +1149,8 @@ class DiaryScreen extends StatelessWidget { }; } - Function() sendFinishDayData(BuildContext dialogContext, BuildContext context) { + Function() sendFinishDayData( + BuildContext dialogContext, BuildContext context) { return () { closeDialog(dialogContext); context.read().add(FinishDay()); @@ -1160,7 +1193,9 @@ class DiaryScreen extends StatelessWidget { "Ваше настроение после приема пищи", style: CustomTextStyles.bodyMediumBlack900, ), - Icon(state.moodExpanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), + Icon(state.moodExpanded + ? Icons.arrow_drop_up + : Icons.arrow_drop_down), ], ), ), @@ -1220,7 +1255,8 @@ class DiaryScreen extends StatelessWidget { }; } - Future _selectWakeupTime(BuildContext context, DiaryStateLoaded state) async { + Future _selectWakeupTime( + BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.wakeupController ?? TimeOfDay.now(), @@ -1230,7 +1266,8 @@ class DiaryScreen extends StatelessWidget { } } - Future _selectRetireTime(BuildContext context, DiaryStateLoaded state) async { + Future _selectRetireTime( + BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.retireController ?? TimeOfDay.now(), @@ -1240,7 +1277,8 @@ class DiaryScreen extends StatelessWidget { } } - Future _selectMealTime(BuildContext context, DiaryStateLoaded state) async { + Future _selectMealTime( + BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: state.mealTimeController ?? TimeOfDay.now(), @@ -1251,7 +1289,8 @@ class DiaryScreen extends StatelessWidget { } } -bool checkConsumedValues(List recommendedValues, List consumedValues) { +bool checkConsumedValues( + List recommendedValues, List consumedValues) { for (int i = 0; i < recommendedValues.length; i++) { if (consumedValues[i] > recommendedValues[i]) { // Если хотя бы одно потребленное значение превышает рекомендованное diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 12268fb7..4bc13ae0 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,4 +1,5 @@ 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'; @@ -83,7 +84,7 @@ class DiaryRepository { } } - Future addPortion( + Future> addPortion( int diaryID, int mealID, String name, @@ -91,7 +92,8 @@ class DiaryRepository { int quantity, ) async { try { - await diaryService.sendPortionData( + print(name); + return await diaryService.sendPortionData( diaryID, mealID, name, @@ -109,6 +111,9 @@ class DiaryRepository { int portionID, ) async { try { + print(diaryID); + print(mealID); + print(portionID); await diaryService.sendRemovePortionData( diaryID, mealID, diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index 3ec5a5be..f358d7c7 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,5 +1,6 @@ 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'; @@ -49,7 +50,7 @@ abstract class DiaryService { ); @POST('/diary/{diary_id}/meal/{meal_id}/portions/create') - Future> sendPortionData( + Future> sendPortionData( @Path() int diary_id, @Path() int meal_id, @Query('product_name') String product_name, @@ -57,8 +58,8 @@ abstract class DiaryService { @Query('quantity') int quantity, ); - @POST('/diary/{diary_id}/meal/{meal_id}/portions/{portion_id}/delete') - Future> sendRemovePortionData( + @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, diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index 80461b5e..50d97322 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -254,7 +254,7 @@ class _DiaryService implements DiaryService { } @override - Future> sendPortionData( + Future> sendPortionData( int diary_id, int meal_id, String product_name, @@ -269,8 +269,8 @@ class _DiaryService implements DiaryService { }; final _headers = {}; const Map? _data = null; - final _result = await _dio - .fetch>(_setStreamType>(Options( + final _result = await _dio.fetch>( + _setStreamType>(Options( method: 'POST', headers: _headers, extra: _extra, @@ -286,12 +286,13 @@ class _DiaryService implements DiaryService { _dio.options.baseUrl, baseUrl, )))); - final _value = _result.data!.cast(); + var _value = _result.data!.map((k, dynamic v) => + MapEntry(k, Portion.fromJson(v as Map))); return _value; } @override - Future> sendRemovePortionData( + Future sendRemovePortionData( int diary_id, int meal_id, int portion_id, @@ -300,25 +301,22 @@ class _DiaryService implements DiaryService { final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio - .fetch>(_setStreamType>(Options( - method: 'POST', + 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, - )))); - final _value = _result.data!.cast(); - return _value; + .compose( + _dio.options, + '/diary/${diary_id}/meal/${meal_id}/portions/${portion_id}/delete', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); } RequestOptions _setStreamType(RequestOptions requestOptions) { From 0671c5d07216e419993bc7fc1081b4272d83b910 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Wed, 24 Jul 2024 17:12:28 +0300 Subject: [PATCH 17/19] refactor(diary): API methods all refactored and new nutrition charty finished --- lib/features/diary/models/photo.dart | 3 +- lib/features/diary/models/photo.freezed.dart | 62 +-- lib/features/diary/models/photo.g.dart | 6 +- .../diary/presentation/bloc/diary_bloc.dart | 431 ++++++------------ .../diary/presentation/bloc/diary_state.dart | 11 +- .../bloc/diary_state.freezed.dart | 128 +++--- .../presentation/pages/diary_screen.dart | 71 ++- .../diary/repositories/diary_repository.dart | 94 +++- .../diary/services/diary_service.dart | 36 +- .../diary/services/diary_service.g.dart | 168 ++++++- pubspec.yaml | 1 + 11 files changed, 568 insertions(+), 443 deletions(-) diff --git a/lib/features/diary/models/photo.dart b/lib/features/diary/models/photo.dart index f057ec50..eef9e8f1 100644 --- a/lib/features/diary/models/photo.dart +++ b/lib/features/diary/models/photo.dart @@ -7,9 +7,8 @@ part 'photo.g.dart'; class Photo with _$Photo { const factory Photo({ required int id, - required String originalName, + required String original_name, required String path, - required int size, }) = _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 index 6b4520b8..d9222864 100644 --- a/lib/features/diary/models/photo.freezed.dart +++ b/lib/features/diary/models/photo.freezed.dart @@ -21,9 +21,8 @@ Photo _$PhotoFromJson(Map json) { /// @nodoc mixin _$Photo { int get id => throw _privateConstructorUsedError; - String get originalName => throw _privateConstructorUsedError; + String get original_name => throw _privateConstructorUsedError; String get path => throw _privateConstructorUsedError; - int get size => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -35,7 +34,7 @@ abstract class $PhotoCopyWith<$Res> { factory $PhotoCopyWith(Photo value, $Res Function(Photo) then) = _$PhotoCopyWithImpl<$Res, Photo>; @useResult - $Res call({int id, String originalName, String path, int size}); + $Res call({int id, String original_name, String path}); } /// @nodoc @@ -52,27 +51,22 @@ class _$PhotoCopyWithImpl<$Res, $Val extends Photo> @override $Res call({ Object? id = null, - Object? originalName = null, + Object? original_name = null, Object? path = null, - Object? size = null, }) { return _then(_value.copyWith( id: null == id ? _value.id : id // ignore: cast_nullable_to_non_nullable as int, - originalName: null == originalName - ? _value.originalName - : originalName // ignore: cast_nullable_to_non_nullable + 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, - size: null == size - ? _value.size - : size // ignore: cast_nullable_to_non_nullable - as int, ) as $Val); } } @@ -84,7 +78,7 @@ abstract class _$$PhotoImplCopyWith<$Res> implements $PhotoCopyWith<$Res> { __$$PhotoImplCopyWithImpl<$Res>; @override @useResult - $Res call({int id, String originalName, String path, int size}); + $Res call({int id, String original_name, String path}); } /// @nodoc @@ -99,27 +93,22 @@ class __$$PhotoImplCopyWithImpl<$Res> @override $Res call({ Object? id = null, - Object? originalName = null, + Object? original_name = null, Object? path = null, - Object? size = null, }) { return _then(_$PhotoImpl( id: null == id ? _value.id : id // ignore: cast_nullable_to_non_nullable as int, - originalName: null == originalName - ? _value.originalName - : originalName // ignore: cast_nullable_to_non_nullable + 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, - size: null == size - ? _value.size - : size // ignore: cast_nullable_to_non_nullable - as int, )); } } @@ -128,10 +117,7 @@ class __$$PhotoImplCopyWithImpl<$Res> @JsonSerializable() class _$PhotoImpl implements _Photo { const _$PhotoImpl( - {required this.id, - required this.originalName, - required this.path, - required this.size}); + {required this.id, required this.original_name, required this.path}); factory _$PhotoImpl.fromJson(Map json) => _$$PhotoImplFromJson(json); @@ -139,15 +125,13 @@ class _$PhotoImpl implements _Photo { @override final int id; @override - final String originalName; + final String original_name; @override final String path; - @override - final int size; @override String toString() { - return 'Photo(id: $id, originalName: $originalName, path: $path, size: $size)'; + return 'Photo(id: $id, original_name: $original_name, path: $path)'; } @override @@ -156,15 +140,14 @@ class _$PhotoImpl implements _Photo { (other.runtimeType == runtimeType && other is _$PhotoImpl && (identical(other.id, id) || other.id == id) && - (identical(other.originalName, originalName) || - other.originalName == originalName) && - (identical(other.path, path) || other.path == path) && - (identical(other.size, size) || other.size == size)); + (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, originalName, path, size); + int get hashCode => Object.hash(runtimeType, id, original_name, path); @JsonKey(ignore: true) @override @@ -183,21 +166,18 @@ class _$PhotoImpl implements _Photo { abstract class _Photo implements Photo { const factory _Photo( {required final int id, - required final String originalName, - required final String path, - required final int size}) = _$PhotoImpl; + required final String original_name, + required final String path}) = _$PhotoImpl; factory _Photo.fromJson(Map json) = _$PhotoImpl.fromJson; @override int get id; @override - String get originalName; + String get original_name; @override String get path; @override - int get size; - @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 index 9b212a83..8cd7bcc6 100644 --- a/lib/features/diary/models/photo.g.dart +++ b/lib/features/diary/models/photo.g.dart @@ -8,15 +8,13 @@ part of 'photo.dart'; _$PhotoImpl _$$PhotoImplFromJson(Map json) => _$PhotoImpl( id: (json['id'] as num).toInt(), - originalName: json['originalName'] as String, + original_name: json['original_name'] as String, path: json['path'] as String, - size: (json['size'] as num).toInt(), ); Map _$$PhotoImplToJson(_$PhotoImpl instance) => { 'id': instance.id, - 'originalName': instance.originalName, + 'original_name': instance.original_name, 'path': instance.path, - 'size': instance.size, }; diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 37abfdca..a54ed15e 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -38,7 +38,6 @@ class DiaryBloc extends Bloc { _removeImage, ); // пользователь нажимает на крестик около продукта on(_uploadImages); //пользователь нажимает "Добавить фото" - on(_addComment); //пользователь нажимает "Добавить комментарий" on( _inputProduct, ); @@ -57,13 +56,50 @@ class DiaryBloc extends Bloc { 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), @@ -72,14 +108,17 @@ class DiaryBloc extends Bloc { SelectionPopupModel(title: "Прием пищи 5", id: 5), SelectionPopupModel(title: "Прием пищи 6", id: 6), ]; + + print(dailyNutritionRecommendations); + print(dailyNutritionIntake); emit(DiaryState.loaded( diary: diary, currentMeal: currentMeal, portions: currentMeal.portions, - photos: currentMeal.photos, portionList: portionList, portionController: portionList[0], mealList: mealList, + chartData: chartDataCounted, selectedMood: currentMeal.mood, selectedSatiety: currentMeal.satiety, commentController: TextEditingController(), @@ -119,7 +158,7 @@ class DiaryBloc extends Bloc { if (responseChart.statusCode == 200) { final responseBody = jsonDecode(responseChart.body); - + print(responseBody); final recommendedChartValues = responseBody['dailyNutritionRecommendation'] .values @@ -131,13 +170,22 @@ class DiaryBloc extends Bloc { .map((value) => convertToInt(value)) .toList(); - print([recommendedChartValues, consumedChartValues]); - return [recommendedChartValues, consumedChartValues]; + print([ + recommendedChartValues, + consumedChartValues, + ]); + return [ + recommendedChartValues, + consumedChartValues, + ]; } else { emit(DiaryStateError( errorMessage: 'Ошибка при декодировании данных КБЖУ')); print('fail'); - return [[], []]; // Return empty lists instead of -1 + return [ + [], + [], + ]; } } @@ -162,10 +210,14 @@ class DiaryBloc extends Bloc { ) 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); + var updatedState = currentState.copyWith( + selectedSatiety: event.selectedElement, + ); + diaryRepository.changeSatiety( + event.selectedElement, + currentState.currentMeal.id, + currentState.diary.id, + ); emit(updatedState); } } @@ -176,11 +228,15 @@ class DiaryBloc extends Bloc { ) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var updatedState = - currentState.copyWith(selectedMood: event.selectedElement); + var updatedState = currentState.copyWith( + selectedMood: event.selectedElement, + ); - diaryRepository.changeMood(event.selectedElement, - currentState.currentMeal.id, currentState.diary.id); + diaryRepository.changeMood( + event.selectedElement, + currentState.currentMeal.id, + currentState.diary.id, + ); emit(updatedState); // Передаем обновленное состояние в emit } @@ -246,7 +302,6 @@ class DiaryBloc extends Bloc { DiaryStateLoaded updatedState = currentState.copyWith( currentMeal: meal, portions: meal.portions, - photos: meal.photos, mealTimeController: toTime(meal.time), selectedMood: meal.mood, selectedSatiety: meal.satiety, @@ -279,6 +334,76 @@ class DiaryBloc extends Bloc { } } + FutureOr _addPortion( + AddPortionEvent event, + Emitter emit, + ) async { + if (state is DiaryStateLoaded) { + var currentState = state as DiaryStateLoaded; + + Map data = await diaryRepository.addPortion( + currentState.diary.id, + currentState.currentMeal.id, + currentState.product_nameController.text, + currentState.portionController.title, + int.parse(currentState.productQuantityController.text), + ); + List newPortions = currentState.portions; + + final Portion newPortion = data['portion'] ?? + new Portion(id: 1, portion: 'gr', product_name: '1', quantity: 1); + newPortions.add(newPortion); + emit(currentState.copyWith(isAdded: true, portions: newPortions)); + //TODO update screen after addPortion() call + } + } + + 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, + ); + } + //TODO update screen after _removePortion() call + } + + 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, + ); + } + } + + 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, @@ -325,48 +450,6 @@ class DiaryBloc extends Bloc { } } - FutureOr _addPortion( - AddPortionEvent event, - Emitter emit, - ) async { - if (state is DiaryStateLoaded) { - var currentState = state as DiaryStateLoaded; - print(currentState.diary.id); - print(currentState.currentMeal.id); - print(currentState.product_nameController.text); - print(currentState.portionController.title); - print(currentState.productQuantityController.text); - - Map data = await diaryRepository.addPortion( - currentState.diary.id, - currentState.currentMeal.id, - currentState.product_nameController.text, - currentState.portionController.title, - int.parse(currentState.productQuantityController.text), - ); - List newPortions = currentState.portions; - - final Portion newPortion = data['portion'] ?? - new Portion(id: 1, portion: 'gr', product_name: '1', quantity: 1); - newPortions.add(newPortion); - emit(currentState.copyWith(isAdded: true, portions: newPortions)); - } - } - - 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, - ); - } - } - FutureOr _removeImage( RemoveImageEvent event, Emitter emit, @@ -374,244 +457,28 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var response = await sendRemovePhoto( - event.path, - event.photoID, - currentState.currentMeal.id, + await diaryRepository.removeImage( currentState.diary.id, + currentState.currentMeal.id, + int.parse(event.photoID), + event.path, ); - 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? path, - String? photoID, - int? mealID, - int diaryID, - ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/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', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - Future _finishDay(FinishDay event, Emitter emit) async { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - var response = await sendFinishDay( + await diaryRepository.finishDay( currentState.diary.id, currentState.wakeupController, currentState.retireController, currentState.commentController.text, ); - - if (response.statusCode == 200) { - await reloadScreen(event, emit); - } } } - Future sendFinishDay( - 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 = '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/finishDay'; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - Future _uploadImages( - UploadImages event, - Emitter emit, - ) async { - if (state is DiaryStateLoaded) { - var currentState = state as DiaryStateLoaded; - - emit(currentState.copyWith(isLoading: true)); - await uploadImageToServer( - event.image.path, - currentState.diary.id, - currentState.currentMeal.id, - ); - await reloadScreen(event, emit); - } - } - - Future uploadImageToServer( - String imagePath, - int diaryID, - int mealId, - ) async { - String url = - '${dotenv.env['SERVER_ROOT']!}/diary/$diaryID/meal/$mealId/photo/upload'; - - var request = http.MultipartRequest('POST', Uri.parse(url)); - - 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 DiaryStateLoaded) { - final response = await _sendModerationData( - event.name, - event.energyOn100gr, - event.proteinsOn100gr, - event.fatsOn100gr, - event.carbohydratesOn100gr, - ); - - 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, - ) async { - final Uri url = Uri.parse( - '${dotenv.env['SERVER_ROOT']!}/diary/product_nutritional_values/sendToModeration', - ); - final Uri serverURL = Uri.parse('${dotenv.env['SERVER_ROOT']!}'); - 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, - '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 DiaryStateLoaded) { - var currentState = state as DiaryStateLoaded; - var updatedState = currentState.copyWith( - commentController: TextEditingController(text: event.comment), - ); - - // Отправляем данные по HTTP маршруту и ждем ответ - var response = await sendCommentData( - event.comment, - currentState.diary.id, - ); - - if (response.statusCode == 200) { - emit(updatedState); // Передаем обновленное состояние в emit - } - } - } - - Future sendCommentData( - String comment, - int diaryID, - ) async { - String url = dotenv.env['SERVER_ROOT']! + '/diary/$diaryID/retire/fill'; - final Map credentials = { - 'comment': comment, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - TimeOfDay toTime(String timeStr) { List timeParts = timeStr.split(":"); int hour = int.parse(timeParts[0]); @@ -621,14 +488,6 @@ class DiaryBloc extends Bloc { 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']); } diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index 57b3768a..6feb5f14 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -1,6 +1,5 @@ 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:flutter/material.dart'; @@ -22,7 +21,6 @@ abstract class DiaryState with _$DiaryState { required List recommendedChartValues, required List consumedChartValues, required List portions, - required List photos, required List mealList, required List portionList, required List autocompleteList, @@ -45,9 +43,18 @@ abstract class DiaryState with _$DiaryState { 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 index 981a027d..deda8724 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -26,7 +26,6 @@ mixin _$DiaryState { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -48,7 +47,8 @@ mixin _$DiaryState { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded) + bool isAdded, + List? chartData) loaded, required TResult Function(String errorMessage) error, }) => @@ -63,7 +63,6 @@ mixin _$DiaryState { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -85,7 +84,8 @@ mixin _$DiaryState { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult? Function(String errorMessage)? error, }) => @@ -100,7 +100,6 @@ mixin _$DiaryState { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -122,7 +121,8 @@ mixin _$DiaryState { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult Function(String errorMessage)? error, required TResult orElse(), @@ -219,7 +219,6 @@ class _$DiaryStateImpl implements _DiaryState { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -241,7 +240,8 @@ class _$DiaryStateImpl implements _DiaryState { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded) + bool isAdded, + List? chartData) loaded, required TResult Function(String errorMessage) error, }) { @@ -259,7 +259,6 @@ class _$DiaryStateImpl implements _DiaryState { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -281,7 +280,8 @@ class _$DiaryStateImpl implements _DiaryState { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult? Function(String errorMessage)? error, }) { @@ -299,7 +299,6 @@ class _$DiaryStateImpl implements _DiaryState { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -321,7 +320,8 @@ class _$DiaryStateImpl implements _DiaryState { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult Function(String errorMessage)? error, required TResult orElse(), @@ -420,7 +420,6 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -442,7 +441,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded) + bool isAdded, + List? chartData) loaded, required TResult Function(String errorMessage) error, }) { @@ -460,7 +460,6 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -482,7 +481,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult? Function(String errorMessage)? error, }) { @@ -500,7 +500,6 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -522,7 +521,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult Function(String errorMessage)? error, required TResult orElse(), @@ -587,7 +587,6 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -609,7 +608,8 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded}); + bool isAdded, + List? chartData}); $DiaryModelCopyWith<$Res> get diary; $MealCopyWith<$Res> get currentMeal; @@ -631,7 +631,6 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> Object? recommendedChartValues = null, Object? consumedChartValues = null, Object? portions = null, - Object? photos = null, Object? mealList = null, Object? portionList = null, Object? autocompleteList = null, @@ -654,6 +653,7 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> Object? moodExpanded = null, Object? isLoading = null, Object? isAdded = null, + Object? chartData = freezed, }) { return _then(_$DiaryStateLoadedImpl( diary: null == diary @@ -676,10 +676,6 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _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, mealList: null == mealList ? _value._mealList : mealList // ignore: cast_nullable_to_non_nullable @@ -768,6 +764,10 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _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?, )); } @@ -797,7 +797,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required final List recommendedChartValues, required final List consumedChartValues, required final List portions, - required final List photos, required final List mealList, required final List portionList, required final List autocompleteList, @@ -819,14 +818,15 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required this.moderationExpanded, required this.moodExpanded, required this.isLoading, - required this.isAdded}) + required this.isAdded, + final List? chartData}) : _recommendedChartValues = recommendedChartValues, _consumedChartValues = consumedChartValues, _portions = portions, - _photos = photos, _mealList = mealList, _portionList = portionList, - _autocompleteList = autocompleteList; + _autocompleteList = autocompleteList, + _chartData = chartData; @override final DiaryModel diary; @@ -858,14 +858,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { return EqualUnmodifiableListView(_portions); } - final List _photos; - @override - List get photos { - if (_photos is EqualUnmodifiableListView) return _photos; - // ignore: implicit_dynamic_type - return EqualUnmodifiableListView(_photos); - } - final List _mealList; @override List get mealList { @@ -929,10 +921,19 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { 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, photos: $photos, 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)'; + 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 @@ -948,7 +949,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { const DeepCollectionEquality() .equals(other._consumedChartValues, _consumedChartValues) && const DeepCollectionEquality().equals(other._portions, _portions) && - const DeepCollectionEquality().equals(other._photos, _photos) && const DeepCollectionEquality().equals(other._mealList, _mealList) && const DeepCollectionEquality() .equals(other._portionList, _portionList) && @@ -991,7 +991,9 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { other.moodExpanded == moodExpanded) && (identical(other.isLoading, isLoading) || other.isLoading == isLoading) && - (identical(other.isAdded, isAdded) || other.isAdded == isAdded)); + (identical(other.isAdded, isAdded) || other.isAdded == isAdded) && + const DeepCollectionEquality() + .equals(other._chartData, _chartData)); } @override @@ -1002,7 +1004,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { const DeepCollectionEquality().hash(_recommendedChartValues), const DeepCollectionEquality().hash(_consumedChartValues), const DeepCollectionEquality().hash(_portions), - const DeepCollectionEquality().hash(_photos), const DeepCollectionEquality().hash(_mealList), const DeepCollectionEquality().hash(_portionList), const DeepCollectionEquality().hash(_autocompleteList), @@ -1024,7 +1025,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { moderationExpanded, moodExpanded, isLoading, - isAdded + isAdded, + const DeepCollectionEquality().hash(_chartData) ]); @JsonKey(ignore: true) @@ -1045,7 +1047,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -1067,7 +1068,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded) + bool isAdded, + List? chartData) loaded, required TResult Function(String errorMessage) error, }) { @@ -1077,7 +1079,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { recommendedChartValues, consumedChartValues, portions, - photos, mealList, portionList, autocompleteList, @@ -1099,7 +1100,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { moderationExpanded, moodExpanded, isLoading, - isAdded); + isAdded, + chartData); } @override @@ -1113,7 +1115,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -1135,7 +1136,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult? Function(String errorMessage)? error, }) { @@ -1145,7 +1147,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { recommendedChartValues, consumedChartValues, portions, - photos, mealList, portionList, autocompleteList, @@ -1167,7 +1168,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { moderationExpanded, moodExpanded, isLoading, - isAdded); + isAdded, + chartData); } @override @@ -1181,7 +1183,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -1203,7 +1204,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult Function(String errorMessage)? error, required TResult orElse(), @@ -1215,7 +1217,6 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { recommendedChartValues, consumedChartValues, portions, - photos, mealList, portionList, autocompleteList, @@ -1237,7 +1238,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { moderationExpanded, moodExpanded, isLoading, - isAdded); + isAdded, + chartData); } return orElse(); } @@ -1287,7 +1289,6 @@ abstract class DiaryStateLoaded implements DiaryState { required final List recommendedChartValues, required final List consumedChartValues, required final List portions, - required final List photos, required final List mealList, required final List portionList, required final List autocompleteList, @@ -1309,14 +1310,14 @@ abstract class DiaryStateLoaded implements DiaryState { required final bool moderationExpanded, required final bool moodExpanded, required final bool isLoading, - required final bool isAdded}) = _$DiaryStateLoadedImpl; + 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 photos; List get mealList; List get portionList; List get autocompleteList; @@ -1339,6 +1340,7 @@ abstract class DiaryStateLoaded implements DiaryState { bool get moodExpanded; bool get isLoading; bool get isAdded; + List? get chartData; @JsonKey(ignore: true) _$$DiaryStateLoadedImplCopyWith<_$DiaryStateLoadedImpl> get copyWith => throw _privateConstructorUsedError; @@ -1418,7 +1420,6 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -1440,7 +1441,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded) + bool isAdded, + List? chartData) loaded, required TResult Function(String errorMessage) error, }) { @@ -1458,7 +1460,6 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -1480,7 +1481,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult? Function(String errorMessage)? error, }) { @@ -1498,7 +1500,6 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List recommendedChartValues, List consumedChartValues, List portions, - List photos, List mealList, List portionList, List autocompleteList, @@ -1520,7 +1521,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { bool moderationExpanded, bool moodExpanded, bool isLoading, - bool isAdded)? + bool isAdded, + List? chartData)? loaded, TResult Function(String errorMessage)? error, required TResult orElse(), diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 5603abb3..53937a94 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -7,20 +7,20 @@ 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:flutter/cupertino.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: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: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 DiaryScreen extends StatelessWidget { @@ -89,7 +89,7 @@ class DiaryScreen 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), @@ -109,6 +109,39 @@ class DiaryScreen 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: "Закончить день", @@ -122,7 +155,6 @@ class DiaryScreen extends StatelessWidget { color: Colors.transparent, ), onPressed: onFinishDayPressed(context), - // Установите прозрачный фон ); } @@ -217,8 +249,6 @@ class DiaryScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.min, children: [ - // Показывайте прелоадер, если загрузка активна - Padding( padding: EdgeInsets.only( left: 7.h, @@ -461,13 +491,6 @@ class DiaryScreen extends StatelessWidget { .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), @@ -600,7 +623,6 @@ class DiaryScreen extends StatelessWidget { BuildContext dialogContext, ) { return () { - // Call function to send moderation with the entered values context.read().add( SendModeration( name: name, @@ -610,7 +632,7 @@ class DiaryScreen extends StatelessWidget { carbohydratesOn100gr: carbohydratesOn100gr, ), ); - Navigator.of(dialogContext).pop(); // Dismiss the dialog + Navigator.of(dialogContext).pop(); }; } @@ -670,8 +692,7 @@ class DiaryScreen extends StatelessWidget { return CarouselSlider( options: CarouselOptions(height: 340.0), items: state.currentMeal.photos.map((photo) { - return _buildPhoto( - context, photo); // Assuming photos are stored as strings + return _buildPhoto(context, photo); }).toList(), ); } @@ -777,7 +798,7 @@ class DiaryScreen extends StatelessWidget { }; } - _buildNutritionChart(BuildContext context, DiaryStateLoaded state) { + /*_buildNutritionChart(BuildContext context, DiaryStateLoaded state) { final List recommendedValues = state .recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы final List consumedValues = state.consumedChartValues; // @@ -996,7 +1017,7 @@ class DiaryScreen extends StatelessWidget { ], ), ); - } + }*/ /// Section Widget _buildComment(BuildContext context, DiaryStateLoaded state) { diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 4bc13ae0..56c9fbd6 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,3 +1,7 @@ +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'; @@ -24,6 +28,14 @@ class DiaryRepository { } } + 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); @@ -92,7 +104,6 @@ class DiaryRepository { int quantity, ) async { try { - print(name); return await diaryService.sendPortionData( diaryID, mealID, @@ -105,15 +116,32 @@ class DiaryRepository { } } + 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 { - print(diaryID); - print(mealID); - print(portionID); await diaryService.sendRemovePortionData( diaryID, mealID, @@ -123,4 +151,62 @@ class DiaryRepository { 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 f358d7c7..125db491 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -1,3 +1,5 @@ +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'; @@ -17,7 +19,7 @@ abstract class DiaryService { Future> getDiary(@Path() int id); @GET('/diary/{id}/dailyNutritionData/') - Future getChart(@Path() String id); + Future getChart(@Path() int id); @GET('/diary/product_nutritional_values/filter') Future>> getInputProduct( @@ -58,10 +60,42 @@ abstract class DiaryService { @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 index 50d97322..01a34881 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -74,29 +74,28 @@ class _DiaryService implements DiaryService { } @override - Future getChart(String id) async { + Future getChart(int id) async { final _extra = {}; final queryParameters = {}; final _headers = {}; const Map? _data = null; - final _result = await _dio - .fetch>(_setStreamType(Options( + 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 = DiaryModel.fromJson(_result.data!); + .compose( + _dio.options, + '/diary/${id}/dailyNutritionData/', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final _value = _result.data; return _value; } @@ -291,6 +290,113 @@ class _DiaryService implements DiaryService { 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, @@ -319,6 +425,38 @@ class _DiaryService implements DiaryService { )))); } + @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 || diff --git a/pubspec.yaml b/pubspec.yaml index 256f8923..8a60729f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -68,6 +68,7 @@ dependencies: url_launcher: ^6.3.0 # debounce easy_debounce: ^2.0.3 + syncfusion_flutter_charts: ^26.1.42 dev_dependencies: build_runner: ^2.4.11 From 2d15e9ea4ecb8b90ee1327764c9cb71b9485f5a0 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Thu, 25 Jul 2024 10:36:14 +0300 Subject: [PATCH 18/19] refactor(diary): Diary updated on method call success --- .../diary/presentation/bloc/diary_bloc.dart | 33 ++++--------------- .../diary/presentation/bloc/diary_event.dart | 3 +- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index a54ed15e..cc0682a2 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -43,9 +43,6 @@ class DiaryBloc extends Bloc { ); on(_finishDay); on(_sendModeration); - on( - reloadScreen, - ); on(_clearInput); } @@ -189,21 +186,6 @@ class DiaryBloc extends Bloc { } } - refreshScreen( - int mealID, - DiaryEvent event, - Emitter emit, - ) async { - await reloadScreen(event, emit); - } - - reloadScreen( - DiaryEvent event, - Emitter emit, - ) async { - print("Reloading..."); - } - Future _changeSatiety( ChangeSatiety event, Emitter emit, @@ -341,20 +323,14 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - Map data = await diaryRepository.addPortion( + await diaryRepository.addPortion( currentState.diary.id, currentState.currentMeal.id, currentState.product_nameController.text, currentState.portionController.title, int.parse(currentState.productQuantityController.text), ); - List newPortions = currentState.portions; - - final Portion newPortion = data['portion'] ?? - new Portion(id: 1, portion: 'gr', product_name: '1', quantity: 1); - newPortions.add(newPortion); - emit(currentState.copyWith(isAdded: true, portions: newPortions)); - //TODO update screen after addPortion() call + add(LoadDiary()); } } @@ -370,7 +346,7 @@ class DiaryBloc extends Bloc { event.portionId, ); } - //TODO update screen after _removePortion() call + add(LoadDiary()); } Future _uploadImages( @@ -386,6 +362,7 @@ class DiaryBloc extends Bloc { currentState.diary.id, currentState.currentMeal.id, ); + add(LoadDiary()); } } @@ -463,6 +440,7 @@ class DiaryBloc extends Bloc { int.parse(event.photoID), event.path, ); + add(LoadDiary()); } } @@ -476,6 +454,7 @@ class DiaryBloc extends Bloc { currentState.retireController, currentState.commentController.text, ); + add(LoadDiary()); } } diff --git a/lib/features/diary/presentation/bloc/diary_event.dart b/lib/features/diary/presentation/bloc/diary_event.dart index d6637528..490fa0c6 100644 --- a/lib/features/diary/presentation/bloc/diary_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -157,5 +157,6 @@ class SendModeration extends DiaryEvent { String fatsOn100gr; String carbohydratesOn100gr; @override - List get props => [name, energyOn100gr, proteinsOn100gr, fatsOn100gr, carbohydratesOn100gr]; + List get props => + [name, energyOn100gr, proteinsOn100gr, fatsOn100gr, carbohydratesOn100gr]; } From 6886997fdeb295d308f63a5ad1bb7f74e617a4f8 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Thu, 25 Jul 2024 10:42:39 +0300 Subject: [PATCH 19/19] fix(diary):fix --- lib/features/diary/presentation/bloc/diary_bloc.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index cc0682a2..e6903353 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -1,7 +1,6 @@ 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/portion.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';