import React, { useState } from 'react'; import { getUser } from '@/services/auth'; import { View, Text, StyleSheet, ScrollView, TextInput, TouchableOpacity, Alert, ActivityIndicator, KeyboardAvoidingView, Platform, } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; import { useCart } from '../../hooks/useCart'; import orderApi from '../../services/orderApi'; interface PaymentMethod { id: string; name: string; icon: string; } const PAYMENT_METHODS: PaymentMethod[] = [ { id: 'COD', name: 'Thanh toán khi nhận hàng', icon: 'cash-outline' }, { id: 'BANK', name: 'Chuyển khoản ngân hàng', icon: 'card-outline' }, { id: 'MOMO', name: 'Ví MoMo', icon: 'wallet-outline' }, { id: 'VNPAY', name: 'VNPay', icon: 'card-outline' }, ]; export default function CheckoutScreen() { const router = useRouter(); const { cart, refreshCart, clearCart } = useCart(); const [loading, setLoading] = useState(false); const [shippingAddress, setShippingAddress] = useState(''); const [phoneNumber, setPhoneNumber] = useState(''); const [note, setNote] = useState(''); const [selectedPayment, setSelectedPayment] = useState('COD'); const formatPrice = (price: number) => { return new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND', }).format(price); }; const validateForm = () => { if (!shippingAddress.trim()) { Alert.alert('Lỗi', 'Vui lòng nhập địa chỉ giao hàng'); return false; } if (!phoneNumber.trim()) { Alert.alert('Lỗi', 'Vui lòng nhập số điện thoại'); return false; } if (!/^[0-9]{10}$/.test(phoneNumber)) { Alert.alert('Lỗi', 'Số điện thoại không hợp lệ (10 chữ số)'); return false; } return true; }; const handleCreateOrder = async () => { if (!validateForm() || !cart) return; setLoading(true); try { // LẤY userId từ AsyncStorage const user = await getUser(); if (!user) { Alert.alert("Lỗi", "Bạn chưa đăng nhập!"); return; } const userId = user.userId; const fullAddress = `${shippingAddress}${note ? ` - Ghi chú: ${note}` : ''} - SĐT: ${phoneNumber}`; const orderData = { shippingAddress: fullAddress, items: cart.items.map(item => ({ productId: item.product.productId, quantity: item.quantity, })), }; // Gọi API đúng với 2 tham số const response = await orderApi.createOrder(userId, orderData); if (response.success && response.data) { await clearCart(false); await refreshCart(); router.replace({ pathname: '/order-success', params: { orderId: response.data.orderId.toString() } }); } else { Alert.alert("Lỗi", response.message || "Đặt hàng thất bại"); } } catch (error: any) { console.error("Create order error:", error); Alert.alert("Lỗi", error.message || "Không thể kết nối đến server"); } finally { setLoading(false); } }; if (!cart || cart.items.length === 0) { return ( ); } return ( {/* Header */} router.back()}> Thanh toán {/* Shipping Address */} Địa chỉ giao hàng {/* Order Items */} Sản phẩm ({cart.items.length}) {cart.items.map((item) => ( {item.product.productName} {formatPrice(item.product.price)} x {item.quantity} {formatPrice(item.product.price * item.quantity)} ))} {/* Payment Method */} Phương thức thanh toán {PAYMENT_METHODS.map((method) => ( setSelectedPayment(method.id)} > {method.name} {selectedPayment === method.id && ( )} ))} {/* Order Summary */} Chi tiết thanh toán Tạm tính {formatPrice(cart.totalAmount)} Phí vận chuyển Miễn phí Tổng cộng {formatPrice(cart.totalAmount)} {/* Order Button */} {loading ? ( ) : ( <> Đặt hàng {formatPrice(cart.totalAmount)} )} ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#f5f5f5', }, header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', padding: 16, backgroundColor: '#fff', borderBottomWidth: 1, borderBottomColor: '#e0e0e0', }, headerTitle: { fontSize: 20, fontWeight: '700', color: '#333', }, scrollView: { flex: 1, }, loadingContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', }, section: { backgroundColor: '#fff', marginTop: 12, padding: 16, }, sectionHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 16, }, sectionTitle: { fontSize: 16, fontWeight: '700', marginLeft: 8, color: '#333', }, input: { borderWidth: 1, borderColor: '#e0e0e0', borderRadius: 8, padding: 12, marginBottom: 12, fontSize: 15, backgroundColor: '#fafafa', }, cartItem: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 12, borderBottomWidth: 1, borderBottomColor: '#f0f0f0', }, itemInfo: { flex: 1, marginRight: 12, }, itemName: { fontSize: 15, marginBottom: 4, color: '#333', }, itemPrice: { fontSize: 13, color: '#666', }, itemTotal: { fontSize: 15, fontWeight: '700', color: '#ff6b6b', }, paymentMethod: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', padding: 14, borderWidth: 1, borderColor: '#e0e0e0', borderRadius: 8, marginBottom: 10, backgroundColor: '#fafafa', }, paymentMethodActive: { borderColor: '#ff6b6b', backgroundColor: '#fff5f5', }, paymentMethodInfo: { flexDirection: 'row', alignItems: 'center', }, paymentMethodName: { marginLeft: 12, fontSize: 15, color: '#333', }, summaryRow: { flexDirection: 'row', justifyContent: 'space-between', paddingVertical: 10, }, summaryLabel: { fontSize: 15, color: '#666', }, summaryValue: { fontSize: 15, color: '#333', }, totalRow: { borderTopWidth: 1, borderTopColor: '#e0e0e0', marginTop: 8, paddingTop: 16, }, totalLabel: { fontSize: 17, fontWeight: '700', color: '#333', }, totalValue: { fontSize: 20, fontWeight: '700', color: '#ff6b6b', }, footer: { backgroundColor: '#fff', padding: 16, borderTopWidth: 1, borderTopColor: '#e0e0e0', }, orderButton: { backgroundColor: '#ff6b6b', padding: 16, borderRadius: 12, alignItems: 'center', }, orderButtonDisabled: { opacity: 0.6, }, orderButtonText: { color: '#fff', fontSize: 17, fontWeight: '700', }, orderButtonSubtext: { color: '#fff', fontSize: 14, marginTop: 4, }, });