const ProductDetail = (props) => { const { useMemo, useCallback, useState, useEffect } = React; const { productInfo, setBaskets, index, config, scrollToFirstPage, member, isMobile = false, fromPage = 'cart', showCart = false, userInfo } = props; // 1. Kiểm tra điều kiện dừng sớm (Early Exit) if (!productInfo?.product) return null; const { product, promotions = [] } = productInfo; const [productsSuggest, setProductsSuggest] = useState([]); const [loading, setLoading] = useState(false); const [quantity, setQuantity] = useState(1); const [mainImage, setMainImage] = useState(null); const [images, setImages] = useState([]); const [isCashier, setIsCashier] = useState(0); const user_lang = commonFunc.getCookies('user_lang') || 'vi'; const { Row, Col } = ReactBootstrap; // 2. Memoize giá khuyến mãi thấp nhất const minPromotionPrice = useMemo(() => { if (!promotions) return null; const allDiscountedItems = promotions.flatMap(promo => promo.conditions?.items?.filter(item => item.promotion_price < item.normal_price && item.id === product?.item_code ) || [] ); return allDiscountedItems.length > 0 ? Math.min(...allDiscountedItems.map(item => item.promotion_price)) : null; }, [promotions, product?.item_code]); // 3. Logic Fetch gợi ý (Tách biệt để dễ quản lý) const fetchProductsSuggestByItemCode = useCallback(async (item_code) => { if (!config || !item_code ) return; try { setLoading(true); const url = `/api/get-mdc-products-suggest`; const dataRequest = { barcode: item_code.trim(), cust_code: null }; const resultObj = await commonApi.APIPOSTByURL(url, dataRequest, config); if (resultObj?.status === 200) { setProductsSuggest(resultObj.data || []); } else { setProductsSuggest([]); } } catch (e) { console.error("ERROR get-products-suggest", e); } finally { setLoading(false); } }, [config]); // 4. Quản lý Ảnh và Suggestion useEffect(() => { const imagesTmp = product?.images || []; setImages(imagesTmp); setMainImage(imagesTmp.length > 0 ? imagesTmp[0] : null); if (productsSuggest?.length === 0 || 1==1) { fetchProductsSuggestByItemCode(product?.item_code); } }, [product, fetchProductsSuggestByItemCode, productsSuggest.length]); // 5. Cập nhật quyền Cashier useEffect(() => { setIsCashier(userInfo?.internal_user ? 1 : 0); }, [userInfo]); // 6. Callback thêm vào giỏ hàng const addOneItemToBasket = useCallback((item_code, qty = 1) => { const timestamp = Date.now(); setBaskets(prevBaskets => { const currentBaskets = prevBaskets || { items: [], basket: {} }; const newItems = [...currentBaskets.items]; const existingItemIndex = newItems.findIndex(item => item.item_code === item_code && (item.line_type || 'S') === 'S' ); if (existingItemIndex !== -1) { newItems[existingItemIndex].qty += qty; } else { newItems.push({ item_code: item_code, qty, line_type: 'S' }); } const newBaskets = { ...currentBaskets, basket: { ...currentBaskets.basket, basket_id: currentBaskets.basket?.basket_id || timestamp, }, items: newItems, }; commonFunc.setCookies('baskets', JSON.stringify(newBaskets), undefined); if (scrollToFirstPage) scrollToFirstPage(); return newBaskets; }); }, [setBaskets, scrollToFirstPage]); // Helper render nội dung HTML const renderProductContent = (viField, enField, label) => { const content = user_lang === 'vi' ? product?.[viField] : (product?.[enField] || product?.[viField]); if (!content) return null; return (
{label}
); }; return (
{/* Khuyến mãi */} {promotions.length > 0 && fromPage === 'cart' && (
{user_lang === 'vi' ? "Chương Trình Khuyến Mãi" : "Promotions"}
    {promotions.map((promo) => (
  • {promo?.code}: {user_lang === 'vi' ? promo?.name?.vi : promo?.name?.en} ({user_lang === 'vi' ? "Từ" : "From:"} {commonFunc.formatDate(new Date(promo?.start_date), "YYYY-MM-DD HH:mm").replace('00:00', '')} - {commonFunc.formatDate(new Date(promo?.end_date), "YYYY-MM-DD HH:mm")}) {promo?.condition_value === '45' ? " (Chỉ dành cho thành viên)" : (promo?.apply_for_branch !== 0 ? `(Chỉ dành cho ${promo?.apply_for_branch})` : "")}
  • ))}
)}
{/* Planogram & Thông tin chi tiết */}
{isCashier === 1 && fromPage === 'cart' && product?.planogram?.length > 0 && ( {user_lang === 'vi' ? "Thông tin Planogram" : "Planogram Information"} } BodyComponent={} /> )} {fromPage === 'cart' && (
{renderProductContent('Product_Excerpt_VI', 'Product_Excerpt_EN', user_lang === 'vi' ? "Thông tin sản phẩm:" : "Product information:")} {renderProductContent('Product_Usage_VI', 'Product_Usage_EN', user_lang === 'vi' ? "Hướng dẫn sử dụng:" : "Product instructions:")} {renderProductContent('Product_Additional_Information_VI', 'Product_Additional_Information_EN', user_lang === 'vi' ? "Thông tin bổ sung:" : "Additional information:")} {renderProductContent('Product_Ingredients_VI', 'Product_Ingredients_EN', user_lang === 'vi' ? "Thành phần:" : "Ingredients:")} {renderProductContent('Product_Storage_VI', 'Product_Storage_EN', user_lang === 'vi' ? "Lưu trữ:" : "Storage:")}
)}
{/* Sản phẩm gợi ý */} {productsSuggest?.length>0 && ( {config?.lang === 'vi' ? "Sản phẩm gợi ý" : "Product Recommendations"} } BodyComponent={
{loading ?
Loading...
: ( productsSuggest.map((p, idx) => ( )) )}
} /> )}
); };