PageSourceSearch

https://ismile.com.ar/scripts/productCard.js

js ismile.com.ar collected 2026-10-09 01:44:43 UTC 6,820 bytes, 125 lines download raw bytes

1import { addProductToLocaleCart, addTempItemToDB, getCartTotalProducts, getLoggedUser, handleRemoveCartBtnClick, checkIfProductIsInCartDetail} from "./utils.js";
2function loadDependentScripts() { //Carga los scripts que usan la variable del fetch
3    // Si esta en el checkout
4    if (window.location.pathname === '/user/checkout') {
5        // Aquí puedes cargar los scripts externos después de obtener los datos del usuario
6        var checkoutScript = document.createElement('script');
7        checkoutScript.src = '/scripts/checkout.js';
8        checkoutScript.type = 'module'; // Agregar el atributo type="module"
9        document.head.appendChild(checkoutScript);
10    } 
11}
12window.addEventListener('load', async () => {
13    try {
14        const blackScreen = document.querySelector('.black-screen')
15        // LOGICA PARA QUICK ADD
16        // Lo hago en este script porque puede ir en la lista de productos, en la del detalle en sugested products, etc
17        const addingCartButtons = document.querySelectorAll('.quick-add-cart-btn');
18        const shopingCartQuickPopup = document.querySelector('.add-to-cart-container');
19        const closingCardBtns = document.querySelectorAll('.close-cart-menu');
20        var totalProducts = document.querySelectorAll('.products-quantity');
21        var userLogged = (await getLoggedUser())?.user;
22        // Defino en el window para poder usarla en otros lugares
23        window.userLogged = userLogged
24        userLogged && localStorage.removeItem('temporalCart');
25        // Carga los scripts que dependen del user
26        loadDependentScripts();
27        // Apenas carga le pongo la cantidad de productos
28        updateCartTotalProductsNumber();
29        checkForProductsInCart();
30
31        // Si tocan el boton del carro
32        addingCartButtons?.forEach(btn => {
33            // Click en agregar al carro
34            btn.addEventListener('click', async (e) => {
35                try {
36                    const card = btn.closest('.product-card-container') || btn.closest('.product-container');
37                    //para llegar al id del producto ..
38                    const idProd = card.dataset.productid;
39                    card.querySelector('.loading-container').classList.add('loading-container-active');
40                    if (userLogged) {
41                        await addTempItemToDB(idProd,userLogged); //Función que agrega al carro el producto 
42                    } else {
43                        addProductToLocaleCart(idProd);
44                    }
45                    // Remuevo el spinner loading, pongo el quickshopping popup
46                    card.querySelector('.loading-container').classList.remove('loading-container-active');
47                    paintShoppingCartPopup(card);
48                    shopingCartQuickPopup.classList.add('add-to-cart-container-active');
49                    blackScreen.classList.add('black-screen-active');
50                    // Cambio los iconos
51                    card.querySelector('.quick-add-cart-btn')?.classList.add('hidden');
52                    card.querySelector('.remove-cart-product')?.classList.remove('hidden');
53                    // Le sumo uno al numero del carro
54                    totalProducts.forEach(num => num.innerHTML = parseInt(num.innerHTML) ? parseInt(num.innerHTML) + 1 : 1);
55                } catch (error) {
56                    console.log(`Falle en addingCartbuttons.addEventListener: ${error}`);
57                }
58            });
59        });
60        blackScreen.addEventListener('click', () => {
61            shopingCartQuickPopup.classList.remove('add-to-cart-container-active');
62            blackScreen.classList.remove('black-screen-active');
63        });
64        closingCardBtns?.forEach(btn => {
65            // Click en agregar al carro
66            btn.addEventListener('click', () => {
67                const card = btn.closest('.product-card-container');
68                shopingCartQuickPopup.classList.remove('add-to-cart-container-active');
69                blackScreen.classList.remove('black-screen-active');
70            });
71        });
72        handleRemoveCartBtnClick(userLogged);
73
74        // Actualiza numero arriba del carro con cantidad de productos
75        function updateCartTotalProductsNumber() {
76            const cartLength = getCartTotalProducts(userLogged); //Función que retorna el total de productos
77            totalProducts.forEach(num => cartLength ? num.innerHTML = cartLength : num.innerHTML = '');
78        };
79        function checkForProductsInCart() {//Se fija si el usuario ya tiene el producto en el carro para poner tick
80            const productCards = document.querySelectorAll('.product-card-container');
81            productCards.forEach(card => {
82                const productId = card.dataset.productid;
83                // Hace un find ==> encuentra si el producto esta en el carro
84                let productAlreadyInCart;
85                if (userLogged) {
86                    productAlreadyInCart = userLogged.temporalCart?.temporalItems.find(item => item.products_id == productId);
87                } else {
88                    let cart = JSON.parse(localStorage.getItem('temporalCart')) || [];
89                    productAlreadyInCart = cart.find(item => item.products_id == productId);
90                }
91                if (productAlreadyInCart) {
92                    card.querySelector('.quick-add-cart-btn').classList.add('hidden');
93                    card.querySelector('.remove-cart-product').classList.remove('hidden');
94                }
95            })
96        };
97
98        function paintShoppingCartPopup(card) {
99            let productSelectedCard = document.querySelector('.product-selected-card');
100            let imagePath = card.querySelectorAll('.product-image-test')[0]?.src||
101            card.querySelector('.main-img')?.src || '/img/product/default.png';
102            let productName = card.querySelector('.product-name').innerHTML;
103            let productPrice = card.querySelector('.product-price').innerHTML;
104            let cardHTML = 
105            `
106            <div class="product-selected-img-container">
107                <img src="${imagePath}" alt="product-image" class="product-selected-img">
108            </div>
109            <div class="product-selected-info-qty-container">
110                <div class="product-selected-name-remove-container">
111                    <p class="product-selected-name">${productName}</p>
112                </div>
113                <div class="product-selected-quantity-container">
114                    <p class="item-total">${productPrice}</p>
115                </div>
116            </div>
117            `;
118            productSelectedCard.innerHTML = cardHTML;
119        }
120        checkIfProductIsInCartDetail();
121
122    } catch (error) {
123        console.log("Falle en productCard.js: " + error);
124    }
125});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.