$(document).ready(function () { // 1. Header resize function header_resize() { let header_height = $('.header').height(); $('.main-container').css('padding-top', header_height); if ($('.header-search').length) { $('.header-search').css('top', header_height); } } header_resize(); $(window).resize(header_resize); // 2. Footer scroll to top $('.footer-content__scroll').on('click', function (event) { event.preventDefault(); $('html, body').animate({ scrollTop: 0 }, 200); }); // 3. Sidebar cart edit toggle let sidebarCart = $('#sidebar-cart'), sidebarCartEdit = sidebarCart.find('.sidebar-header__edit'); sidebarCartEdit.on('click', function () { sidebarCart.toggleClass('is-editing'); let state = $(this).attr('data-click-state') === '1' ? '0' : '1'; $(this).attr('data-click-state', state); $(this).find('span').toggle(); }); // 4. Add to Cart via form POST + refresh sidebar $(document).on('submit', '.product-block__form', function (e) { e.preventDefault(); // 🔴 Bloquea la redirección const $form = $(this); const $btn = $form.find('button[type="submit"]'); const $inputQuantity = $form.find('input[name="quantity"]'); const productId = $form.closest('[data-id]').data('id'); const variantId = $form.find('input[name="variant_id"]').val() || 'default'; const quantity = $inputQuantity.length ? parseInt($inputQuantity.val()) : 1; // Desactivar botón durante la solicitud if ($btn.length) $btn.prop('disabled', true); // Validar productId if (!productId) { console.error('Falta el ID del producto'); alert('No se puede agregar al carrito: falta el ID del producto.'); return; } // 🔴 Usar la URL dinámica del formulario const url = $form.attr('action'); // Enviar datos via AJAX const formData = new FormData(this); fetch(url, { method: 'POST', body: formData, credentials: 'same-origin', headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(response => { if (!response.ok) throw new Error('Error al agregar al carrito'); return response.json(); }) .then(data => { // Actualizar sidecart if (typeof refreshSidebarCart === 'function') { refreshSidebarCart(); } // Llamar a funciones del tema (si existen) if (typeof addItem === 'function') { addItem(productId, quantity, { variant_id: variantId }); } if (typeof rrApi !== 'undefined' && typeof rrApi.addToBasket === 'function') { rrApi.addToBasket(productId, quantity); } // Mostrar notificación showCartNotification(); // Reiniciar cantidad a 1 $form.find('.product-block__qty-input').val(1); }) .catch(error => { console.error('Error en la solicitud:', error); alert('Hubo un problema al agregar al carrito'); }) .finally(() => { if ($btn.length) $btn.prop('disabled', false); }); }); // 5. Gestión de cantidad con botones ± $(document).on('click', '.product-block__handler', function () { const $container = $(this).closest('.product-block__quantity'); const $input = $container.find('input[name="quantity"]'); const max = parseInt($input.attr('max')) || 99999; const delta = $(this).hasClass('quantity-down') ? -1 : 1; let current = parseInt($input.val()) || 1; current = Math.max(1, Math.min(current + delta, max)); $input.val(current); }); // 6. Actualizar sidecart sin recargar la página function refreshSidebarCart() { const $sidebarCart = $('#sidebar-cart'); const $productsContainer = $sidebarCart.find('.sidebar-cart__products'); const $emptyMessage = $sidebarCart.find('.sidebar-cart__empty'); const $totalsSection = $sidebarCart.find('.sidebar-cart__totals'); // Limpiar contenido anterior $productsContainer.empty(); $totalsSection.empty(); // Obtener datos del carrito fetch('/cart.js') .then(response => response.json()) .then(cartData => { // Actualizar productos cartData.items.forEach(item => { const productHTML = ` `; $productsContainer.append(productHTML); }); // Mostrar/ocultar mensaje de vacío if (cartData.item_count === 0) { $emptyMessage.show(); } else { $emptyMessage.hide(); } // Actualizar totales const totalHTML = ` `; $totalsSection.append(totalHTML); }) .catch(error => { console.error('Error al cargar el carrito:', error); }); } // 7. Remover productos del sidecart function removeFromCart(itemId) { fetch(`/cart/change.js`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: JSON.stringify({ id: itemId, quantity: 0 }) }) .then(response => response.json()) .then(data => { refreshSidebarCart(); showCartNotification('removed'); }) .catch(error => console.error('Error al remover:', error)); } // 8. Notificación visual function showCartNotification(type = 'added') { const $notif = $('#cart-notification'); if ($notif.length) { $notif.text(type === 'added' ? '✅ ¡Agregado al carrito!' : '✅ ¡Removido del carrito!'); $notif.css('display', 'block'); setTimeout(() => $notif.css('display', 'none'), 2500); } } // 9. Actualizar sidecart al cargar la página $(document).ready(refreshSidebarCart); // 10. Funciones dummy para compatibilidad if (typeof addItem !== 'function') { window.addItem = function (productId, quantity, options) { console.warn('addItem() no está definida en el tema. Usando versión dummy.'); console.log('Producto agregado:', { productId, quantity, options }); }; } if (typeof rrApi === 'undefined') { window.rrApi = { addToBasket: function (productId, quantity) { console.warn('rrApi.addToBasket() no está definida. Usando versión dummy.'); console.log('Producto agregado al carrito:', { productId, quantity }); } }; } });