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 (