/** * Cart Fix v5 - V.AI STUDIO * ========================== * FIX 1: SP thêm sai - dùng slug/sku key, không idx (D[] thay đổi khi filter) * - Quan trọng: OVERRIDE window.addToCart NGAY (ko đợi DOMContentLoaded) * vì ai-search-fix.js định nghĩa addToCart ngay lập tức với vai_cart * FIX 2: Ẩn nút Lưu + Đơn hàng trong modal giỏ hàng */ // OVERRIDE NGAY - không đợi DOMContentLoaded (function() { // --- Hàm phụ trợ (phiên bản độc lập, k phụ thuộc DOM) --- var CART_KEY = 'malloca_cart'; function _ls(key, def) { try { return JSON.parse(localStorage.getItem(key) || def); } catch(e) { return JSON.parse(def); } } function _lss(key, val) { localStorage.setItem(key, JSON.stringify(val)); } // Đồng bộ vai_cart -> malloca_cart (function() { var mc = _ls(CART_KEY, '[]'); var vc = _ls('vai_cart', '[]'); if (vc.length) { vc.forEach(function(v) { var ex = mc.find(function(m) { return m.sku && v.sku && m.sku === v.sku; }); if (ex) { ex.qty = (ex.qty||1) + (v.quantity||v.qty||1) - 1; } else { mc.push({ slug: v.slug||'', sku: v.sku||'', name: v.name||'SP', price: typeof v.price==='number'?v.price.toLocaleString('vi-VN')+'đ':(v.price||'LH'), priceNum: v.priceNum||v.price||0, image: v.image||'', qty: v.quantity||v.qty||1 }); } }); _lss(CART_KEY, mc); localStorage.removeItem('vai_cart'); } window.cart = mc; })(); // addToCart - override NGAY LẬP TỨC window.addToCart = function(product) { var cart = _ls(CART_KEY, '[]'); if (typeof product === 'number') { var p = (typeof D !== 'undefined' && D) ? D[product] : null; if (!p) { if (typeof showToast === 'function') showToast('Không tìm thấy SP'); return; } var ex = cart.find(function(c) { return (c.slug && p.slug && c.slug === p.slug) || (c.sku && p.sku && c.sku === p.sku); }); if (ex) { ex.qty = (ex.qty||1) + 1; } else { cart.push({ slug: p.slug||'', sku: p.sku||'', name: p.name||'SP', price: p.price||'LH', priceNum: p.priceNum||0, image: p.image||'', qty: 1 }); } } else if (typeof product === 'object' && product !== null) { var pr = product; var ei = cart.findIndex(function(c) { return c.sku && pr.sku && c.sku === pr.sku; }); if (ei >= 0) { cart[ei].qty = (cart[ei].qty||1) + 1; } else { cart.push({ slug: pr.slug||'', sku: pr.sku||'', name: pr.name||'SP', price: typeof pr.price==='number'?pr.price.toLocaleString('vi-VN')+'đ':(pr.price||'LH'), priceNum: pr.priceNum||pr.price||0, image: pr.image||'', qty: pr.quantity||pr.qty||1 }); } } else return; _lss(CART_KEY, cart); window.cart = cart; // Update badge var num = document.getElementById('cartNum'); if (num) { var t = cart.reduce(function(s,c){return s+(c.qty||1);},0); num.textContent = t; num.style.display = t>0?'flex':'none'; } var nm = (typeof product==='number' && D && D[product]) ? D[product].name : (product.name||''); if (typeof showToast === 'function') showToast('✅ Đã thêm "'+(nm||'').substring(0,30)+'" vào giỏ!'); }; // === CÁC HÀM CÒN LẠI (có thể đợi DOM) === function ready(fn) { if (document.readyState !== 'loading') fn(); else document.addEventListener('DOMContentLoaded', fn); } ready(function() { function loadCart() { try { return JSON.parse(localStorage.getItem(CART_KEY)||'[]'); } catch(e){return [];} } function saveCart(cart) { localStorage.setItem(CART_KEY, JSON.stringify(cart)); window.cart = cart; } function badgeUpdate() { var cart = loadCart(); var num = document.getElementById('cartNum'); if (!num) return; var t = cart.reduce(function(s,c){return s+(c.qty||1);},0); num.textContent = t; num.style.display = t>0?'flex':'none'; } window.changeQty = function(index, delta) { var cart = loadCart(); if (index<0 || index>=cart.length) return; cart[index].qty = (cart[index].qty||1) + delta; if (cart[index].qty<=0) cart.splice(index,1); saveCart(cart); renderCart(); badgeUpdate(); }; window.removeFromCart = function(index) { var cart = loadCart(); if (index<0 || index>=cart.length) return; cart.splice(index,1); saveCart(cart); renderCart(); badgeUpdate(); }; window.openCart = function() { var overlay = document.getElementById('cartOverlay'); var drawer = document.getElementById('cartDrawer'); if (!overlay||!drawer) return; overlay.classList.add('open'); overlay.style.display = 'block'; drawer.classList.add('open'); drawer.style.visibility = 'visible'; drawer.style.transform = 'translateX(0)'; document.body.style.overflow = 'hidden'; renderCart(); }; window.closeCart = function() { var overlay = document.getElementById('cartOverlay'); var drawer = document.getElementById('cartDrawer'); if (!overlay||!drawer) return; overlay.classList.remove('open'); overlay.style.display = 'none'; drawer.classList.remove('open'); drawer.style.visibility = 'hidden'; document.body.style.overflow = ''; }; window.renderCart = function() { var cart = loadCart(); var itemsEl = document.getElementById('cartItems'); var footerEl = document.getElementById('cartFooter'); var totalEl = document.getElementById('cartTotal'); if (!itemsEl) return; if (!cart.length) { itemsEl.innerHTML = '
Thêm sản phẩm vào giỏ để đặt hàng