Skip to content

Commit 35cefdd

Browse files
author
Dang
committed
update checkout logic
1 parent 8b48787 commit 35cefdd

File tree

2 files changed

+59
-10
lines changed

2 files changed

+59
-10
lines changed

e_shoppe/lib/features/checkout/checkout_page.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ class _CheckoutPageState extends ConsumerState<CheckoutPage> {
4343
}
4444
}
4545
});
46+
47+
// Listen for draft changes and keep CartBloc in sync
48+
ref.listen<OrderDraft>(orderDraftProvider, (prev, next) {
49+
final cartBloc = context.read<CartBloc>();
50+
// Rebuild cart state to mirror draft exactly.
51+
cartBloc.add(const CartCleared());
52+
for (final item in next.items) {
53+
for (var i = 0; i < item.quantity; i++) {
54+
cartBloc.add(CartItemAdded(item.product));
55+
}
56+
if (item.discountValue > 0) {
57+
cartBloc.add(CartItemDiscountChanged(
58+
productId: item.product.id, discount: item.discountValue));
59+
}
60+
}
61+
});
4662
}
4763

4864
@override

e_shoppe/lib/features/checkout/payment_page.dart

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:flutter_riverpod/flutter_riverpod.dart';
34

45
import '../../shared/widgets/blue_header.dart';
56
import '../../shared/widgets/section_card.dart';
67
import '../../theme/app_theme.dart';
78
import '../cart/bloc/cart_bloc.dart';
89
import 'order_success_page.dart';
910
import '../../shared/responsive.dart';
11+
import '../order/riverpod/order_draft_provider.dart';
12+
import '../../services/api_client.dart';
13+
import '../../data/models/user.dart';
1014

11-
class PaymentPage extends StatefulWidget {
15+
class PaymentPage extends ConsumerStatefulWidget {
1216
const PaymentPage({super.key});
1317

1418
@override
15-
State<PaymentPage> createState() => _PaymentPageState();
19+
ConsumerState<PaymentPage> createState() => _PaymentPageState();
1620
}
1721

1822
enum PayMethod { cod, vnpay }
1923

20-
class _PaymentPageState extends State<PaymentPage> {
24+
class _PaymentPageState extends ConsumerState<PaymentPage> {
2125
PayMethod _method = PayMethod.cod;
2226

2327
@override
@@ -80,13 +84,42 @@ class _PaymentPageState extends State<PaymentPage> {
8084
padding: const EdgeInsets.symmetric(vertical: 14),
8185
child: Center(
8286
child: GestureDetector(
83-
onTap: () {
84-
context.read<CartBloc>().add(const CartCleared());
85-
Navigator.of(context).pushAndRemoveUntil(
86-
MaterialPageRoute(
87-
builder: (_) => const OrderSuccessPage()),
88-
(route) => route.isFirst,
89-
);
87+
onTap: () async {
88+
final draft = ref.read(orderDraftProvider);
89+
if (draft.items.isEmpty) return;
90+
final api = ref.read(apiProvider);
91+
ScaffoldMessenger.of(context).showSnackBar(
92+
const SnackBar(content: Text('Đang gửi đơn hàng...')));
93+
try {
94+
final customer = draft.customer ??
95+
const User(id: 'guest', name: 'Guest', email: '');
96+
await api.post('/orders', {
97+
'customer': {
98+
'id': customer.id,
99+
'name': customer.name,
100+
'email': customer.email,
101+
},
102+
'items': draft.items
103+
.map((e) => {
104+
'productId': e.product.id,
105+
'quantity': e.quantity,
106+
})
107+
.toList(),
108+
});
109+
110+
// Clear local state
111+
context.read<CartBloc>().add(const CartCleared());
112+
ref.read(orderDraftProvider.notifier).clear();
113+
114+
Navigator.of(context).pushAndRemoveUntil(
115+
MaterialPageRoute(
116+
builder: (_) => const OrderSuccessPage()),
117+
(route) => route.isFirst,
118+
);
119+
} catch (e) {
120+
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
121+
content: Text('Gửi đơn thất bại: $e')));
122+
}
90123
},
91124
child: const Text('Xác nhận',
92125
style: TextStyle(

0 commit comments

Comments
 (0)