11import 'package:eat_somewhere/data/food.dart' ;
22import 'package:eat_somewhere/data/helper.dart' ;
3+ import 'package:eat_somewhere/screens/create_ingredient_dialog.dart' ;
4+ import 'package:eat_somewhere/service/storage.dart' ;
5+ import 'package:eat_somewhere/widgets/error_dialog.dart' ;
6+ import 'package:eat_somewhere/widgets/info_dialog.dart' ;
7+ import 'package:eat_somewhere/widgets/padded_card.dart' ;
8+ import 'package:eat_somewhere/widgets/yes_cancel_dialog.dart' ;
39import 'package:flutter/material.dart' ;
410
511class IngredientWidget extends StatefulWidget {
612 Ingredient ingredient;
713 Function () onTap;
14+ Function ()? ingredientRemoved;
815
9- IngredientWidget ({required this .ingredient, required this .onTap, Key ? key})
16+ IngredientWidget ({required this .ingredient, required this .onTap, required this .ingredientRemoved, Key ? key})
1017 : super (key: key);
1118
1219 @override
@@ -16,10 +23,51 @@ class IngredientWidget extends StatefulWidget {
1623class _IngredientWidgetState extends State <IngredientWidget > {
1724 @override
1825 Widget build (BuildContext context) {
19- return ListTile (
20- title: Text (widget.ingredient.name ?? "Unknown" ),
21- subtitle: Text ("${widget .ingredient .amount } ${widget .ingredient .unit .name } - ${PriceHelper .formatPriceWithUnit (widget .ingredient .cost )}" ),
26+ return PaddedCard (
2227 onTap: widget.onTap,
23- );
28+ child: Row (
29+ spacing: 10 ,
30+ mainAxisAlignment: MainAxisAlignment .spaceBetween,
31+ children: [
32+ Column (
33+ crossAxisAlignment: CrossAxisAlignment .start,
34+ children: [
35+ Text (widget.ingredient.name ?? "Unknown" ),
36+ Text ("~ ${PriceHelper .formatPriceWithUnit (widget .ingredient .cost )} per ${widget .ingredient .amount } ${widget .ingredient .unit .name }" ),
37+ ]),
38+ Row (
39+ spacing: 10 ,
40+ children: [
41+ if (widget.ingredientRemoved != null ) IconButton (
42+ icon: const Icon (Icons .delete),
43+ onPressed: () async {
44+ if (await YesCancelDialog .show ("Archive Ingredient" , "Do you really want to archive '${widget .ingredient .name }'? This cannot be undone" ) == true ) {
45+ String ? error = await Storage .deleteIngredient (widget.ingredient);
46+ if (error != null ) {
47+ ErrorDialog .show ("Error archiving Ingredient" , error);
48+ return ;
49+ }
50+ InfoDialog .show ("Ingredient archived" , "Ingredient '${widget .ingredient .name }' was successfully archived" );
51+ widget.ingredientRemoved? .call ();
52+ }
53+ }),
54+ IconButton (
55+ icon: const Icon (Icons .edit),
56+ onPressed: () async {
57+ Ingredient ? newIngredient = await showDialog (
58+ context: context,
59+ builder: (builder) => CreateIngredientDialog (
60+ ingredient: widget.ingredient
61+ ));
62+ widget.ingredientRemoved? .call ();
63+ setState (() {});
64+ }),
65+ IconButton (
66+ icon: const Icon (Icons .add),
67+ onPressed: widget.onTap),
68+ ],
69+ )
70+ ],
71+ ));
2472 }
2573}
0 commit comments