const CartManager = { init() { this.state = { isLoading: false, lastUpdate: null, error: null }; this.loadCart(); this.setupEventListeners(); this.updateCartCount(); }, destroy() { this.removeEventListeners(); this.clearTimers(); }, loadCart() { try { State.cart = Storage.load(CONFIG.STORAGE_KEYS.CART) || []; } catch (error) { console.error('Error loading cart:', error); State.cart = []; } }, handleCheckoutClick() { // 1. ตรวจสอบข้อมูลลูกค้า if (!CustomerManager.hasRequiredInfo()) { NotificationManager.showInfo('กรุณากรอกข้อมูลส่วนตัวก่อนสั่งซื้อ'); CustomerManager.showProfileEditor(); return; } // 2. ซ่อน modal ตะกร้า document.getElementById('cartModal').classList.remove('active'); // 3. แสดง modal checkout const checkoutModal = document.getElementById('checkoutModal'); if (checkoutModal) { // กรอกข้อมูลลูกค้าอัตโนมัติ const customerInfo = CustomerManager.getCustomerInfo(); document.getElementById('name').value = customerInfo.name; document.getElementById('phone').value = customerInfo.phone; document.getElementById('address').value = customerInfo.address; checkoutModal.classList.add('active'); } // 4. ผูก event submit form const checkoutForm = document.getElementById('checkoutForm'); if (checkoutForm) { checkoutForm.removeEventListener('submit', this.boundHandleCheckoutSubmit); this.boundHandleCheckoutSubmit = this.handleCheckoutSubmit.bind(this); checkoutForm.addEventListener('submit', this.boundHandleCheckoutSubmit); } }, // เพิ่มเมธอดสำหรับ cleanup removeEventListeners() { this.cartBtn?.removeEventListener('click', this.boundShowCart); document.removeEventListener('click', this.boundHandleModalEvents); document.removeEventListener('click', this.boundHandleCartItemEvents); // ลบ event listener ของ checkout form const checkoutForm = document.getElementById('checkoutForm'); if (checkoutForm) { checkoutForm.removeEventListener('submit', this.boundHandleCheckoutSubmit); } }, setupEventListeners() { this.removeEventListeners(); this.boundShowCart = this.showCart.bind(this); this.boundHandleModalEvents = this.handleModalEvents.bind(this); this.boundHandleCartItemEvents = this.handleCartItemEvents.bind(this); this.boundHandleCheckoutClick = this.handleCheckoutClick.bind(this); // เพิ่มใหม่ this.cartBtn = document.getElementById('cartBtn'); this.cartBtn?.addEventListener('click', this.boundShowCart); // เพิ่ม event listener สำหรับปุ่ม checkout document.addEventListener('click', (e) => { const checkoutBtn = e.target.closest('#checkoutBtn'); if (checkoutBtn && !checkoutBtn.disabled) { this.handleCheckoutClick(); } }); document.addEventListener('click', this.boundHandleModalEvents); document.addEventListener('click', this.boundHandleCartItemEvents); }, handleModalEvents(e) { if (e.target.matches('.modal-close')) { const modal = e.target.closest('.modal'); if (modal) this.closeModal(modal); } }, addToCart(product) { if (!product || !product.id) { console.error('Invalid product', product); return; } try { const existingItem = State.cart.find(item => item.id === product.id); if (existingItem) { // ตรวจสอบสต็อกสินค้า if (existingItem.quantity >= product.stock) { NotificationManager.showError('ขออภัย สินค้าในสต็อกไม่เพียงพอ'); return; } existingItem.quantity += 1; } else { State.cart.push({ id: product.id, name: product.name, price: product.price, image: product.image, quantity: 1, stock: product.stock }); } this.updateCartCount(); this.saveCart(); this.animateCartButton(); NotificationManager.showSuccess(`เพิ่ม${product.name}ลงตะกร้าแล้ว`); } catch (error) { console.error('Error adding to cart:', error); NotificationManager.showError('เกิดข้อผิดพลาดในการเพิ่มสินค้า'); } }, updateQuantity(productId, change) { const item = State.cart.find(item => item.id === productId); if (!item) return; const newQuantity = item.quantity + change; if (newQuantity <= 0) { this.removeFromCart(productId); return; } if (newQuantity > item.stock) { NotificationManager.showError('ขออภัย สินค้าในสต็อกไม่เพียงพอ'); return; } item.quantity = newQuantity; this.updateCartCount(); this.saveCart(); this.showCart(); }, removeFromCart(productId) { State.cart = State.cart.filter(item => item.id !== productId); this.updateCartCount(); this.saveCart(); this.showCart(); NotificationManager.showInfo('ลบสินค้าออกจากตะกร้าแล้ว'); }, updateCartCount() { const count = State.cart.reduce((sum, item) => sum + item.quantity, 0); const cartCount = document.querySelector('.cart-count'); if (cartCount) { cartCount.textContent = count; cartCount.classList.toggle('hidden', count === 0); if (count > 0) { cartCount.classList.add('bounce'); setTimeout(() => cartCount.classList.remove('bounce'), 300); } } }, saveCart() { Storage.save(CONFIG.STORAGE_KEYS.CART, State.cart); }, handleCartItemEvents(e) { const button = e.target.closest('button'); if (!button) return; const action = button.dataset.action; const productId = button.closest('.cart-item')?.dataset.productId; if (!productId) return; try { switch (action) { case 'increase': this.updateQuantity(productId, 1); break; case 'decrease': this.updateQuantity(productId, -1); break; case 'remove': this.confirmRemoveItem(productId); break; } } catch (error) { this.handleCartError(error); } }, async validateCheckout() { if (!CustomerManager.hasRequiredInfo()) { NotificationManager.showInfo('กรุณากรอกข้อมูลส่วนตัวก่อนสั่งซื้อ'); await CustomerManager.showProfileEditor(); return false; } const {subtotal} = this.getCartTotal(); if (subtotal < CONFIG.MIN_ORDER_AMOUNT) { NotificationManager.showError( `ยอดสั่งซื้อขั้นต่ำ ${Utils.formatPrice(CONFIG.MIN_ORDER_AMOUNT)}` ); return false; } return true; }, getCartItems() { return State.cart.map(item => ({ id: item.id, name: item.name, price: item.price, quantity: item.quantity, total: item.price * item.quantity })); }, getCartTotal() { const subtotal = State.cart.reduce((sum, item) => sum + (item.price * item.quantity), 0); const deliveryFee = subtotal >= CONFIG.FREE_DELIVERY_AMOUNT ? 0 : CONFIG.DELIVERY_FEE; return { subtotal, deliveryFee, total: subtotal + deliveryFee }; }, updateCartSummary() { const {subtotal, deliveryFee, total} = this.getCartTotal(); document.getElementById('subtotal').textContent = Utils.formatPrice(subtotal); document.getElementById('deliveryFee').textContent = Utils.formatPrice(deliveryFee); document.getElementById('total').textContent = Utils.formatPrice(total); // อัพเดทปุ่ม checkout const checkoutBtn = document.getElementById('checkoutBtn'); if (checkoutBtn) { const isMinimumMet = subtotal >= CONFIG.MIN_ORDER_AMOUNT; checkoutBtn.disabled = !isMinimumMet; if (!isMinimumMet) { checkoutBtn.title = `ขั้นต่ำ ${Utils.formatPrice(CONFIG.MIN_ORDER_AMOUNT)}`; document.getElementById('minimumOrderWarning').textContent = `* ยอดสั่งซื้อขั้นต่ำ ${Utils.formatPrice(CONFIG.MIN_ORDER_AMOUNT)}`; } else { checkoutBtn.title = ''; document.getElementById('minimumOrderWarning').textContent = ''; } } }, clearCart() { State.cart = []; this.updateCartCount(); this.saveCart(); }, animateCartButton() { const button = document.getElementById('cartBtn'); if (button) { button.classList.add('bounce'); setTimeout(() => button.classList.remove('bounce'), 300); } }, createCartItemElement(item) { const element = document.createElement('div'); element.className = 'cart-item'; element.dataset.productId = item.id; // หาข้อมูลสินค้าจาก State.products const product = State.products.find(p => p.id === item.id); const inStock = product && product.stock > item.quantity; element.innerHTML = `
ตะกร้าว่างเปล่า