diff --git a/lib/components/basket_item_card.dart b/lib/components/basket_item_card.dart index c383759..1a7d91e 100644 --- a/lib/components/basket_item_card.dart +++ b/lib/components/basket_item_card.dart @@ -5,7 +5,9 @@ class BasketItemCard extends StatelessWidget { final String price; final String id; final Image image; - final VoidCallback onTap; + final String quantity; + final VoidCallback onTapPlus; + final VoidCallback onTapMinus; const BasketItemCard({ super.key, @@ -13,7 +15,9 @@ class BasketItemCard extends StatelessWidget { required this.price, required this.id, required this.image, - required this.onTap, + required this.onTapPlus, + required this.quantity, + required this.onTapMinus, }); @override @@ -57,9 +61,21 @@ class BasketItemCard extends StatelessWidget { ) ], ), - IconButton( - onPressed: onTap, - icon: const Icon(Icons.close), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: const Icon(Icons.remove), + onPressed: onTapMinus, + ), + const SizedBox(width: 10), + Text(quantity), + const SizedBox(width: 10), + IconButton( + icon: const Icon(Icons.add), + onPressed: onTapPlus, + ), + ], ) ], ), diff --git a/lib/pages/basket.dart b/lib/pages/basket.dart index bbcd739..cd3cd26 100644 --- a/lib/pages/basket.dart +++ b/lib/pages/basket.dart @@ -42,7 +42,6 @@ List> cart = [ } ]; -//TODO: Сделать правильное удаление из корзины по одному class BasketPage extends StatefulWidget { const BasketPage({super.key}); @@ -59,22 +58,51 @@ class _BasketPageState extends State { super.initState(); getCart().then((value) { setState(() { - cartItems = cart - .where((element) => value.any((e) => e['id'] == element['id'])) - .toList(); - totalPrice = - cartItems.fold(0, (sum, item) => sum + int.parse(item['price'])); + cartItems = value.map((element) { + final item = cart.firstWhere((e) => e['id'] == element['id']); + return {...item, 'count': element['count'] as int}; + }).toList(); + totalPrice = cartItems.fold( + 0, + (sum, item) => + sum + int.parse(item['price']) * item['count'] as int); }); }); } void removeItem(String id) async { + final item = cartItems.firstWhere((element) => element['id'] == id); + bool toDelete = false; setState(() { - cartItems.removeWhere((element) => element['id'] == id); - totalPrice = - cartItems.fold(0, (sum, item) => sum + int.parse(item['price'])); + if (item['count'] > 1) { + item['count']--; + cartItems[cartItems.indexOf(item)]['count'] = item['count']; + } else { + toDelete = true; + } + totalPrice = cartItems.fold(0, + (sum, item) => sum + int.parse(item['price']) * item['count'] as int); }); - await removeItemFromCart(id); + if (toDelete) { + await _deleteItemAlert(id, item['name']); + } else { + await removeItemFromCart(id); + } + } + + void addItem(String id) async { + setState(() { + final item = cartItems.firstWhere((element) => element['id'] == id, + orElse: () => { + ...cart.firstWhere((element) => element['id'] == id), + 'count': 0 + }); + item['count']++; + cartItems[cartItems.indexOf(item)]['count'] = item['count']; + totalPrice = cartItems.fold(0, + (sum, item) => sum + int.parse(item['price']) * item['count'] as int); + }); + await addItemToCart(id); } Future _deleteItemAlert(String id, String name) async { @@ -101,7 +129,10 @@ class _BasketPageState extends State { TextButton( child: const Text('Удалить'), onPressed: () { - removeItem(id); + removeItemFromCart(id); + setState(() { + cartItems.removeWhere((element) => element['id'] == id); + }); Navigator.of(context).pop(); }, ), @@ -196,8 +227,10 @@ class _BasketPageState extends State { item['image'], width: 50, ), - onTap: () => - _deleteItemAlert(item['id'], item['name']), + onTapPlus: () => addItem(item['id'].toString()), + onTapMinus: () => + removeItem(item['id'].toString()), + quantity: item['count'].toString(), ); }, ), diff --git a/lib/pages/detail.dart b/lib/pages/detail.dart index 7a4598f..8e5ca7f 100644 --- a/lib/pages/detail.dart +++ b/lib/pages/detail.dart @@ -78,7 +78,9 @@ class _DetailPageState extends State { }); }, ), + const SizedBox(width: 10), Text('$quantity'), + const SizedBox(width: 10), IconButton( icon: const Icon(Icons.add), onPressed: () async { diff --git a/pubspec.yaml b/pubspec.yaml index fac9096..d06427e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,6 +38,7 @@ dependencies: url_launcher: ^6.2.6 shared_preferences: ^2.2.3 flutter_markdown: ^0.7.1 + http: ^1.2.1 dev_dependencies: flutter_test: