const ProductInfo = (props) => {
const {
config, barcode, setBarcode, baskets, setBaskets, productSelected,
setReloadPage, reloadPage, scrollToFirstPage, member, content,
isMobile = false, userInfo, showCart = false, setShowCart
} = props;
const [loading, setLoading] = useState(false);
const [product, setProduct] = useState();
const history = useHistory();
const custCode = baskets?.basket?.cust_code || '';
const [fromPage] = useState('cart');
// 1. Logic cập nhật Basket (Dùng useCallback để tránh re-render thừa)
const updateBasket = useCallback((itemCode, qty, productInfo, item_code_ref, line_type = 'S') => {
const timestamp = Date.now();
const basket_date = new Date().toISOString();
setBaskets(prevBaskets => {
const currentBaskets = prevBaskets || {
items: [],
basket: { basket_id: timestamp, basket_date, cust_code: member?.shopper_id }
};
const existingItemIndex = currentBaskets.items.findIndex(
item => item.item_code === itemCode && item.line_type === line_type
);
if (existingItemIndex !== -1) {
const updatedItems = [...currentBaskets.items];
// Giữ nguyên logic: nếu reload=true thì không tăng thêm qty
const finalQty = currentBaskets?.basket?.reload === true ? 0 : qty;
updatedItems[existingItemIndex].qty += finalQty;
return { ...currentBaskets, items: updatedItems };
}
return {
...currentBaskets,
items: [...currentBaskets.items, { item_code: itemCode, qty, product_info: productInfo, item_code_ref, line_type }]
};
});
}, [member, setBaskets]);
// 2. Logic Fetch Product (Dùng useCallback)
const fetchProductByBarcode = useCallback(async () => {
try {
setLoading(true);
const url = `/api/get-mdc-product-info`;
let [strQty, strBarcode] = barcode.includes("*") ? barcode.split('*') : ['1', barcode];
strBarcode = (strBarcode || barcode).split('_')[0].replace(/[\n\r]+/g, '').trim();
const qty = parseInt(strQty) || 1;
const dataRequest = {
barcode: strBarcode,
cust_code: baskets?.basket?.cust_code || member?.shopper_id
};
const resultObj = await commonApi.APIPOSTByURL(url, dataRequest, config);
if (resultObj?.status === 200) {
const dataTmp = resultObj?.data;
if (dataTmp?.product?.item_code) {
setProduct(dataTmp);
updateBasket(dataTmp.product.item_code, qty, dataTmp, dataTmp.product.item_code_ref);
const slug = dataTmp.product.slug;
history.push(`/products/${slug}`);
if (reloadPage === '1') {
// eslint-disable-next-line no-undef
currentProductInfo = null; // Cẩn thận với biến global này
window.location.href = window.location.origin;
window.location.reload();
}
} else {
alert('Item not found !!');
}
}
} catch (e) {
console.error("ERROR get-product-info:", e);
} finally {
setLoading(false);
}
}, [barcode, baskets, config, history, member, reloadPage, updateBasket]);
// 3. Quản lý Effects
useEffect(() => {
if (barcode) {
fetchProductByBarcode();
setBarcode('');
} else if (typeof currentProductInfo !== 'undefined' && currentProductInfo) {
setProduct(currentProductInfo);
}
}, [barcode, custCode, fetchProductByBarcode, setBarcode]);
useEffect(() => {
if (productSelected) setProduct(productSelected);
}, [productSelected]);
useEffect(() => {
if (baskets?.items?.length === 0 && showCart === true) {
setProduct(null);
}
}, [baskets?.items, showCart]);
useEffect(() => {
const titleLink = document.getElementById("title_company");
const title = config?.lang === 'vi'
? content?.product?.Short_Description_VI
: content?.product?.Short_Description_EN;
if (titleLink) {
titleLink.textContent = title || content?.product?.description || '';
}
setProduct(content);
}, [content, config, content?.product]);
return (
<>
{product && (
)}
>
);
};