feat(diary): Nutrition chart API methods implemented

This commit is contained in:
2024-04-03 14:03:06 +03:00
parent 76a421bba5
commit 64c25f11fe
6 changed files with 170 additions and 113 deletions

View File

@@ -70,70 +70,97 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
if (diary is Map<String, dynamic>) {
final String diaryDate =
diary['date'] ?? DateTime.now().toString();
// Продолжайте обработку данных дневника
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,
autocompleteList: currentState.autocompleteList,
diaryEditModelObj: currentState.diaryEditModelObj));
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'];
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 {
// Если текущее состояние - начальное, создаем новое загруженное состояние
emit(DiaryEditLoadedState(
currentMeal: SelectionPopupModel(
id: 1, title: "Прием пищи 1", isSelected: true),
portionController: SelectionPopupModel(
id: 0, title: "порций", isSelected: true),
wakeupExpanded: true,
moodExpanded: true,
moderationExpanded: false,
token: token,
recommendedChartValues: recommendedChartValues.values
.map<int>((value) => value as int)
.toList(),
consumedChartValues: consumedChartValues.values
.map<int>((value) => value as int)
.toList() ??
[0, 0, 0, 0],
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: fillMealList(),
portionList: fillPortions())));
}
} else {
// Если текущее состояние - начальное, создаем новое загруженное состояние
emit(DiaryEditLoadedState(
currentMeal: SelectionPopupModel(
id: 1, title: "Прием пищи 1", isSelected: true),
portionController: SelectionPopupModel(
id: 0, title: "порций", isSelected: true),
wakeupExpanded: true,
moodExpanded: true,
moderationExpanded: false,
token: token,
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: fillMealList(),
portionList: fillPortions())));
emit(DiaryEditErrorState(
'Ошибка при декодировании данных КБЖУ'));
}
} else {
// Ошибка при декодировании JSON
@@ -191,44 +218,65 @@ class DiaryEditBloc extends Bloc<DiaryEditEvent, DiaryEditState> {
if (diary is Map<String, dynamic>) {
final String diaryDate = diary['date'] ?? DateTime.now().toString();
// Продолжайте обработку данных дневника
// Если текущее состояние - начальное, создаем новое загруженное состояние
try {
await Future(() => emit(DiaryEditLoadedState(
currentMeal: SelectionPopupModel(
id: 1, title: "Прием пищи 1", isSelected: true),
portionController: SelectionPopupModel(
id: 0, title: "порций", isSelected: true),
wakeupExpanded: true,
moodExpanded: true,
moderationExpanded: false,
token: token,
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: fillMealList(), portionList: fillPortions()))));
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'];
try {
await Future(() => emit(DiaryEditLoadedState(
currentMeal: SelectionPopupModel(
id: 1, title: "Прием пищи 1", isSelected: true),
portionController: SelectionPopupModel(
id: 0, title: "порций", isSelected: true),
wakeupExpanded: true,
moodExpanded: true,
moderationExpanded: false,
token: token,
recommendedChartValues: recommendedChartValues.values
.map<int>((value) => value as int)
.toList(),
consumedChartValues: consumedChartValues.values
.map<int>((value) => value as int)
.toList(),
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: fillMealList(),
portionList: fillPortions()))));
print("Updated");
} catch (e) {
print("Ошибка при создании нового состояния $e");
print("Updated");
} catch (e) {
print("Ошибка при создании нового состояния $e");
}
} else {
emit(DiaryEditErrorState('Ошибка при декодировании данных КБЖУ'));
}
} else {
emit(DiaryEditErrorState(

View File

@@ -39,6 +39,8 @@ class DiaryEditLoadedState extends DiaryEditState {
this.fatsController,
this.proteinsController,
this.carbsController,
required this.recommendedChartValues,
required this.consumedChartValues,
required this.diaryId,
required this.selectedSatiety,
required this.moderationExpanded,
@@ -53,6 +55,8 @@ class DiaryEditLoadedState extends DiaryEditState {
List<dynamic>? portions;
List<dynamic>? photos;
List<dynamic>? autocompleteList;
List<int> recommendedChartValues;
List<int> consumedChartValues;
SelectionPopupModel? currentMeal;
SelectionPopupModel? portionController;
TimeOfDay? wakeupController;
@@ -79,6 +83,8 @@ class DiaryEditLoadedState extends DiaryEditState {
meals,
portions,
photos,
recommendedChartValues,
consumedChartValues,
autocompleteList,
wakeupController,
retireController,
@@ -105,6 +111,8 @@ class DiaryEditLoadedState extends DiaryEditState {
SelectionPopupModel? portionController,
String? diaryDate,
String? token,
List<int>? recommendedChartValues,
List<int>? consumedChartValues,
List<dynamic>? meals,
List<dynamic>? portions,
List<dynamic>? photos,
@@ -133,6 +141,9 @@ class DiaryEditLoadedState extends DiaryEditState {
meals: meals ?? this.meals,
autocompleteList: autocompleteList ?? this.autocompleteList,
portions: portions ?? this.portions,
recommendedChartValues:
recommendedChartValues ?? this.recommendedChartValues,
consumedChartValues: consumedChartValues ?? this.consumedChartValues,
wakeupController: wakeupController ?? this.wakeupController,
retireController: retireController ?? this.retireController,
mealTimeController: mealTimeController ?? this.mealTimeController,

View File

@@ -79,7 +79,7 @@ class DiaryEditScreen extends StatelessWidget {
SizedBox(height: 20.v),
_buildMood(context, state),
SizedBox(height: 30.v),
_buildNutritionChart(context),
_buildNutritionChart(context, state),
SizedBox(height: 30.v),
_buildComment(context, state),
],
@@ -700,14 +700,10 @@ class DiaryEditScreen extends StatelessWidget {
};
}
_buildNutritionChart(BuildContext context) {
final List<double> recommendedValues = [
2000,
70,
50,
300
]; // Рекомендуемые значения: калории, жиры, белки, углеводы
final List<double> consumedValues = [1800, 60, 40, 250]; //
_buildNutritionChart(BuildContext context, DiaryEditLoadedState state) {
final List<int> recommendedValues = state
.recommendedChartValues; // Рекомендуемые значения: калории, жиры, белки, углеводы
final List<int> consumedValues = state.consumedChartValues; //
return Container(
margin: EdgeInsets.symmetric(horizontal: 16.h),
padding: EdgeInsets.symmetric(
@@ -1210,7 +1206,7 @@ class DiaryEditScreen extends StatelessWidget {
}
bool checkConsumedValues(
List<double> recommendedValues, List<double> consumedValues) {
List<int> recommendedValues, List<int> consumedValues) {
for (int i = 0; i < recommendedValues.length; i++) {
if (consumedValues[i] > recommendedValues[i]) {
// Если хотя бы одно потребленное значение превышает рекомендованное

View File

@@ -4,7 +4,7 @@ import '/core/app_export.dart';
import 'package:eatvio_app/presentation/profile/my_profile_screen/models/my_profile_model.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:hive/hive.dart';
//import 'package:hive/hive.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
part 'my_profile_event.dart';

View File

@@ -81,7 +81,7 @@ class _ExpandableListState extends State<ExpandableList> {
}
_buildForm(BuildContext context, MyProfileLoadedState state) {
List<String> cities = [
/*List<String> cities = [
'Москва',
'Санкт-Петербург',
'Новосибирск',
@@ -115,7 +115,7 @@ class _ExpandableListState extends State<ExpandableList> {
];
List<String> countries = [
'Россия',
];
];*/
final digitsOnly = FilteringTextInputFormatter.digitsOnly;
return Column(children: [
TextField(

View File

@@ -27,6 +27,8 @@ void main() {
portions: [],
wakeupExpanded: false,
moderationExpanded: false,
recommendedChartValues: [10, 10, 10, 10],
consumedChartValues: [1, 2, 3, 4],
moodExpanded: false);
await tester.pumpWidget(