diff --git a/shop_app/lib/const.dart b/shop_app/lib/const.dart index 98f146f..a71cd5c 100644 --- a/shop_app/lib/const.dart +++ b/shop_app/lib/const.dart @@ -5,3 +5,7 @@ Uri kPrdouctUrl() { Uri kProductUrlWithId(String id) { return Uri.parse(''); } + +Uri kOrderUrl() { + return Uri.parse(''); +} diff --git a/shop_app/lib/providers/orders.dart b/shop_app/lib/providers/orders.dart index f121091..eafd123 100644 --- a/shop_app/lib/providers/orders.dart +++ b/shop_app/lib/providers/orders.dart @@ -1,5 +1,9 @@ +import 'dart:convert'; + import 'package:flutter/foundation.dart'; +import 'package:shop_app/const.dart'; import 'package:shop_app/providers/cart.dart'; +import 'package:http/http.dart' as http; class OrderItem { final String id; @@ -21,11 +25,31 @@ class Orders with ChangeNotifier { return [..._orders]; } - void addOrder(List cartProducts, double total) { + Future addOrder(List cartProducts, double total) async { + final timestamp = DateTime.now(); + final response = await http.post( + kOrderUrl(), + body: json.encode( + { + 'amount': total, + 'dateTime': timestamp.toIso8601String(), + 'products': cartProducts + .map( + (cp) => { + 'id': cp.id, + 'title': cp.title, + 'quantity': cp.quantity, + 'price': cp.price + }, + ) + .toList() + }, + ), + ); _orders.insert( 0, OrderItem( - id: DateTime.now().toString(), + id: json.decode(response.body)['name'], amount: total, products: cartProducts, dateTime: DateTime.now(), diff --git a/shop_app/lib/screens/cart_screen.dart b/shop_app/lib/screens/cart_screen.dart index 2016c06..a884ba2 100644 --- a/shop_app/lib/screens/cart_screen.dart +++ b/shop_app/lib/screens/cart_screen.dart @@ -40,22 +40,7 @@ class CartScreen extends StatelessWidget { ), backgroundColor: Theme.of(context).primaryColor, ), - TextButton( - onPressed: () { - Provider.of(context, listen: false).addOrder( - cart.items.values.toList(), - cart.totalAmount, - ); - cart.clear(); - Navigator.of(context).pushNamed(OrdersScreen.routeId); - }, - child: Text( - 'ORDER NOW', - style: TextStyle( - color: Theme.of(context).primaryColor, - ), - ), - ), // ) + OrderButton(cart: cart), ], ), ), @@ -80,3 +65,48 @@ class CartScreen extends StatelessWidget { ); } } + +class OrderButton extends StatefulWidget { + const OrderButton({ + Key key, + @required this.cart, + }) : super(key: key); + + final Cart cart; + + @override + _OrderButtonState createState() => _OrderButtonState(); +} + +class _OrderButtonState extends State { + bool _isLoading = false; + + @override + Widget build(BuildContext context) { + return TextButton( + onPressed: (widget.cart.totalAmount <= 0 || _isLoading) + ? null + : () async { + setState(() { + _isLoading = true; + }); + await Provider.of(context, listen: false).addOrder( + widget.cart.items.values.toList(), + widget.cart.totalAmount, + ); + setState(() { + _isLoading = false; + }); + widget.cart.clear(); + }, + child: _isLoading + ? CircularProgressIndicator() + : Text( + 'ORDER NOW', + style: TextStyle( + color: Theme.of(context).primaryColor, + ), + ), + ); + } +}