import React, { useState } from 'react'; import { View, Text, StyleSheet, TouchableOpacity, Image, ActivityIndicator } from 'react-native'; import { Ionicons } from '@expo/vector-icons'; import { ProductResponse } from '../services/product'; import { useRouter } from 'expo-router'; import { useCart } from '../hooks/useCart'; interface ProductCardProps { product: ProductResponse; } const ProductCard: React.FC = ({ product }) => { const router = useRouter(); const { addToCart } = useCart(); const [isAdding, setIsAdding] = useState(false); const handlePress = () => { router.push(`/products/${product.productId}`); }; const handleAddToCart = async (e: any) => { e.stopPropagation(); // Ngăn chặn việc navigate khi click vào nút giỏ hàng if (product.stockQuantity <= 0) { return; // Không cho thêm vào giỏ nếu hết hàng } setIsAdding(true); try { await addToCart(product.productId, 1); } finally { setIsAdding(false); } }; const formatPrice = (price: number) => { return new Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND', }).format(price); }; return ( {/* Category Badge */} {product.categoryName} {/* Out of Stock Overlay */} {product.stockQuantity <= 0 && ( HẾT HÀNG )} {product.productName} {formatPrice(product.price)} {product.stockQuantity > 0 && ( Còn {product.stockQuantity} )} {/* Add to Cart Button */} {isAdding ? ( ) : ( )} ); }; const styles = StyleSheet.create({ card: { backgroundColor: '#fff', borderRadius: 12, marginHorizontal: 16, marginVertical: 8, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.1, shadowRadius: 4, elevation: 3, overflow: 'hidden', }, imageContainer: { position: 'relative', width: '100%', height: 200, }, image: { width: '100%', height: '100%', backgroundColor: '#f0f0f0', }, categoryBadge: { position: 'absolute', top: 12, left: 12, backgroundColor: 'rgba(255, 107, 107, 0.95)', paddingHorizontal: 10, paddingVertical: 5, borderRadius: 6, }, categoryText: { fontSize: 12, color: '#fff', fontWeight: '600', }, outOfStockOverlay: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'rgba(0, 0, 0, 0.5)', justifyContent: 'center', alignItems: 'center', }, outOfStockText: { fontSize: 18, fontWeight: '700', color: '#fff', letterSpacing: 2, }, content: { padding: 12, }, productName: { fontSize: 16, fontWeight: '600', color: '#333', marginBottom: 8, minHeight: 44, }, footer: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', }, priceSection: { flex: 1, }, price: { fontSize: 18, fontWeight: '700', color: '#ff6b6b', marginBottom: 2, }, stockText: { fontSize: 12, color: '#4caf50', fontWeight: '500', }, addButton: { width: 44, height: 44, backgroundColor: '#ff6b6b', borderRadius: 22, justifyContent: 'center', alignItems: 'center', shadowColor: '#ff6b6b', shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.3, shadowRadius: 4, elevation: 4, }, addButtonDisabled: { backgroundColor: '#ccc', shadowOpacity: 0, }, }); export default ProductCard;