From b18e90b249a8bdc160add4738dc87fcf78ad500a Mon Sep 17 00:00:00 2001 From: Roland Geider Date: Sat, 26 Dec 2020 12:56:53 +0100 Subject: [PATCH] Allow to log meals all at once --- lib/models/nutrition/log.dart | 62 +++++++++++++++++++++++++-------- lib/models/nutrition/log.g.dart | 48 +++++++++++++++++++++++++ lib/providers/nutrition.dart | 19 ++++++++++ lib/widgets/nutrition/meal.dart | 13 +------ 4 files changed, 115 insertions(+), 27 deletions(-) create mode 100644 lib/models/nutrition/log.g.dart diff --git a/lib/models/nutrition/log.dart b/lib/models/nutrition/log.dart index 9cc71860..cb2a8772 100644 --- a/lib/models/nutrition/log.dart +++ b/lib/models/nutrition/log.dart @@ -16,26 +16,58 @@ * along with this program. If not, see . */ -import 'package:flutter/foundation.dart'; +import 'package:json_annotation/json_annotation.dart'; import 'package:wger/models/nutrition/ingredient.dart'; import 'package:wger/models/nutrition/ingredient_weight_unit.dart'; +import 'package:wger/models/nutrition/meal_item.dart'; +part 'log.g.dart'; + +@JsonSerializable() class Log { - final int id; - final int nutritionalPlanId; - final DateTime date; - final String comment; - final Ingredient ingredient; - final IngredientWeightUnit weightUnit; - final double amount; + @JsonKey(required: true) + int id; + + @JsonKey(required: true, name: 'plan') + int planId; + + @JsonKey(required: true) + DateTime datetime; + + String comment; + + @JsonKey(required: true, name: 'ingredient') + int ingredientId; + + Ingredient ingredientObj; + + @JsonKey(required: true) + int weightUnit; + + IngredientWeightUnit weightUnitObj; + + @JsonKey(required: true) + double amount; Log({ - @required this.id, - @required this.ingredient, - @required this.weightUnit, - @required this.amount, - @required this.nutritionalPlanId, - @required this.date, - @required this.comment, + this.id, + this.ingredientId, + this.ingredientObj, + this.weightUnit, + this.weightUnitObj, + this.amount, + this.planId, + this.datetime, + this.comment, }); + + Log.fromMealItem(MealItem mealItem) { + this.ingredientId = mealItem.ingredientId; + this.weightUnit = null; + this.amount = mealItem.amount; + } + + // Boilerplate + factory Log.fromJson(Map json) => _$LogFromJson(json); + Map toJson() => _$LogToJson(this); } diff --git a/lib/models/nutrition/log.g.dart b/lib/models/nutrition/log.g.dart new file mode 100644 index 00000000..05936d3e --- /dev/null +++ b/lib/models/nutrition/log.g.dart @@ -0,0 +1,48 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'log.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Log _$LogFromJson(Map json) { + $checkKeys(json, requiredKeys: const [ + 'id', + 'plan', + 'datetime', + 'ingredient', + 'weightUnit', + 'amount' + ]); + return Log( + id: json['id'] as int, + ingredientId: json['ingredient'] as int, + ingredientObj: json['ingredientObj'] == null + ? null + : Ingredient.fromJson(json['ingredientObj'] as Map), + weightUnit: json['weightUnit'] as int, + weightUnitObj: json['weightUnitObj'] == null + ? null + : IngredientWeightUnit.fromJson( + json['weightUnitObj'] as Map), + amount: (json['amount'] as num)?.toDouble(), + planId: json['plan'] as int, + datetime: json['datetime'] == null + ? null + : DateTime.parse(json['datetime'] as String), + comment: json['comment'] as String, + ); +} + +Map _$LogToJson(Log instance) => { + 'id': instance.id, + 'plan': instance.planId, + 'datetime': instance.datetime?.toIso8601String(), + 'comment': instance.comment, + 'ingredient': instance.ingredientId, + 'ingredientObj': instance.ingredientObj, + 'weightUnit': instance.weightUnit, + 'weightUnitObj': instance.weightUnitObj, + 'amount': instance.amount, + }; diff --git a/lib/providers/nutrition.dart b/lib/providers/nutrition.dart index 37b1e80f..0d052e62 100644 --- a/lib/providers/nutrition.dart +++ b/lib/providers/nutrition.dart @@ -22,6 +22,7 @@ import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'package:wger/models/http_exception.dart'; import 'package:wger/models/nutrition/ingredient.dart'; +import 'package:wger/models/nutrition/log.dart'; import 'package:wger/models/nutrition/meal.dart'; import 'package:wger/models/nutrition/meal_item.dart'; import 'package:wger/models/nutrition/nutritional_plan.dart'; @@ -35,6 +36,7 @@ class Nutrition extends WgerBaseProvider with ChangeNotifier { static const mealItemUrl = 'mealitem'; static const ingredientUrl = 'ingredient'; static const ingredientSearchUrl = 'ingredient/search'; + static const nutritionDiaryUrl = 'nutritiondiary'; String _url; Auth _auth; @@ -244,4 +246,21 @@ class Nutrition extends WgerBaseProvider with ChangeNotifier { // Process the response return json.decode(utf8.decode(response.bodyBytes))['suggestions'] as List; } + + /// Log meal to nutrition diary + Future addMealToDiary(Meal meal, {http.Client client}) async { + if (client == null) { + client = http.Client(); + } + + //var meal = findMealById(mealId); + for (var item in meal.mealItems) { + Log log = Log.fromMealItem(item); + log.planId = findById(meal.plan).id; + log.datetime = DateTime.now(); + + await add(log.toJson(), client, nutritionDiaryUrl); + } + notifyListeners(); + } } diff --git a/lib/widgets/nutrition/meal.dart b/lib/widgets/nutrition/meal.dart index c48232c1..2311409f 100644 --- a/lib/widgets/nutrition/meal.dart +++ b/lib/widgets/nutrition/meal.dart @@ -185,18 +185,7 @@ class DismissibleMealHeader extends StatelessWidget { // Log meal } else { - showDialog( - context: context, - builder: (context) => AlertDialog( - content: Text('Would log this meal'), - actions: [ - TextButton( - child: Text("Close"), - onPressed: () => Navigator.of(context).pop(), - ), - ], - ), - ); + Provider.of(context, listen: false).addMealToDiary(_meal); } return false; },