diff --git a/lib/features/calendar/models/calendar_model.dart b/lib/features/calendar/models/calendar_model.dart index c206175b..c13d5c5d 100644 --- a/lib/features/calendar/models/calendar_model.dart +++ b/lib/features/calendar/models/calendar_model.dart @@ -6,14 +6,8 @@ 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, + required String date, + Object? diary, }) = _CalendarModel; factory CalendarModel.fromJson(Map json) => diff --git a/lib/features/calendar/models/calendar_model.freezed.dart b/lib/features/calendar/models/calendar_model.freezed.dart index 7f0d3209..fd8f7ea6 100644 --- a/lib/features/calendar/models/calendar_model.freezed.dart +++ b/lib/features/calendar/models/calendar_model.freezed.dart @@ -20,17 +20,8 @@ CalendarModel _$CalendarModelFromJson(Map 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; + String get date => throw _privateConstructorUsedError; + Object? get diary => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -44,15 +35,7 @@ abstract class $CalendarModelCopyWith<$Res> { 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}); + $Res call({String date, Object? diary}); } /// @nodoc @@ -68,48 +51,15 @@ class _$CalendarModelCopyWithImpl<$Res, $Val extends CalendarModel> @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, + Object? date = null, + Object? diary = freezed, }) { 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 + date: null == date + ? _value.date + : date // ignore: cast_nullable_to_non_nullable as String, + diary: freezed == diary ? _value.diary : diary, ) as $Val); } } @@ -122,15 +72,7 @@ abstract class _$$CalendarModelImplCopyWith<$Res> __$$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}); + $Res call({String date, Object? diary}); } /// @nodoc @@ -144,48 +86,15 @@ class __$$CalendarModelImplCopyWithImpl<$Res> @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, + Object? date = null, + Object? diary = freezed, }) { 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 + date: null == date + ? _value.date + : date // ignore: cast_nullable_to_non_nullable as String, + diary: freezed == diary ? _value.diary : diary, )); } } @@ -193,42 +102,19 @@ class __$$CalendarModelImplCopyWithImpl<$Res> /// @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}); + const _$CalendarModelImpl({required this.date, this.diary}); factory _$CalendarModelImpl.fromJson(Map json) => _$$CalendarModelImplFromJson(json); @override - final int id; + final String date; @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; + final Object? diary; @override String toString() { - return 'CalendarModel(id: $id, state: $state, image: $image, description: $description, youtubeUrl: $youtubeUrl, createdAt: $createdAt, updatedAt: $updatedAt, title: $title)'; + return 'CalendarModel(date: $date, diary: $diary)'; } @override @@ -236,24 +122,14 @@ class _$CalendarModelImpl implements _CalendarModel { 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)); + (identical(other.date, date) || other.date == date) && + const DeepCollectionEquality().equals(other.diary, diary)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, id, state, image, description, - youtubeUrl, createdAt, updatedAt, title); + int get hashCode => Object.hash( + runtimeType, date, const DeepCollectionEquality().hash(diary)); @JsonKey(ignore: true) @override @@ -271,37 +147,15 @@ class _$CalendarModelImpl implements _CalendarModel { 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; + {required final String date, final Object? diary}) = _$CalendarModelImpl; factory _CalendarModel.fromJson(Map json) = _$CalendarModelImpl.fromJson; @override - int get id; + String get date; @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; + Object? get diary; @override @JsonKey(ignore: true) _$$CalendarModelImplCopyWith<_$CalendarModelImpl> get copyWith => diff --git a/lib/features/calendar/models/calendar_model.g.dart b/lib/features/calendar/models/calendar_model.g.dart index d675f9b1..c12dd961 100644 --- a/lib/features/calendar/models/calendar_model.g.dart +++ b/lib/features/calendar/models/calendar_model.g.dart @@ -8,24 +8,12 @@ part of 'calendar_model.dart'; _$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, + date: json['date'] as String, + diary: json['diary'], ); 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, + 'date': instance.date, + 'diary': instance.diary, }; diff --git a/lib/features/calendar/presentation/pages/calendar_screen.dart b/lib/features/calendar/presentation/pages/calendar_screen.dart new file mode 100644 index 00000000..ab90403e --- /dev/null +++ b/lib/features/calendar/presentation/pages/calendar_screen.dart @@ -0,0 +1,164 @@ +// ignore_for_file: unused_local_variable + +import 'package:eatvio_app/features/calendar/models/calendar_model.dart'; +import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_cubit.dart'; +import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_state.dart'; +import 'package:eatvio_app/core/app_export.dart'; +import 'package:go_router/go_router.dart'; +import 'package:table_calendar/table_calendar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; + +// ignore: must_be_immutable +class CalendarScreen extends StatelessWidget { + CalendarScreen({Key? key}) : super(key: key); + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + if (state is CalendarStateLoaded) { + return _buildCalendar(context, state); + } else if (state is CalendarStateLoading) { + return Scaffold( + body: Center( + child: CupertinoActivityIndicator(), + ), + ); + } else if (state is CalendarStateError) { + 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 _buildCalendar(BuildContext context, CalendarStateLoaded state) { + return Stack(alignment: Alignment.bottomCenter, children: [ + FormBuilder( + child: Scaffold( + appBar: AppBar( + toolbarHeight: 0, + automaticallyImplyLeading: false, + ), + backgroundColor: Color.fromARGB(255, 240, 242, 245), + resizeToAvoidBottomInset: true, + body: SizedBox( + width: double.maxFinite, + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.only(bottom: 5.v), + child: Column( + children: [ + SizedBox(height: 20.v), + _buildCalendarBody(context, state), + SizedBox(height: 20.v), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ), + ]); + } + + _buildCalendarBody(BuildContext context, CalendarStateLoaded 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: TableCalendar( + locale: 'ru_RU', + firstDay: DateTime.utc(2010, 10, 16), + lastDay: DateTime.utc(2030, 3, 14), + focusedDay: DateTime.now(), + startingDayOfWeek: StartingDayOfWeek.monday, + calendarBuilders: CalendarBuilders( + selectedBuilder: (context, day, focusedDay) => + _buildCellDate(context, day, focusedDay: focusedDay, state), + defaultBuilder: (context, day, focusedDay) => + _buildCellDate(context, day, state), + todayBuilder: (context, day, focusedDay) => + _buildCellDate(context, day, state), + ), + ), + ); + } +} + +Widget _buildCellDate( + BuildContext context, DateTime day, CalendarStateLoaded state, + {DateTime? focusedDay}) { + final String dayString = day.toIso8601String().split('T').first; + final List calendarModels = state.calendarList; + + // Находим первую модель, соответствующую дате + final CalendarModel model = calendarModels.firstWhere( + (model) => model.date == dayString, + orElse: () => CalendarModel(date: dayString, diary: {})); + + Color? bgclr; // Объявляем переменную bgclr здесь + + final Map diary = model.diary as Map; + if (model.diary is Map) { + if (diary['state'] == "started") { + bgclr = Colors.grey; + } else if (diary['state'] == "finished") { + bgclr = Colors.green; + } else { + bgclr = Colors.white; + } + } else { + bgclr = Colors.white; // Значение по умолчанию, если diary не является Map + } + + return GestureDetector( + onTap: () => GoRouter.of(context).pushNamed( + 'diaryScreen', + extra: diary['id'], + ), + child: Container( + margin: const EdgeInsets.all(5), + alignment: Alignment.center, + decoration: BoxDecoration( + shape: (day == focusedDay) ? BoxShape.circle : BoxShape.rectangle, + color: bgclr, + borderRadius: (day == focusedDay) ? null : BorderRadius.circular(4), + ), + child: Text(day.day.toString(), style: TextStyle(color: Colors.black)), + )); +} diff --git a/lib/features/calendar/repositories/calendar_repository.dart b/lib/features/calendar/repositories/calendar_repository.dart index 97a23dca..fd9f734c 100644 --- a/lib/features/calendar/repositories/calendar_repository.dart +++ b/lib/features/calendar/repositories/calendar_repository.dart @@ -8,10 +8,7 @@ class CalendarRepository { Future> getCalendar() async { try { - return (await calendarService.getCalendar()) - .entries - .map((entry) => entry.value) - .toList(); + return await calendarService.getCalendar(); } catch (e) { rethrow; } diff --git a/lib/features/calendar/services/calendar_service.dart b/lib/features/calendar/services/calendar_service.dart index c33535cb..2974f735 100644 --- a/lib/features/calendar/services/calendar_service.dart +++ b/lib/features/calendar/services/calendar_service.dart @@ -9,5 +9,5 @@ abstract class CalendarService { factory CalendarService(Dio dio, {String baseUrl}) = _CalendarService; @GET('/api/calendar/index') - Future> getCalendar(); + Future> getCalendar(); } diff --git a/lib/features/calendar/services/calendar_service.g.dart b/lib/features/calendar/services/calendar_service.g.dart index 226da216..4dec81f0 100644 --- a/lib/features/calendar/services/calendar_service.g.dart +++ b/lib/features/calendar/services/calendar_service.g.dart @@ -19,13 +19,13 @@ class _CalendarService implements CalendarService { String? baseUrl; @override - Future> getCalendar() async { + Future> getCalendar() 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, @@ -41,8 +41,9 @@ class _CalendarService implements CalendarService { _dio.options.baseUrl, baseUrl, )))); - var _value = _result.data!.map((k, dynamic v) => - MapEntry(k, CalendarModel.fromJson(v as Map))); + var _value = _result.data! + .map((dynamic i) => CalendarModel.fromJson(i as Map)) + .toList(); return _value; } diff --git a/lib/features/diary/presentation/bloc/diary_bloc.dart b/lib/features/diary/presentation/bloc/diary_bloc.dart index 0cdad7d6..b81dd215 100644 --- a/lib/features/diary/presentation/bloc/diary_bloc.dart +++ b/lib/features/diary/presentation/bloc/diary_bloc.dart @@ -9,8 +9,6 @@ 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'; part 'diary_event.dart'; @@ -18,8 +16,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); // пользователь нажимает на шкалу настроения @@ -56,29 +53,15 @@ class DiaryBloc extends Bloc { 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")]; - 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; + 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']! * 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) { @@ -104,8 +87,6 @@ class DiaryBloc extends Bloc { SelectionPopupModel(title: "Прием пищи 6", id: 6), ]; - print(dailyNutritionRecommendations); - print(dailyNutritionIntake); emit(DiaryState.loaded( diary: diary, currentMeal: currentMeal, @@ -116,6 +97,8 @@ class DiaryBloc extends Bloc { chartData: chartDataCounted, selectedMood: currentMeal.mood, selectedSatiety: currentMeal.satiety, + wakeupController: TimeOfDay.now(), + retireController: TimeOfDay.now(), commentController: TextEditingController(), product_nameController: TextEditingController(), productQuantityController: TextEditingController(), @@ -136,54 +119,6 @@ class DiaryBloc extends Bloc { } } - fetchChartValues( - String token, - int diaryID, - Emitter emit, - ) async { - final responseChart = await http.get( - Uri.parse( - baseUrl + '/api/' + '/diary/$diaryID/dailyNutritionData/', - ), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - - if (responseChart.statusCode == 200) { - final responseBody = jsonDecode(responseChart.body); - print(responseBody); - final recommendedChartValues = - responseBody['dailyNutritionRecommendation'] - .values - .map((value) => convertToInt(value)) - .toList(); - - final consumedChartValues = responseBody['dailyNutritionIntake'] - .values - .map((value) => convertToInt(value)) - .toList(); - - print([ - recommendedChartValues, - consumedChartValues, - ]); - return [ - recommendedChartValues, - consumedChartValues, - ]; - } else { - emit(DiaryStateError( - errorMessage: 'Ошибка при декодировании данных КБЖУ')); - print('fail'); - return [ - [], - [], - ]; - } - } - Future _changeSatiety( ChangeSatiety event, Emitter emit, @@ -228,11 +163,9 @@ 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, @@ -247,11 +180,9 @@ 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, @@ -277,8 +208,7 @@ 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, @@ -297,12 +227,10 @@ class DiaryBloc extends Bloc { if (state is DiaryStateLoaded) { var currentState = state as DiaryStateLoaded; - final Map> productNutritionalValues = - await diaryRepository.inputProduct(event.input); + final Map> productNutritionalValues = await diaryRepository.inputProduct(event.input); var updatedState = currentState.copyWith( product_nameController: TextEditingController(text: event.input), - autocompleteList: - productNutritionalValues['product_nutritional_value'] ?? [], + autocompleteList: productNutritionalValues['product_nutritional_value'] ?? [], ); if (event.input.length > 3) { updatedState = updatedState.copyWith(moderationExpanded: true); @@ -448,9 +376,9 @@ class DiaryBloc extends Bloc { await diaryRepository.finishDay( currentState.diary.id, - currentState.wakeupController, - currentState.retireController, - currentState.commentController.text, + // currentState.wakeupController, + // currentState.retireController, + // currentState.commentController.text, ); add(LoadDiary()); } diff --git a/lib/features/diary/presentation/bloc/diary_state.dart b/lib/features/diary/presentation/bloc/diary_state.dart index 6feb5f14..91565766 100644 --- a/lib/features/diary/presentation/bloc/diary_state.dart +++ b/lib/features/diary/presentation/bloc/diary_state.dart @@ -26,8 +26,8 @@ abstract class DiaryState with _$DiaryState { required List autocompleteList, required Meal currentMeal, required SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + required TimeOfDay wakeupController, + required TimeOfDay retireController, TimeOfDay? mealTimeController, required TextEditingController commentController, required TextEditingController product_nameController, diff --git a/lib/features/diary/presentation/bloc/diary_state.freezed.dart b/lib/features/diary/presentation/bloc/diary_state.freezed.dart index 9bd28b2a..99328a6d 100644 --- a/lib/features/diary/presentation/bloc/diary_state.freezed.dart +++ b/lib/features/diary/presentation/bloc/diary_state.freezed.dart @@ -31,8 +31,8 @@ mixin _$DiaryState { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -68,8 +68,8 @@ mixin _$DiaryState { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -105,8 +105,8 @@ mixin _$DiaryState { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -224,8 +224,8 @@ class _$DiaryStateImpl implements _DiaryState { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -264,8 +264,8 @@ class _$DiaryStateImpl implements _DiaryState { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -304,8 +304,8 @@ class _$DiaryStateImpl implements _DiaryState { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -425,8 +425,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -465,8 +465,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -505,8 +505,8 @@ class _$DiaryStateLoadingImpl implements DiaryStateLoading { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -592,8 +592,8 @@ abstract class _$$DiaryStateLoadedImplCopyWith<$Res> { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -637,8 +637,8 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> Object? autocompleteList = null, Object? currentMeal = null, Object? portionController = null, - Object? wakeupController = freezed, - Object? retireController = freezed, + Object? wakeupController = null, + Object? retireController = null, Object? mealTimeController = freezed, Object? commentController = null, Object? product_nameController = null, @@ -697,14 +697,14 @@ class __$$DiaryStateLoadedImplCopyWithImpl<$Res> ? _value.portionController : portionController // ignore: cast_nullable_to_non_nullable as SelectionPopupModel, - wakeupController: freezed == wakeupController + wakeupController: null == wakeupController ? _value.wakeupController : wakeupController // ignore: cast_nullable_to_non_nullable - as TimeOfDay?, - retireController: freezed == retireController + as TimeOfDay, + retireController: null == retireController ? _value.retireController : retireController // ignore: cast_nullable_to_non_nullable - as TimeOfDay?, + as TimeOfDay, mealTimeController: freezed == mealTimeController ? _value.mealTimeController : mealTimeController // ignore: cast_nullable_to_non_nullable @@ -812,8 +812,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { required final List autocompleteList, required this.currentMeal, required this.portionController, - this.wakeupController, - this.retireController, + required this.wakeupController, + required this.retireController, this.mealTimeController, required this.commentController, required this.product_nameController, @@ -898,9 +898,9 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { @override final SelectionPopupModel portionController; @override - final TimeOfDay? wakeupController; + final TimeOfDay wakeupController; @override - final TimeOfDay? retireController; + final TimeOfDay retireController; @override final TimeOfDay? mealTimeController; @override @@ -1062,8 +1062,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -1130,8 +1130,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -1198,8 +1198,8 @@ class _$DiaryStateLoadedImpl implements DiaryStateLoaded { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -1304,8 +1304,8 @@ abstract class DiaryStateLoaded implements DiaryState { required final List autocompleteList, required final Meal currentMeal, required final SelectionPopupModel portionController, - final TimeOfDay? wakeupController, - final TimeOfDay? retireController, + required final TimeOfDay wakeupController, + required final TimeOfDay retireController, final TimeOfDay? mealTimeController, required final TextEditingController commentController, required final TextEditingController product_nameController, @@ -1333,8 +1333,8 @@ abstract class DiaryStateLoaded implements DiaryState { List get autocompleteList; Meal get currentMeal; SelectionPopupModel get portionController; - TimeOfDay? get wakeupController; - TimeOfDay? get retireController; + TimeOfDay get wakeupController; + TimeOfDay get retireController; TimeOfDay? get mealTimeController; TextEditingController get commentController; TextEditingController get product_nameController; @@ -1435,8 +1435,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -1475,8 +1475,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, @@ -1515,8 +1515,8 @@ class _$DiaryStateErrorImpl implements DiaryStateError { List autocompleteList, Meal currentMeal, SelectionPopupModel portionController, - TimeOfDay? wakeupController, - TimeOfDay? retireController, + TimeOfDay wakeupController, + TimeOfDay retireController, TimeOfDay? mealTimeController, TextEditingController commentController, TextEditingController product_nameController, diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 72b1ec5d..e41d0525 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -842,228 +842,6 @@ class DiaryScreen extends StatelessWidget { }; } - /*_buildNutritionChart(BuildContext context, DiaryStateLoaded state) { - final List recommendedValues = state - .recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы - final List consumedValues = state.consumedChartValues; // - return Container( - margin: EdgeInsets.symmetric(horizontal: 16.h), - padding: EdgeInsets.symmetric( - horizontal: 10.h, - vertical: 16.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: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox(height: 3.v), - Text( - "Ваш КБЖУ", - style: theme.textTheme.titleMedium, - ), - SizedBox(height: 8.v), - Text( - "От дневной суточной нормы", - style: CustomTextStyles.bodyMediumBluegray800, - ), - SizedBox(height: 19.v), - Align( - alignment: Alignment.centerRight, - child: Padding( - padding: EdgeInsets.only( - left: 30.h, - right: 12.h, - ), - child: AspectRatio( - aspectRatio: 1.5, - child: BarChart( - BarChartData( - alignment: BarChartAlignment.spaceAround, - barTouchData: BarTouchData(enabled: false), - titlesData: FlTitlesData( - show: true, - bottomTitles: AxisTitles( - sideTitles: SideTitles( - showTitles: true, - //getTitlesWidget: (value, meta) => newMethod(value), - ), - ), - ), - borderData: FlBorderData(show: false), - barGroups: [ - BarChartGroupData( - x: 0, - barRods: [ - BarChartRodData( - toY: consumedValues[0] / recommendedValues[0] * 100, - color: checkConsumedValues( - [recommendedValues[0]], [consumedValues[1]]) - ? Colors.red - : Colors.blue, - ), - ], - ), - BarChartGroupData( - x: 1, - barRods: [ - BarChartRodData( - toY: consumedValues[1] / recommendedValues[1] * 100, - color: checkConsumedValues( - [recommendedValues[1]], [consumedValues[1]]) - ? Colors.red - : Colors.blue, - ), - ], - ), - BarChartGroupData( - x: 2, - barRods: [ - BarChartRodData( - toY: consumedValues[2] / recommendedValues[2] * 100, - color: checkConsumedValues( - [recommendedValues[2]], [consumedValues[2]]) - ? Colors.red - : Colors.blue, - ), - ], - ), - BarChartGroupData( - x: 3, - barRods: [ - BarChartRodData( - toY: consumedValues[3] / recommendedValues[3] * 100, - color: checkConsumedValues( - [recommendedValues[3]], [consumedValues[3]]) - ? Colors.red - : Colors.blue, - ), - ], - ), - ], - ), - ), - ), - ), - ), - SizedBox(height: 8.v), - SizedBox(height: 2.v), - Padding( - padding: EdgeInsets.only( - left: 10.h, - right: 2.h, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Калорий", - style: theme.textTheme.bodySmall, - ), - Padding( - padding: EdgeInsets.only( - left: 25.h, - bottom: 11.v, - ), - child: Text( - "Белков", - style: theme.textTheme.bodySmall, - ), - ), - Padding( - padding: EdgeInsets.only( - left: 19.h, - bottom: 11.v, - ), - child: Text( - "Жиров", - style: theme.textTheme.bodySmall, - ), - ), - Padding( - padding: EdgeInsets.only( - left: 14.h, - bottom: 11.v, - ), - child: Text( - "Углеводов", - style: theme.textTheme.bodySmall, - ), - ), - ], - ), - ), - SizedBox(height: 2.v), - Padding( - padding: EdgeInsets.only( - left: 10.h, - right: 2.h, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "${consumedValues[0].toInt()} из ${recommendedValues[0].toInt()}", - style: theme.textTheme.bodySmall, - ), - Padding( - padding: EdgeInsets.only( - left: 25.h, - bottom: 11.v, - ), - child: Text( - "${consumedValues[1].toInt()} из ${recommendedValues[1].toInt()}", - style: theme.textTheme.bodySmall, - ), - ), - Padding( - padding: EdgeInsets.only( - left: 19.h, - bottom: 11.v, - ), - child: Text( - "${consumedValues[2].toInt()} из ${recommendedValues[2].toInt()}", - style: theme.textTheme.bodySmall, - ), - ), - Padding( - padding: EdgeInsets.only( - left: 14.h, - bottom: 11.v, - ), - child: Text( - "${consumedValues[3].toInt()} из ${recommendedValues[3].toInt()}", - style: theme.textTheme.bodySmall, - ), - ), - ], - ), - ), - SizedBox(height: 19.v), - if (checkConsumedValues(recommendedValues, consumedValues)) - Text( - "*Превышенная суточная норма", - style: theme.textTheme.labelLarge, - ), - ], - ), - ); - }*/ - - /// Section Widget _buildComment(BuildContext context, DiaryStateLoaded state) { return Container( margin: EdgeInsets.symmetric(horizontal: 16.h), @@ -1155,7 +933,7 @@ class DiaryScreen extends StatelessWidget { child: AbsorbPointer( child: CustomTextFormField( hintText: - state.wakeupController?.format(context).toString(), + state.wakeupController.format(context).toString(), prefix: Icon(Icons.sunny), autofocus: false, ), @@ -1167,7 +945,7 @@ class DiaryScreen extends StatelessWidget { child: AbsorbPointer( child: CustomTextFormField( hintText: - state.retireController?.format(context).toString(), + state.retireController.format(context).toString(), prefix: Icon(Icons.bed), autofocus: false, ), @@ -1324,7 +1102,7 @@ class DiaryScreen extends StatelessWidget { BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, - initialTime: state.wakeupController ?? TimeOfDay.now(), + initialTime: state.wakeupController, ); if (pickedTime != null && pickedTime != state.wakeupController) { context.read().add(WakeupEvent(pickedTime)); @@ -1335,7 +1113,7 @@ class DiaryScreen extends StatelessWidget { BuildContext context, DiaryStateLoaded state) async { final TimeOfDay? pickedTime = await showTimePicker( context: context, - initialTime: state.retireController ?? TimeOfDay.now(), + initialTime: state.retireController, ); if (pickedTime != null && pickedTime != state.retireController) { context.read().add(RetireEvent(pickedTime)); diff --git a/lib/features/diary/repositories/diary_repository.dart b/lib/features/diary/repositories/diary_repository.dart index 56c9fbd6..04a8cad0 100644 --- a/lib/features/diary/repositories/diary_repository.dart +++ b/lib/features/diary/repositories/diary_repository.dart @@ -1,6 +1,4 @@ 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'; @@ -189,22 +187,12 @@ class DiaryRepository { 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 ?? " ", - ); + /*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); } catch (e) { rethrow; } diff --git a/lib/features/diary/services/diary_service.dart b/lib/features/diary/services/diary_service.dart index 3c61a355..d7fa9a0c 100644 --- a/lib/features/diary/services/diary_service.dart +++ b/lib/features/diary/services/diary_service.dart @@ -22,8 +22,7 @@ abstract class DiaryService { Future getChart(@Path() int id); @GET('/api/diary/product_nutritional_values/filter') - Future>> getInputProduct( - @Query('name') String name); + Future>> getInputProduct(@Query('name') String name); @POST('/api/diary/{diary_id}/meal/{meal_id}/satiety/fill') Future> sendSatietyData( @@ -79,9 +78,9 @@ abstract class DiaryService { @POST('/api/diary/{diary_id}/finishDay') Future sendFinishDay( @Path() int diary_id, - @Query('wakeUp') String wakeup, - @Query('retire') String retire, - @Query('comment') String comment, + //@Query('wakeUp') String wakeup, + //@Query('retire') String retire, + //@Query('comment') String comment, ); @DELETE('/api/diary/{diary_id}/meal/{meal_id}/portions/{portion_id}/delete') diff --git a/lib/features/diary/services/diary_service.g.dart b/lib/features/diary/services/diary_service.g.dart index 9030ebb2..aba060cd 100644 --- a/lib/features/diary/services/diary_service.g.dart +++ b/lib/features/diary/services/diary_service.g.dart @@ -365,18 +365,9 @@ class _DiaryService implements DiaryService { } @override - Future sendFinishDay( - int diary_id, - String wakeup, - String retire, - String comment, - ) async { + Future sendFinishDay(int diary_id) async { final _extra = {}; - final queryParameters = { - r'wakeUp': wakeup, - r'retire': retire, - r'comment': comment, - }; + final queryParameters = {}; final _headers = {}; const Map? _data = null; await _dio.fetch(_setStreamType(Options( diff --git a/lib/locator_service.dart b/lib/locator_service.dart index e62214ae..592aff96 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -6,15 +6,18 @@ import 'package:eatvio_app/features/blog_post/repositories/blog_post_repository. import 'package:eatvio_app/features/blog_post/services/blog_post_service.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; +import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_cubit.dart'; +import 'package:eatvio_app/features/calendar/repositories/calendar_repository.dart'; +import 'package:eatvio_app/features/calendar/services/calendar_service.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart'; import 'package:eatvio_app/features/chat/repositories/chat_repository.dart'; import 'package:eatvio_app/features/chat/services/chat_service.dart'; -import 'package:eatvio_app/features/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: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_bloc.dart'; +import 'package:eatvio_app/features/diary/repositories/diary_repository.dart'; +import 'package:eatvio_app/features/diary/services/diary_service.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/features/registration/repositories/registration_repository.dart'; import 'package:eatvio_app/features/registration/services/registration_service.dart'; @@ -33,6 +36,7 @@ Future init() async { sl.registerFactory(() => FeedCubit(feedRepository: sl())); sl.registerFactory(() => BlogPostCubit(blogPostRepository: sl())); sl.registerFactory(() => DiaryBloc(diaryRepository: sl())); + sl.registerFactory(() => CalendarCubit(calendarRepository: sl())); // Repository sl.registerLazySingleton(() => ChatRepository(chatService: sl())); @@ -40,6 +44,7 @@ Future init() async { sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl())); sl.registerLazySingleton(() => RegistrationRepository(registrationService: sl())); sl.registerLazySingleton(() => DiaryRepository(diaryService: sl())); + sl.registerLazySingleton(() => CalendarRepository(calendarService: sl())); // Services sl.registerLazySingleton(() => ChatService(sl())); @@ -47,6 +52,7 @@ Future init() async { sl.registerLazySingleton(() => BlogPostService(sl())); sl.registerLazySingleton(() => RegistrationService(sl())); sl.registerLazySingleton(() => DiaryService(sl())); + sl.registerLazySingleton(() => CalendarService(sl())); // External sl.registerLazySingleton( diff --git a/lib/main.dart b/lib/main.dart index 5ccc52d1..743ac0c3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,9 @@ import 'package:eatvio_app/app_router.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_state.dart'; -import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; -import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/pages/chat_select_screen/bloc/chat_select_bloc.dart'; 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' as di; import 'package:eatvio_app/locator_service.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'; @@ -14,11 +11,12 @@ import 'package:eatvio_app/presentation/profile/my_profile_screen/models/my_prof import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:hive_flutter/hive_flutter.dart'; -import 'package:keyboard_dismisser/keyboard_dismisser.dart'; -import 'package:path_provider/path_provider.dart'; - import 'core/app_export.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:keyboard_dismisser/keyboard_dismisser.dart'; +import 'package:eatvio_app/locator_service.dart' as di; +import 'package:intl/date_symbol_data_local.dart'; var globalMessengerKey = GlobalKey(); @@ -34,7 +32,7 @@ void main() async { DeviceOrientation.portraitUp, ]); await PrefUtils().init(); - runApp(MyApp()); + initializeDateFormatting().then((_) => runApp(MyApp())); } class MyApp extends StatelessWidget { @@ -42,9 +40,7 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (context) => sl()), - BlocProvider(create: (context) => sl()), - BlocProvider(create: (context) => sl()), + 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())), @@ -52,6 +48,7 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => ChatSelectBloc(ChatSelectState(chatSelectModelObj: ChatSelectModel()))..add(ChatSelectInitialEvent()), ), + BlocProvider(create: (context) => sl()..loadCalendarList()), ], child: BlocListener( listener: (BuildContext context, InitializationState state) {}, diff --git a/lib/widgets/custom_navigation_menu.dart b/lib/widgets/custom_navigation_menu.dart index 5868bf01..b35d5fbd 100644 --- a/lib/widgets/custom_navigation_menu.dart +++ b/lib/widgets/custom_navigation_menu.dart @@ -22,19 +22,21 @@ class CustomNavigationMenu extends StatelessWidget { icon: ImageConstant.imgRecipes, text: 'Мои рецепты', onTap: () => GoRouter.of(context).push('/recipe-select-screen'), - // Действие при нажатии на "Мои рецепты" ), MenuItem( icon: ImageConstant.imgDiets, text: 'Мои диеты', onTap: () => GoRouter.of(context).push('/diet-select-screen'), - // Действие при нажатии на "Мои рецепты" ), MenuItem( icon: ImageConstant.imgPlans, text: 'Мои планы', onTap: () => GoRouter.of(context).push('/plan-select-screen'), - // Действие при нажатии на "Мои рецепты" + ), + MenuItem( + icon: ImageConstant.imgRecipes, + text: 'Календарь', + onTap: () => GoRouter.of(context).push('/calendar-screen'), ), MenuItem( icon: ImageConstant.imgFinance, @@ -44,15 +46,12 @@ class CustomNavigationMenu extends StatelessWidget { MenuItem( icon: ImageConstant.imgSupport, text: 'Поддержка', - onTap: () { - // Действие при нажатии на "Поддержка" - }, + onTap: () {}, ), MenuItem( icon: ImageConstant.imgExit, text: 'Выход', onTap: _onTapLogout(context), - // Действие при нажатии на "Выход" ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index 5a8d7e6d..21520bf5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,6 +46,7 @@ dependencies: google_fonts: ^6.2.1 location: ^7.0.0 syncfusion_flutter_charts: ^26.1.42 + table_calendar: ^3.1.2 dev_dependencies: build_runner: ^2.4.11