fooder-app/lib/widgets/meal.dart

149 lines
4.2 KiB
Dart
Raw Normal View History

2023-07-29 19:21:02 +02:00
import 'package:flutter/material.dart';
2023-07-30 15:31:36 +02:00
import 'package:fooder/models/meal.dart';
import 'package:fooder/widgets/entry.dart';
import 'package:fooder/widgets/macro.dart';
import 'package:fooder/screens/edit_entry.dart';
import 'package:fooder/client.dart';
2023-07-29 19:21:02 +02:00
import 'dart:core';
class MealWidget extends StatelessWidget {
final Meal meal;
final ApiClient apiClient;
final Function() refreshParent;
2023-07-29 19:21:02 +02:00
2023-08-28 14:45:32 +02:00
const MealWidget(
{super.key,
required this.meal,
required this.apiClient,
required this.refreshParent});
2023-07-29 19:21:02 +02:00
2023-10-27 17:10:09 +02:00
Future<void> saveMeal(context) async {
TextEditingController textFieldController = TextEditingController();
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Save Meal'),
content: TextField(
controller: textFieldController,
decoration: const InputDecoration(hintText: "Meal template name"),
),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.cancel),
onPressed: () {
Navigator.pop(context);
},
),
IconButton(
icon: const Icon(Icons.save),
onPressed: () {
apiClient.saveMeal(meal, textFieldController.text);
Navigator.pop(context);
},
),
],
);
},
);
}
Future<void> _deleteMeal(Meal meal) async {
await apiClient.deleteMeal(meal.id);
refreshParent();
}
Future<void> deleteMeal(context) async {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Confirm deletion of the meal'),
actions: <Widget>[
IconButton(
icon: const Icon(Icons.cancel),
onPressed: () {
Navigator.pop(context);
},
),
IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
_deleteMeal(meal);
Navigator.pop(context);
},
),
],
);
},
);
}
2023-07-29 19:21:02 +02:00
@override
Widget build(BuildContext context) {
return Card(
child: Padding(
2023-08-28 14:45:32 +02:00
padding: const EdgeInsets.only(
top: 36.0, left: 6.0, right: 6.0, bottom: 6.0),
child: ExpansionTile(
title: Column(
children: <Widget>[
Row(
children: <Widget>[
Expanded(
child: Text(
meal.name,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: Theme.of(context).colorScheme.primary,
),
2023-07-29 23:54:51 +02:00
),
),
2023-10-27 17:10:09 +02:00
IconButton(
icon: const Icon(Icons.delete),
onPressed: () {deleteMeal(context);},
),
IconButton(
icon: const Icon(Icons.save),
onPressed: () {saveMeal(context);},
),
2023-08-28 14:45:32 +02:00
Text("${meal.calories.toStringAsFixed(1)} kcal"),
],
),
MacroWidget(
protein: meal.protein,
carb: meal.carb,
fat: meal.fat,
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
color: Theme.of(context).colorScheme.secondary,
),
),
],
),
children: <Widget>[
for (var entry in meal.entries)
ListTile(
title: EntryWidget(
entry: entry,
2023-07-29 23:54:51 +02:00
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => EditEntryScreen(
apiClient: apiClient,
entry: entry,
),
),
).then((_) {
refreshParent();
});
},
2023-08-28 14:45:32 +02:00
)
2023-07-29 19:21:02 +02:00
],
),
),
);
}
}