Skip to content

Commit

Permalink
task: order, order items, pay now setup
Browse files Browse the repository at this point in the history
  • Loading branch information
Atuoha committed Oct 11, 2022
1 parent 8a67327 commit 7957685
Show file tree
Hide file tree
Showing 21 changed files with 286 additions and 49 deletions.
2 changes: 2 additions & 0 deletions lib/models/order.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ class Order {
final String id;
final double totalPrice;
final List<CartItem> items;
final DateTime orderDate;

Order({
required this.id,
required this.totalPrice,
required this.items,
required this.orderDate,
});
}
1 change: 1 addition & 0 deletions lib/providers/order.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class OrderData extends ChangeNotifier {
id: DateTime.now().toString(),
totalPrice: order.totalPrice,
items: order.items,
orderDate: DateTime.now(),
);

_orderItems.add(item);
Expand Down
18 changes: 15 additions & 3 deletions lib/views/main/customer/cart.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,22 @@ class _CartScreenState extends State<CartScreen> {
// checking out cart items
List<CartItem> items = cartData.cartItems;
var totalPrice = cartData.cartTotalPrice;
orderData.addToOrder(Order(id: '', totalPrice: totalPrice, items: items));
orderData.addToOrder(
Order(
id: '',
totalPrice: totalPrice,
items: items,
orderDate: DateTime.now(),
),
);
_clearCart();
Navigator.of(context).pushNamed(CustomerOrderScreen.routeName);
Navigator.of(context)
.pushNamed(
CustomerOrderScreen.routeName,
)
.then(
(value) => Navigator.of(context).pop(),
);
}

// confirmation for checkout and clear cart
Expand Down Expand Up @@ -80,7 +93,6 @@ class _CartScreenState extends State<CartScreen> {
),
onPressed: () {
operation == Operation.clearCart ? _clearCart() : _checkOut();
Navigator.of(context).pop();
},
child: const Text(
'Yes',
Expand Down
304 changes: 262 additions & 42 deletions lib/views/main/customer/order.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import '../../../constants/colors.dart';
import 'package:provider/provider.dart';
import '../../../constants/colors.dart';
import '../../../providers/order.dart';
import 'package:intl/intl.dart' as intl;

import '../product/details.dart';

class CustomerOrderScreen extends StatelessWidget {
static const routeName = '/customer_orders';
Expand All @@ -14,6 +17,61 @@ class CustomerOrderScreen extends StatelessWidget {
Widget build(BuildContext context) {
var orderData = Provider.of<OrderData>(context, listen: false);

// remove from order
void removeFromOrder(String id) {
orderData.removeFromOrder(id);
}

// payNow
void payNow() {
// TODO: Implement Pay now
}

// payNow Dialog
void payNowDialog() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Pay Now'),
content: Text(
'Are you sure you want to pay now; \$${orderData.orderTotalPrice} ?',
),
actions: [
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: () => payNow(),
child: const Text(
'Yes',
style: TextStyle(
color: Colors.white,
),
),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: () => Navigator.of(context).pop(false),
child: const Text(
'Cancel',
style: TextStyle(
color: Colors.white,
),
),
),
],
),
);
}

SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
Expand All @@ -34,54 +92,216 @@ class CustomerOrderScreen extends StatelessWidget {
),
),
),
body: Text(''),
bottomSheet: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
children: [
const Text(
'Total:',
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 22,
body: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10.0,
vertical: 5,
),
child: Consumer<OrderData>(
builder: (context, data, child) {
if (data.orderItems.isEmpty) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset('assets/images/sad.png'),
const SizedBox(height: 10),
const Text(
'No order to display',
style: TextStyle(
color: primaryColor,
fontWeight: FontWeight.bold,
),
)
],
);
}

return ListView.builder(
itemCount: data.orderItemCount,
itemBuilder: (context, index) {
var item = data.orderItems[index];
var date = intl.DateFormat.yMMMEd().format(item.orderDate);
return Dismissible(
onDismissed: (direction) => removeFromOrder(item.id),
direction: DismissDirection.endToStart,
background: Container(
height: 115,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.red,
),
alignment: Alignment.centerRight,
padding: const EdgeInsets.only(right: 20),
child: const Icon(
Icons.delete_forever,
color: Colors.white,
size: 40,
),
),
confirmDismiss: (direction) => showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Remove order on $date'),
content: Text(
'Are you sure you want to remove order on $date ?',
),
actions: [
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: () => Navigator.of(context).pop(true),
child: const Text(
'Yes',
style: TextStyle(
color: Colors.white,
),
),
),
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
onPressed: () => Navigator.of(context).pop(false),
child: const Text(
'Cancel',
style: TextStyle(
color: Colors.white,
),
),
),
],
),
),
key: ValueKey(item.id),
child: Card(
elevation: 3,
child: ExpansionTile(
leading: const CircleAvatar(
backgroundColor: Colors.white,
child: Icon(
Icons.shopping_bag_outlined,
color: primaryColor,
),
),
title: Text(
date.toString(),
style: const TextStyle(
color: Colors.black,
),
),
subtitle: Text(
'\$${item.totalPrice}',
style: const TextStyle(
color: Colors.black,
),
),
iconColor: primaryColor,
children: [
ListView.builder(
shrinkWrap: true,
itemCount: item.items.length,
itemBuilder: (context, index) {
var subData = item.items[index];
return ListTile(
contentPadding: const EdgeInsets.only(
left: 10,
right: 10,
top: 5,
),
leading: CircleAvatar(
backgroundColor: primaryColor,
backgroundImage:
NetworkImage(subData.prodImgUrl),
),
title: Text(
subData.prodName,
style: const TextStyle(
fontSize: 16,
),
),
subtitle: Text('\$${subData.totalPrice}'),
trailing: IconButton(
onPressed: () => Navigator.of(context).push(
MaterialPageRoute(
builder: (context) =>
DetailsScreen(product: subData),
),
),
icon: const Icon(
Icons.chevron_right,
color: primaryColor,
),
),
);
},
),
],
),
),
);
},
);
},
),
),
bottomSheet: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
children: [
const Text(
'Total:',
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 22,
),
),
),
const SizedBox(width: 5),
Text(
'\$${orderData.orderTotalPrice}',
style: const TextStyle(
fontWeight: FontWeight.w600,
fontSize: 28,
color: primaryColor,
const SizedBox(width: 5),
Text(
'\$${orderData.orderTotalPrice}',
style: const TextStyle(
fontWeight: FontWeight.w600,
fontSize: 28,
color: primaryColor,
),
),
),
],
),
Directionality(
textDirection: TextDirection.rtl,
child: ElevatedButton.icon(
style: ElevatedButton.styleFrom(
primary: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
],
),
Directionality(
textDirection: TextDirection.rtl,
child: ElevatedButton.icon(
style: ElevatedButton.styleFrom(
primary: primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
),
icon: const Icon(
Icons.shopping_cart_checkout,
color: Colors.white,
),
onPressed: () => {},
label: const Text(
'Checkout',
style: TextStyle(
icon: const Icon(
Icons.credit_card,
color: Colors.white,
),
onPressed: () => payNowDialog(),
label: const Text(
'Pay now',
style: TextStyle(
color: Colors.white,
),
),
),
),
)
],
)
],
),
),
);
}
Expand Down
Loading

0 comments on commit 7957685

Please sign in to comment.