|
1 | 1 | import 'package:flutter/material.dart'; |
2 | 2 | import 'package:flutter_bloc/flutter_bloc.dart'; |
| 3 | +import 'package:flutter_riverpod/flutter_riverpod.dart'; |
3 | 4 |
|
4 | 5 | import '../../shared/widgets/blue_header.dart'; |
5 | 6 | import '../../shared/widgets/section_card.dart'; |
6 | 7 | import '../../theme/app_theme.dart'; |
7 | 8 | import '../cart/bloc/cart_bloc.dart'; |
8 | 9 | import 'order_success_page.dart'; |
9 | 10 | import '../../shared/responsive.dart'; |
| 11 | +import '../order/riverpod/order_draft_provider.dart'; |
| 12 | +import '../../services/api_client.dart'; |
| 13 | +import '../../data/models/user.dart'; |
10 | 14 |
|
11 | | -class PaymentPage extends StatefulWidget { |
| 15 | +class PaymentPage extends ConsumerStatefulWidget { |
12 | 16 | const PaymentPage({super.key}); |
13 | 17 |
|
14 | 18 | @override |
15 | | - State<PaymentPage> createState() => _PaymentPageState(); |
| 19 | + ConsumerState<PaymentPage> createState() => _PaymentPageState(); |
16 | 20 | } |
17 | 21 |
|
18 | 22 | enum PayMethod { cod, vnpay } |
19 | 23 |
|
20 | | -class _PaymentPageState extends State<PaymentPage> { |
| 24 | +class _PaymentPageState extends ConsumerState<PaymentPage> { |
21 | 25 | PayMethod _method = PayMethod.cod; |
22 | 26 |
|
23 | 27 | @override |
@@ -80,13 +84,42 @@ class _PaymentPageState extends State<PaymentPage> { |
80 | 84 | padding: const EdgeInsets.symmetric(vertical: 14), |
81 | 85 | child: Center( |
82 | 86 | 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 | + } |
90 | 123 | }, |
91 | 124 | child: const Text('Xác nhận', |
92 | 125 | style: TextStyle( |
|
0 commit comments