From 45e796152c5a4bd8a3df978acab3a032cc8cbf17 Mon Sep 17 00:00:00 2001 From: maxxkim Date: Tue, 6 Aug 2024 14:28:03 +0300 Subject: [PATCH] feat(calendar): Calendar to diary transition --- .../presentation/pages/calendar_screen.dart | 265 ++++++++++++------ .../diary/presentation/bloc/diary_bloc.dart | 103 ++++++- .../diary/presentation/bloc/diary_event.dart | 9 + .../diary/presentation/bloc/diary_state.dart | 4 +- .../bloc/diary_state.freezed.dart | 78 ++++-- .../presentation/pages/diary_screen.dart | 3 + 6 files changed, 346 insertions(+), 116 deletions(-) diff --git a/lib/features/calendar/presentation/pages/calendar_screen.dart b/lib/features/calendar/presentation/pages/calendar_screen.dart index 3824512..320ad2c 100644 --- a/lib/features/calendar/presentation/pages/calendar_screen.dart +++ b/lib/features/calendar/presentation/pages/calendar_screen.dart @@ -96,106 +96,199 @@ class CalendarScreen extends StatelessWidget { Map diary = {}; if (state.calendarList[index].diary is List) { diary['status'] = 'Скоро'; - } else if (state.calendarList[index].diary is Map) { - diary = state.calendarList[index].diary as Map; - } - return InkWell( - borderRadius: BorderRadiusStyle.circleBorder8, - onTap: () => GoRouter.of(context).go( - '/diary-screen', - extra: diary['id'].toString(), - ), - child: Ink( - padding: EdgeInsets.all(8), - decoration: BoxDecoration( - borderRadius: BorderRadiusStyle.circleBorder8, - color: getBackgroundColor(diary['state']), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - formatDate(state.calendarList[index].date), - style: theme.textTheme.titleMedium, - ), - SizedBox(height: 2.v), - if (diary['state'] != null) - Row(children: [ + return InkWell( + borderRadius: BorderRadiusStyle.circleBorder8, + child: Ink( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadiusStyle.circleBorder8, + color: getBackgroundColor(diary['state']), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + formatDate(state.calendarList[index].date), + style: theme.textTheme.titleMedium, + ), + SizedBox(height: 2.v), + if (diary['state'] != null) + Row(children: [ + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: diary['state'] == 'finished' + ? Color.fromRGBO(1, 154, 62, 1) + : Color.fromRGBO(154, 74, 1, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + _getStateText(diary['state'] ?? ''), + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + SizedBox(width: 4), + if (diary['state'] == 'started') + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: Color.fromRGBO(13, 110, 253, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + 'Заполнить отчет', + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + if (diary['state'] == 'finished') + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: Color.fromRGBO(13, 110, 253, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + 'Изменить отчет', + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + ]), + if (state.calendarList[index].diary is List) Container( padding: EdgeInsets.all( 4.0), // Отступы внутри контейнера decoration: BoxDecoration( - color: diary['state'] == 'finished' - ? Color.fromRGBO(1, 154, 62, 1) - : Color.fromRGBO(154, 74, 1, 1), + color: Color.fromRGBO(108, 117, 125, 1), borderRadius: BorderRadius.circular( 24.0), // Закругленные углы ), child: Text( - _getStateText(diary['state'] ?? ''), + 'Cкоро', style: CustomTextStyles .titleSmallBold, // Предполагается, что текст белый ), ), - SizedBox(width: 4), - if (diary['state'] == 'started') - Container( - padding: EdgeInsets.all( - 4.0), // Отступы внутри контейнера - decoration: BoxDecoration( - color: Color.fromRGBO(13, 110, 253, 1), - borderRadius: BorderRadius.circular( - 24.0), // Закругленные углы - ), - child: Text( - 'Заполнить отчет', - style: CustomTextStyles - .titleSmallBold, // Предполагается, что текст белый - ), - ), - if (diary['state'] == 'finished') - Container( - padding: EdgeInsets.all( - 4.0), // Отступы внутри контейнера - decoration: BoxDecoration( - color: Color.fromRGBO(13, 110, 253, 1), - borderRadius: BorderRadius.circular( - 24.0), // Закругленные углы - ), - child: Text( - 'Изменить отчет', - style: CustomTextStyles - .titleSmallBold, // Предполагается, что текст белый - ), - ), - ]), - if (state.calendarList[index].diary is List) - Container( - padding: - EdgeInsets.all(4.0), // Отступы внутри контейнера - decoration: BoxDecoration( - color: Color.fromRGBO(108, 117, 125, 1), - borderRadius: BorderRadius.circular( - 24.0), // Закругленные углы - ), - child: Text( - 'Cкоро', - style: CustomTextStyles - .titleSmallBold, // Предполагается, что текст белый - ), - ), - ], + ], + ), ), - ), - ], + ], + ), ), - ), - ); + ); + } else { + diary = state.calendarList[index].diary as Map; + return InkWell( + borderRadius: BorderRadiusStyle.circleBorder8, + onTap: () => GoRouter.of(context).go( + '/diary-screen', + extra: diary['id'].toString(), + ), + child: Ink( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadiusStyle.circleBorder8, + color: getBackgroundColor(diary['state']), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + formatDate(state.calendarList[index].date), + style: theme.textTheme.titleMedium, + ), + SizedBox(height: 2.v), + if (diary['state'] != null) + Row(children: [ + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: diary['state'] == 'finished' + ? Color.fromRGBO(1, 154, 62, 1) + : Color.fromRGBO(154, 74, 1, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + _getStateText(diary['state'] ?? ''), + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + SizedBox(width: 4), + if (diary['state'] == 'started') + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: Color.fromRGBO(13, 110, 253, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + 'Заполнить отчет', + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + if (diary['state'] == 'finished') + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: Color.fromRGBO(13, 110, 253, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + 'Изменить отчет', + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + ]), + if (state.calendarList[index].diary is List) + Container( + padding: EdgeInsets.all( + 4.0), // Отступы внутри контейнера + decoration: BoxDecoration( + color: Color.fromRGBO(108, 117, 125, 1), + borderRadius: BorderRadius.circular( + 24.0), // Закругленные углы + ), + child: Text( + 'Cкоро', + style: CustomTextStyles + .titleSmallBold, // Предполагается, что текст белый + ), + ), + ], + ), + ), + ], + ), + ), + ); + } }, ); } diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 9c18af5..379aaea 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -19,6 +19,7 @@ class DiaryBloc extends Bloc { DiaryBloc({required this.diaryRepository}) : super(const DiaryState.loading()) { on(loadDiary); + on(loadDiaryById); on(_changeSatiety); // пользователь нажимает на шкалу сытости on(_changeMood); // пользователь нажимает на шкалу настроения on(_changeMealTime); // пользовательяет времяа пиши @@ -61,26 +62,25 @@ class DiaryBloc extends Bloc { final Map chartData = await diaryRepository.getChartData(diaryID ?? 45); - print(chartData); final Map dailyNutritionIntake = chartData['dailyNutritionIntake']!; final Map dailyNutritionRecommendations = chartData['dailyNutritionRecommendation']!; final double ccal = dailyNutritionIntake['energy']! / dailyNutritionRecommendations['energy']! * - 100; + 50; final double proteins = dailyNutritionIntake['proteins']! / dailyNutritionRecommendations['proteins']! * - 100; + 50; final double fats = dailyNutritionIntake['fats']! / dailyNutritionRecommendations['fats']! * - 100; + 50; final double carbs = dailyNutritionIntake['carbohydrates']! / dailyNutritionRecommendations['carbohydrates']! * - 100; + 50; Color getColor(double value) { - if (value >= 49.1) { + if (value >= 99.1) { return Colors.red; } else { return Colors.blue; @@ -102,6 +102,97 @@ class DiaryBloc extends Bloc { SelectionPopupModel(title: "Прием пищи 5", id: 5), SelectionPopupModel(title: "Прием пищи 6", id: 6), ]; + + emit(DiaryState.loaded( + diary: diary, + currentMeal: currentMeal, + portions: currentMeal.portions, + portionList: portionList, + portionController: portionList[0], + mealList: mealList, + chartData: chartDataCounted, + selectedMood: currentMeal.mood, + selectedSatiety: currentMeal.satiety, + wakeupController: TimeOfDay.now(), + retireController: TimeOfDay.now(), + commentController: TextEditingController(), + product_nameController: TextEditingController(), + productQuantityController: TextEditingController(), + caloriesController: TextEditingController(), + fatsController: TextEditingController(), + proteinsController: TextEditingController(), + carbsController: TextEditingController(), + wakeupExpanded: false, + moderationExpanded: false, + moodExpanded: false, + isLoading: false, + isAdded: false, + autocompleteList: [], + recommendedChartValues: [1, 1, 1, 1], + consumedChartValues: [1, 1, 1, 1])); + } catch (e) { + emit(DiaryState.error(errorMessage: e.toString())); + } + } + + loadDiaryById( + LoadDiaryById event, + Emitter emit, + ) async { + emit(const DiaryState.loading()); + try { + final int diaryID = int.parse(event.id ?? "0"); + final DiaryModel diary = await diaryRepository.getDiary(diaryID); + final Meal currentMeal = diary.meals[0]; + + List portionList = [ + SelectionPopupModel(title: "gr"), + SelectionPopupModel(title: "pcs") + ]; + + final Map chartData = + await diaryRepository.getChartData(diaryID); + final Map dailyNutritionIntake = + chartData['dailyNutritionIntake']!; + final Map dailyNutritionRecommendations = + chartData['dailyNutritionRecommendation']!; + final double ccal = dailyNutritionIntake['energy']! / + dailyNutritionRecommendations['energy']! * + 50; + final double proteins = dailyNutritionIntake['proteins']! / + dailyNutritionRecommendations['proteins']! * + 50; + final double fats = dailyNutritionIntake['fats']! / + dailyNutritionRecommendations['fats']! * + 50; + final double carbs = dailyNutritionIntake['carbohydrates']! / + dailyNutritionRecommendations['carbohydrates']! * + 50; + + Color getColor(double value) { + if (value >= 99.1) { + return Colors.red; + } else { + return Colors.blue; + } + } + + final List chartDataCounted = [ + NutritionData('Калории', ccal, getColor(ccal)), + NutritionData('Белки', proteins, getColor(proteins)), + NutritionData('Жиры', fats, getColor(fats)), + NutritionData('Углеводы', carbs, getColor(carbs)), + ]; + + List mealList = [ + SelectionPopupModel(title: "Прием пищи 1", id: 1), + SelectionPopupModel(title: "Прием пищи 2", id: 2), + SelectionPopupModel(title: "Прием пищи 3", id: 3), + SelectionPopupModel(title: "Прием пищи 4", id: 4), + SelectionPopupModel(title: "Прием пищи 5", id: 5), + SelectionPopupModel(title: "Прием пищи 6", id: 6), + ]; + emit(DiaryState.loaded( diary: diary, currentMeal: currentMeal, diff --git a/lib/features/diary/presentation/bloc/diary_event.dart b/lib/features/diary/presentation/bloc/diary_event.dart index 490fa0c..4faa190 100644 --- a/lib/features/diary/presentation/bloc/diary_event.dart +++ b/lib/features/diary/presentation/bloc/diary_event.dart @@ -15,6 +15,15 @@ class LoadDiary extends DiaryEvent { List get props => []; } +class LoadDiaryById extends DiaryEvent { + LoadDiaryById( + this.id, + ); + final String? id; + @override + List get props => []; +} + class ChangeSatiety extends DiaryEvent { ChangeSatiety( this.selectedElement, diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index 9156576..0725991 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -13,7 +13,9 @@ part 'diary_state.freezed.dart'; abstract class DiaryState with _$DiaryState { const factory DiaryState() = _DiaryState; - const factory DiaryState.loading() = DiaryStateLoading; + const factory DiaryState.loading({ + int? id, + }) = DiaryStateLoading; const factory DiaryState.loaded({ required DiaryModel diary, diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 99328a6..24dbb0a 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -19,7 +19,7 @@ mixin _$DiaryState { @optionalTypeArgs TResult when( TResult Function() $default, { - required TResult Function() loading, + required TResult Function(int? id) loading, required TResult Function( DiaryModel diary, String? diaryDate, @@ -56,7 +56,7 @@ mixin _$DiaryState { @optionalTypeArgs TResult? whenOrNull( TResult? Function()? $default, { - TResult? Function()? loading, + TResult? Function(int? id)? loading, TResult? Function( DiaryModel diary, String? diaryDate, @@ -93,7 +93,7 @@ mixin _$DiaryState { @optionalTypeArgs TResult maybeWhen( TResult Function()? $default, { - TResult Function()? loading, + TResult Function(int? id)? loading, TResult Function( DiaryModel diary, String? diaryDate, @@ -212,7 +212,7 @@ class _$DiaryStateImpl implements _DiaryState { @optionalTypeArgs TResult when( TResult Function() $default, { - required TResult Function() loading, + required TResult Function(int? id) loading, required TResult Function( DiaryModel diary, String? diaryDate, @@ -252,7 +252,7 @@ class _$DiaryStateImpl implements _DiaryState { @optionalTypeArgs TResult? whenOrNull( TResult? Function()? $default, { - TResult? Function()? loading, + TResult? Function(int? id)? loading, TResult? Function( DiaryModel diary, String? diaryDate, @@ -292,7 +292,7 @@ class _$DiaryStateImpl implements _DiaryState { @optionalTypeArgs TResult maybeWhen( TResult Function()? $default, { - TResult Function()? loading, + TResult Function(int? id)? loading, TResult Function( DiaryModel diary, String? diaryDate, @@ -379,6 +379,8 @@ abstract class _$$DiaryStateLoadingImplCopyWith<$Res> { factory _$$DiaryStateLoadingImplCopyWith(_$DiaryStateLoadingImpl value, $Res Function(_$DiaryStateLoadingImpl) then) = __$$DiaryStateLoadingImplCopyWithImpl<$Res>; + @useResult + $Res call({int? id}); } /// @nodoc @@ -388,32 +390,57 @@ class __$$DiaryStateLoadingImplCopyWithImpl<$Res> __$$DiaryStateLoadingImplCopyWithImpl(_$DiaryStateLoadingImpl _value, $Res Function(_$DiaryStateLoadingImpl) _then) : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? id = freezed, + }) { + return _then(_$DiaryStateLoadingImpl( + id: freezed == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as int?, + )); + } } /// @nodoc class _$DiaryStateLoadingImpl implements DiaryStateLoading { - const _$DiaryStateLoadingImpl(); + const _$DiaryStateLoadingImpl({this.id}); + + @override + final int? id; @override String toString() { - return 'DiaryState.loading()'; + return 'DiaryState.loading(id: $id)'; } @override bool operator ==(Object other) { return identical(this, other) || - (other.runtimeType == runtimeType && other is _$DiaryStateLoadingImpl); + (other.runtimeType == runtimeType && + other is _$DiaryStateLoadingImpl && + (identical(other.id, id) || other.id == id)); } @override - int get hashCode => runtimeType.hashCode; + int get hashCode => Object.hash(runtimeType, id); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$DiaryStateLoadingImplCopyWith<_$DiaryStateLoadingImpl> get copyWith => + __$$DiaryStateLoadingImplCopyWithImpl<_$DiaryStateLoadingImpl>( + this, _$identity); @override @optionalTypeArgs TResult when( TResult Function() $default, { - required TResult Function() loading, + required TResult Function(int? id) loading, required TResult Function( DiaryModel diary, String? diaryDate, @@ -446,14 +473,14 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { loaded, required TResult Function(String errorMessage) error, }) { - return loading(); + return loading(id); } @override @optionalTypeArgs TResult? whenOrNull( TResult? Function()? $default, { - TResult? Function()? loading, + TResult? Function(int? id)? loading, TResult? Function( DiaryModel diary, String? diaryDate, @@ -486,14 +513,14 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { loaded, TResult? Function(String errorMessage)? error, }) { - return loading?.call(); + return loading?.call(id); } @override @optionalTypeArgs TResult maybeWhen( TResult Function()? $default, { - TResult Function()? loading, + TResult Function(int? id)? loading, TResult Function( DiaryModel diary, String? diaryDate, @@ -528,7 +555,7 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { required TResult orElse(), }) { if (loading != null) { - return loading(); + return loading(id); } return orElse(); } @@ -572,7 +599,12 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { } abstract class DiaryStateLoading implements DiaryState { - const factory DiaryStateLoading() = _$DiaryStateLoadingImpl; + const factory DiaryStateLoading({final int? id}) = _$DiaryStateLoadingImpl; + + int? get id; + @JsonKey(ignore: true) + _$$DiaryStateLoadingImplCopyWith<_$DiaryStateLoadingImpl> get copyWith => + throw _privateConstructorUsedError; } /// @nodoc @@ -1050,7 +1082,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @optionalTypeArgs TResult when( TResult Function() $default, { - required TResult Function() loading, + required TResult Function(int? id) loading, required TResult Function( DiaryModel diary, String? diaryDate, @@ -1118,7 +1150,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @optionalTypeArgs TResult? whenOrNull( TResult? Function()? $default, { - TResult? Function()? loading, + TResult? Function(int? id)? loading, TResult? Function( DiaryModel diary, String? diaryDate, @@ -1186,7 +1218,7 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @optionalTypeArgs TResult maybeWhen( TResult Function()? $default, { - TResult Function()? loading, + TResult Function(int? id)? loading, TResult Function( DiaryModel diary, String? diaryDate, @@ -1423,7 +1455,7 @@ class _$DiaryStateErrorImpl implements DiaryStateError { @optionalTypeArgs TResult when( TResult Function() $default, { - required TResult Function() loading, + required TResult Function(int? id) loading, required TResult Function( DiaryModel diary, String? diaryDate, @@ -1463,7 +1495,7 @@ class _$DiaryStateErrorImpl implements DiaryStateError { @optionalTypeArgs TResult? whenOrNull( TResult? Function()? $default, { - TResult? Function()? loading, + TResult? Function(int? id)? loading, TResult? Function( DiaryModel diary, String? diaryDate, @@ -1503,7 +1535,7 @@ class _$DiaryStateErrorImpl implements DiaryStateError { @optionalTypeArgs TResult maybeWhen( TResult Function()? $default, { - TResult Function()? loading, + TResult Function(int? id)? loading, TResult Function( DiaryModel diary, String? diaryDate, diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index cd66fb0..fb78189 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -31,6 +31,9 @@ class DiaryScreen extends StatelessWidget { }); Widget build(BuildContext context) { + if (diaryID != "0") { + context.read().add(LoadDiaryById(diaryID)); + } return BlocBuilder( builder: (context, state) { if (state is DiaryStateLoaded) {