Welcome to the detailed analysis for stokomani.fr. This domain is officially recognized as Stokomani | Magasin de déstockage de marques à prix discount. According to their official web presence, their primary focus is: "Stokomani, première enseigne de déstockage de marques, vous propose des arrivages mode, déco, beauté, jouets… pas cher, chaque semaine !".
"POUR ÊTRE INFORMÉ DES NOUVEAUTÉS, INSCRIVEZ-VOUS À LA NEWSLETTER"
"(function() { const productId = '10503980810574'; // Données de stock réelles du produit (depuis Liquid) const storeAvailabilities = [ { name: 'STOKOMANI ALES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AMIENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGOULINS-SUR- MER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANNEMASSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THONON LES BAINS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI OYONNAX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ARQUES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AURILLAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AUTUN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AVIGNON SUD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BASSE GOULAINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BEAUVAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BERGERAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BÉZIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLENEUVE SUR LOT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BLAGNAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AGEN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BORDEAUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BOURG EN BRESSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BOURGOIN-JALLIEU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BREST', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BRIVE LA GAILLARDE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MANTES BUCHELAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PLAN DE CAMPAGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CALAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CARCASSONNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MACON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHALON SUR SAÔNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHAMBLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHAMBRAY LES TOURS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGOULÊME CHAMPNIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RENNES CHANTEPIE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHARLEVILLE-MÉZIÈRES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COGNAC - CHÂTEAUBERNARD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATEAUBRIANT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATILLON LE DUC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHERBOURG', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHOLET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CLAYE SOUILLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COIGNIERES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COLMAR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COMPIÈGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ALENÇON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORBEIL ESSONNES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORMEILLES EN PARISIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORMONTREUIL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COULOMMIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CROUTELLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI DAVEZIEUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ARRAS - DUISANS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ECHIROLLES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI EPINAL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ESSEY LES NANCY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI FLEURY LES AUBRAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI FONTAINE LES DIJON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI GENNEVILLIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI EVREUX - GUICHAINVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTIVILLIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI HENIN BEAUMONT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TARBES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA CHAPELLE SAINT AUBIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT ETIENNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULON LA GARDE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA RAVOIRE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA ROCHE SUR YON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA SEYNE SUR MER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA VILLE DU BOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LAGNY SUR MARNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LANESTER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LANGON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LAXOU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LE GRAND QUEVILLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AVIGNON NORD - LE PONTET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LE PUY-EN-VELAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LESCURE D'ALBIGEOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LIMOGES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LONGUEAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LYS-LEZ-LANNOY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MARMOUTIER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MARSEILLE GRAND LITTORAL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MERIGNAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONDEVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTAUBAN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTCEAU-LES-MINES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTELIMAR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI JOUY AUX ARCHES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NARBONNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RONCQ NEUVILLE EN FERRAIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NIMES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NIORT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NOEUX LES MINES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NOYON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ORANGE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ORVAULT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PERPIGNAN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PERREUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PISSY POVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PLAISIR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PONT DU CHATEAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PONTAULT COMBAULT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PROUVY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CAMBRAI - PROVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PUGET SUR ARGENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI DIJON - QUETIGNY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI QUIMPER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI REDON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RILLIEUX LA PAPE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RIVESALTES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ROMILLY-SUR-SEINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RUAUDIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BERTHEVIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRICE COURCELLES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRICE SOUS FORET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRIEUC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-DIZIER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT GERMAIN DU PUY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT GREGOIRE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT MALO', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MARD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MARTIN-DES-CHAMPS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATEAUROUX - SAINT MAUR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MAXIMIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHALONS EN CHAMPAGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT OUEN L AUMONE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-PARRES-AUX-TERTRES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT PÉRAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT PRIEST', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT QUENTIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINTE EULALIE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINTE GENEVIÈVE DES BOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SCHWEIGHOUSE SUR MODER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SECLIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SEMECOURT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ENGLOS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SERVON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANNECY - SEYNOD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TERVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THEIX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THIAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULOUSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULOUSE ST ORENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ALBERTVILLE - TOURNON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOURS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PÉRIGUEUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VALENCE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VARENNES SUR SEINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VAUXBUIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VENDENHEIM', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VENDIN LE VIEIL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VERNOUILLET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VERT SAINT DENIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLEFRANCHE-SUR-SAÔNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLEMOMBLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI WITTENHEIM', available: true, pick_up_enabled: true } ]; // Variables pour éviter les conflits avec le système de filtres let isUpdating = false; let stockUpdateQueue = []; function updateStockDisplay() { if (isUpdating) { // Si une mise à jour est en cours, ajouter à la queue stockUpdateQueue.push(productId); return; } const filterShopElement = document.getElementById('filtershop-1_dealer'); const currentUrl = window.location.href; let storeName = null; let searchStoreName = null; // Détecter le filtre boutique actif if (filterShopElement && filterShopElement.textContent.trim() !== '') { storeName = filterShopElement.textContent.trim(); searchStoreName = storeName.replace('STOKOMANI ', ''); } else if (currentUrl.includes('filter.p.tag=STOKOMANI')) { const match = currentUrl.match(/filter\.p\.tag=STOKOMANI\+([^&]+)/); if (match) { searchStoreName = decodeURIComponent(match[1]).replace(/\+/g, ' '); storeName = 'STOKOMANI ' + searchStoreName; } } // Recherche simple et fiable de l'élément stock const findStockElement = () => { return document.querySelector('[data-product-id="' + productId + '"] .product-card__stock'); }; const stockElement = findStockElement(); if (!stockElement) { return; } // Marquer comme en cours de mise à jour isUpdating = true; if (storeName && searchStoreName) { // Filtre boutique actif - afficher le stock spécifique // Vérifier si le produit a des données de pickup if (storeAvailabilities.length === 0) { // Produit sans pickup - afficher le stock général avec mention boutique const originalAvailable = true; const color = originalAvailable ? '#0D8756' : '#FF2E17'; const status = originalAvailable ? 'En stock' : 'Rupture de stock'; const dotColor = originalAvailable ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; stockElement.setAttribute('data-stock-updated', 'true'); return; } const storeStock = storeAvailabilities.find(store => store.name.toUpperCase().includes(searchStoreName.toUpperCase()) || searchStoreName.toUpperCase().includes(store.name.toUpperCase()) ); if (storeStock) { const color = storeStock.available ? '#0D8756' : '#FF2E17'; const status = storeStock.available ? 'En stock' : 'Rupture de stock'; const dotColor = storeStock.available ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; // Marquer l'élément pour éviter qu'il soit écrasé stockElement.setAttribute('data-stock-updated', 'true'); stockElement.setAttribute('data-store-filter', searchStoreName); } else { // Boutique non trouvée - afficher stock général avec mention const originalAvailable = true; const color = originalAvailable ? '#0D8756' : '#FF2E17'; const status = originalAvailable ? 'En stock' : 'Rupture de stock'; const dotColor = originalAvailable ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; stockElement.setAttribute('data-stock-updated', 'true'); } } else { // Pas de filtre boutique - afficher stock général const originalAvailable = true; if (originalAvailable) { stockElement.innerHTML = '<span style="color: #0D8756;"><span style="background-color: #22c55e; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>En stock</span>'; } else { stockElement.innerHTML = '<span style="color: #FF2E17;"><span style="background-color: #ef4444; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>Rupture de stock</span>'; } stockElement.removeAttribute('data-stock-updated'); stockElement.removeAttribute('data-store-filter'); } // Marquer comme terminé setTimeout(() => { isUpdating = false; // Traiter la queue si nécessaire if (stockUpdateQueue.length > 0) { stockUpdateQueue = []; setTimeout(updateStockDisplay, 100); } }, 50); } // Événements Shopify pour détecter les recharges de sections function setupShopifyEventListeners() { // Écouter les événements de rechargement de sections Shopify ['shopify:section:load', 'shopify:section:reorder'].forEach(eventName => { document.addEventListener(eventName, function() { // Attendre que Shopify ait fini de recharger, puis mettre à jour setTimeout(updateStockDisplay, 1500); }); }); // Écouter les soumissions de formulaires de filtres document.addEventListener('submit', function(e) { if (e.target && e.target.getAttribute('is') === 'facet-form') { // Attendre que les filtres soient appliqués setTimeout(updateStockDisplay, 2000); } }); // Écouter les changements d'historique (navigation) window.addEventListener('popstate', function() { setTimeout(updateStockDisplay, 1000); }); } // Observer les changements dans le DOM function setupDOMObserver() { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { // Vérifier si notre élément produit a été ajouté if (mutation.type === 'childList') { mutation.addedNodes.forEach((node) => { if (node.nodeType === 1) { // Element node // Vérifier si le nœud ajouté est notre produit ou le contient if (node.getAttribute && node.getAttribute('data-product-id') === productId) { setTimeout(updateStockDisplay, 100); } else if (node.querySelector && node.querySelector('[data-product-id="' + productId + '"]')) { setTimeout(updateStockDisplay, 100); } } }); } }); }); // Observer tout le body pour les changements observer.observe(document.body, { childList: true, subtree: true }); return observer; } // Initialisation function init() { // Première tentative immédiate setTimeout(updateStockDisplay, 100); // Deuxième tentative après Shopify setTimeout(updateStockDisplay, 1500); // Troisième tentative (fallback) setTimeout(updateStockDisplay, 3000); // Configurer l'observer DOM const domObserver = setupDOMObserver(); // Configurer les événements Shopify setupShopifyEventListeners(); // Observer les changements d'URL périodiquement (fallback) let lastUrl = window.location.href; const urlChecker = setInterval(() => { const currentUrl = window.location.href; if (currentUrl !== lastUrl && !isUpdating) { lastUrl = currentUrl; setTimeout(updateStockDisplay, 500); } }, 1000); // Tentatives périodiques de récupération (pour les éléments perdus) let retryCount = 0; const retryInterval = setInterval(() => { const productElement = document.querySelector('[data-product-id="' + productId + '"]'); if (!productElement && retryCount < 10) { setTimeout(updateStockDisplay, 200); retryCount++; } else if (productElement) { clearInterval(retryInterval); } else if (retryCount >= 10) { clearInterval(retryInterval); } }, 2000); } // Lancer l'initialisation if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); En stock"
By comparing stokomani.fr to other leading websites in its niche, marketers and researchers can identify key traffic sources and growth opportunities. Explore our related resources below to find websites similar to stokomani.fr.
Yes, according to our latest analysis, we detected a valid SSL certificate ensuring a secure connection.
As of October 15, 2026, stokomani.fr holds an estimated domain authority score of 38/100 based on our VisitRank tracking algorithms.
You can find the best alternatives and similar sites to stokomani.fr in our explore section, which includes competitors in the E-commerce & Retail sector.
Common Misspellings & Typo Domains for stokomani.fr:
"(function() { const productId = '10863908553038'; // Données de stock réelles du produit (depuis Liquid) const storeAvailabilities = [ { name: 'STOKOMANI ALES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AMIENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGOULINS-SUR- MER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANNEMASSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THONON LES BAINS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI OYONNAX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ARQUES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AURILLAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AUTUN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AVIGNON SUD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BASSE GOULAINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BEAUVAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BERGERAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BÉZIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLENEUVE SUR LOT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BLAGNAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AGEN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BORDEAUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BOURG EN BRESSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BOURGOIN-JALLIEU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BREST', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BRIVE LA GAILLARDE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MANTES BUCHELAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PLAN DE CAMPAGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CALAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CARCASSONNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MACON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHALON SUR SAÔNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHAMBLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHAMBRAY LES TOURS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGOULÊME CHAMPNIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RENNES CHANTEPIE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHARLEVILLE-MÉZIÈRES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COGNAC - CHÂTEAUBERNARD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATEAUBRIANT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATILLON LE DUC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHERBOURG', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHOLET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CLAYE SOUILLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COIGNIERES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COLMAR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COMPIÈGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ALENÇON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORBEIL ESSONNES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORMEILLES EN PARISIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORMONTREUIL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COULOMMIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CROUTELLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI DAVEZIEUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ARRAS - DUISANS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ECHIROLLES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI EPINAL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ESSEY LES NANCY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI FLEURY LES AUBRAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI FONTAINE LES DIJON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI GENNEVILLIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI EVREUX - GUICHAINVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTIVILLIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI HENIN BEAUMONT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TARBES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA CHAPELLE SAINT AUBIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT ETIENNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULON LA GARDE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA RAVOIRE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA ROCHE SUR YON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA SEYNE SUR MER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA VILLE DU BOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LAGNY SUR MARNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LANESTER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LANGON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LAXOU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LE GRAND QUEVILLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AVIGNON NORD - LE PONTET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LE PUY-EN-VELAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LESCURE D'ALBIGEOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LIMOGES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LONGUEAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LYS-LEZ-LANNOY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MARMOUTIER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MARSEILLE GRAND LITTORAL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MERIGNAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONDEVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTAUBAN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTCEAU-LES-MINES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTELIMAR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI JOUY AUX ARCHES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NARBONNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RONCQ NEUVILLE EN FERRAIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NIMES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NIORT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NOEUX LES MINES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NOYON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ORANGE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ORVAULT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PERPIGNAN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PERREUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PISSY POVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PLAISIR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PONT DU CHATEAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PONTAULT COMBAULT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PROUVY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CAMBRAI - PROVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PUGET SUR ARGENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI DIJON - QUETIGNY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI QUIMPER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI REDON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RILLIEUX LA PAPE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RIVESALTES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ROMILLY-SUR-SEINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RUAUDIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BERTHEVIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRICE COURCELLES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRICE SOUS FORET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRIEUC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-DIZIER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT GERMAIN DU PUY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT GREGOIRE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT MALO', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MARD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MARTIN-DES-CHAMPS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATEAUROUX - SAINT MAUR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MAXIMIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHALONS EN CHAMPAGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT OUEN L AUMONE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-PARRES-AUX-TERTRES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT PÉRAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT PRIEST', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT QUENTIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINTE EULALIE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINTE GENEVIÈVE DES BOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SCHWEIGHOUSE SUR MODER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SECLIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SEMECOURT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ENGLOS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SERVON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANNECY - SEYNOD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TERVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THEIX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THIAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULOUSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULOUSE ST ORENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ALBERTVILLE - TOURNON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOURS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PÉRIGUEUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VALENCE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VARENNES SUR SEINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VAUXBUIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VENDENHEIM', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VENDIN LE VIEIL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VERNOUILLET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VERT SAINT DENIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLEFRANCHE-SUR-SAÔNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLEMOMBLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI WITTENHEIM', available: true, pick_up_enabled: true } ]; // Variables pour éviter les conflits avec le système de filtres let isUpdating = false; let stockUpdateQueue = []; function updateStockDisplay() { if (isUpdating) { // Si une mise à jour est en cours, ajouter à la queue stockUpdateQueue.push(productId); return; } const filterShopElement = document.getElementById('filtershop-1_dealer'); const currentUrl = window.location.href; let storeName = null; let searchStoreName = null; // Détecter le filtre boutique actif if (filterShopElement && filterShopElement.textContent.trim() !== '') { storeName = filterShopElement.textContent.trim(); searchStoreName = storeName.replace('STOKOMANI ', ''); } else if (currentUrl.includes('filter.p.tag=STOKOMANI')) { const match = currentUrl.match(/filter\.p\.tag=STOKOMANI\+([^&]+)/); if (match) { searchStoreName = decodeURIComponent(match[1]).replace(/\+/g, ' '); storeName = 'STOKOMANI ' + searchStoreName; } } // Recherche simple et fiable de l'élément stock const findStockElement = () => { return document.querySelector('[data-product-id="' + productId + '"] .product-card__stock'); }; const stockElement = findStockElement(); if (!stockElement) { return; } // Marquer comme en cours de mise à jour isUpdating = true; if (storeName && searchStoreName) { // Filtre boutique actif - afficher le stock spécifique // Vérifier si le produit a des données de pickup if (storeAvailabilities.length === 0) { // Produit sans pickup - afficher le stock général avec mention boutique const originalAvailable = true; const color = originalAvailable ? '#0D8756' : '#FF2E17'; const status = originalAvailable ? 'En stock' : 'Rupture de stock'; const dotColor = originalAvailable ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; stockElement.setAttribute('data-stock-updated', 'true'); return; } const storeStock = storeAvailabilities.find(store => store.name.toUpperCase().includes(searchStoreName.toUpperCase()) || searchStoreName.toUpperCase().includes(store.name.toUpperCase()) ); if (storeStock) { const color = storeStock.available ? '#0D8756' : '#FF2E17'; const status = storeStock.available ? 'En stock' : 'Rupture de stock'; const dotColor = storeStock.available ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; // Marquer l'élément pour éviter qu'il soit écrasé stockElement.setAttribute('data-stock-updated', 'true'); stockElement.setAttribute('data-store-filter', searchStoreName); } else { // Boutique non trouvée - afficher stock général avec mention const originalAvailable = true; const color = originalAvailable ? '#0D8756' : '#FF2E17'; const status = originalAvailable ? 'En stock' : 'Rupture de stock'; const dotColor = originalAvailable ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; stockElement.setAttribute('data-stock-updated', 'true'); } } else { // Pas de filtre boutique - afficher stock général const originalAvailable = true; if (originalAvailable) { stockElement.innerHTML = '<span style="color: #0D8756;"><span style="background-color: #22c55e; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>En stock</span>'; } else { stockElement.innerHTML = '<span style="color: #FF2E17;"><span style="background-color: #ef4444; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>Rupture de stock</span>'; } stockElement.removeAttribute('data-stock-updated'); stockElement.removeAttribute('data-store-filter'); } // Marquer comme terminé setTimeout(() => { isUpdating = false; // Traiter la queue si nécessaire if (stockUpdateQueue.length > 0) { stockUpdateQueue = []; setTimeout(updateStockDisplay, 100); } }, 50); } // Événements Shopify pour détecter les recharges de sections function setupShopifyEventListeners() { // Écouter les événements de rechargement de sections Shopify ['shopify:section:load', 'shopify:section:reorder'].forEach(eventName => { document.addEventListener(eventName, function() { // Attendre que Shopify ait fini de recharger, puis mettre à jour setTimeout(updateStockDisplay, 1500); }); }); // Écouter les soumissions de formulaires de filtres document.addEventListener('submit', function(e) { if (e.target && e.target.getAttribute('is') === 'facet-form') { // Attendre que les filtres soient appliqués setTimeout(updateStockDisplay, 2000); } }); // Écouter les changements d'historique (navigation) window.addEventListener('popstate', function() { setTimeout(updateStockDisplay, 1000); }); } // Observer les changements dans le DOM function setupDOMObserver() { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { // Vérifier si notre élément produit a été ajouté if (mutation.type === 'childList') { mutation.addedNodes.forEach((node) => { if (node.nodeType === 1) { // Element node // Vérifier si le nœud ajouté est notre produit ou le contient if (node.getAttribute && node.getAttribute('data-product-id') === productId) { setTimeout(updateStockDisplay, 100); } else if (node.querySelector && node.querySelector('[data-product-id="' + productId + '"]')) { setTimeout(updateStockDisplay, 100); } } }); } }); }); // Observer tout le body pour les changements observer.observe(document.body, { childList: true, subtree: true }); return observer; } // Initialisation function init() { // Première tentative immédiate setTimeout(updateStockDisplay, 100); // Deuxième tentative après Shopify setTimeout(updateStockDisplay, 1500); // Troisième tentative (fallback) setTimeout(updateStockDisplay, 3000); // Configurer l'observer DOM const domObserver = setupDOMObserver(); // Configurer les événements Shopify setupShopifyEventListeners(); // Observer les changements d'URL périodiquement (fallback) let lastUrl = window.location.href; const urlChecker = setInterval(() => { const currentUrl = window.location.href; if (currentUrl !== lastUrl && !isUpdating) { lastUrl = currentUrl; setTimeout(updateStockDisplay, 500); } }, 1000); // Tentatives périodiques de récupération (pour les éléments perdus) let retryCount = 0; const retryInterval = setInterval(() => { const productElement = document.querySelector('[data-product-id="' + productId + '"]'); if (!productElement && retryCount < 10) { setTimeout(updateStockDisplay, 200); retryCount++; } else if (productElement) { clearInterval(retryInterval); } else if (retryCount >= 10) { clearInterval(retryInterval); } }, 2000); } // Lancer l'initialisation if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); En stock"
"(function() { const productId = '16097309196622'; // Données de stock réelles du produit (depuis Liquid) const storeAvailabilities = [ { name: 'STOKOMANI ALES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AMIENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGOULINS-SUR- MER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANNEMASSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THONON LES BAINS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI OYONNAX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ARQUES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AURILLAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AUTUN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AVIGNON SUD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BASSE GOULAINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BEAUVAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BERGERAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BÉZIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLENEUVE SUR LOT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BLAGNAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AGEN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BORDEAUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BOURG EN BRESSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BOURGOIN-JALLIEU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BREST', available: true, pick_up_enabled: true }, { name: 'STOKOMANI BRIVE LA GAILLARDE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MANTES BUCHELAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PLAN DE CAMPAGNE', available: false, pick_up_enabled: true }, { name: 'STOKOMANI CALAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CARCASSONNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MACON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHALON SUR SAÔNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHAMBLY', available: false, pick_up_enabled: true }, { name: 'STOKOMANI CHAMBRAY LES TOURS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANGOULÊME CHAMPNIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RENNES CHANTEPIE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHARLEVILLE-MÉZIÈRES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COGNAC - CHÂTEAUBERNARD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATEAUBRIANT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATILLON LE DUC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHERBOURG', available: false, pick_up_enabled: true }, { name: 'STOKOMANI CHOLET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CLAYE SOUILLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COIGNIERES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COLMAR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COMPIÈGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ALENÇON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORBEIL ESSONNES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORMEILLES EN PARISIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CORMONTREUIL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI COULOMMIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CROUTELLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI DAVEZIEUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ARRAS - DUISANS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ECHIROLLES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI EPINAL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ESSEY LES NANCY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI FLEURY LES AUBRAIS', available: false, pick_up_enabled: true }, { name: 'STOKOMANI FONTAINE LES DIJON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI GENNEVILLIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI EVREUX - GUICHAINVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTIVILLIERS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI HENIN BEAUMONT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TARBES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA CHAPELLE SAINT AUBIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT ETIENNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULON LA GARDE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA RAVOIRE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA ROCHE SUR YON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA SEYNE SUR MER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LA VILLE DU BOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LAGNY SUR MARNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LANESTER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LANGON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LAXOU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LE GRAND QUEVILLY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI AVIGNON NORD - LE PONTET', available: false, pick_up_enabled: true }, { name: 'STOKOMANI LE PUY-EN-VELAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LESCURE D'ALBIGEOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LIMOGES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LONGUEAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI LYS-LEZ-LANNOY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MARMOUTIER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MARSEILLE GRAND LITTORAL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MERIGNAC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONDEVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTAUBAN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTCEAU-LES-MINES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI MONTELIMAR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI JOUY AUX ARCHES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NARBONNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RONCQ NEUVILLE EN FERRAIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NIMES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NIORT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NOEUX LES MINES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI NOYON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ORANGE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ORVAULT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PERPIGNAN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PERREUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PISSY POVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PLAISIR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PONT DU CHATEAU', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PONTAULT COMBAULT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PROUVY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CAMBRAI - PROVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PUGET SUR ARGENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI DIJON - QUETIGNY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI QUIMPER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI REDON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RILLIEUX LA PAPE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RIVESALTES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ROMILLY-SUR-SEINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI RUAUDIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BERTHEVIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRICE COURCELLES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRICE SOUS FORET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT BRIEUC', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-DIZIER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT GERMAIN DU PUY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT GREGOIRE', available: false, pick_up_enabled: true }, { name: 'STOKOMANI SAINT MALO', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MARD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MARTIN-DES-CHAMPS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHATEAUROUX - SAINT MAUR', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-MAXIMIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI CHALONS EN CHAMPAGNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT OUEN L AUMONE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT-PARRES-AUX-TERTRES', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT PÉRAY', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT PRIEST', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINT QUENTIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINTE EULALIE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SAINTE GENEVIÈVE DES BOIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SCHWEIGHOUSE SUR MODER', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SECLIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SEMECOURT', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ENGLOS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI SERVON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ANNECY - SEYNOD', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TERVILLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI THEIX', available: false, pick_up_enabled: true }, { name: 'STOKOMANI THIAIS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULOUSE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOULOUSE ST ORENS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI ALBERTVILLE - TOURNON', available: true, pick_up_enabled: true }, { name: 'STOKOMANI TOURS', available: true, pick_up_enabled: true }, { name: 'STOKOMANI PÉRIGUEUX', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VALENCE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VARENNES SUR SEINE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VAUXBUIN', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VENDENHEIM', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VENDIN LE VIEIL', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VERNOUILLET', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VERT SAINT DENIS', available: false, pick_up_enabled: true }, { name: 'STOKOMANI VILLEFRANCHE-SUR-SAÔNE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI VILLEMOMBLE', available: true, pick_up_enabled: true }, { name: 'STOKOMANI WITTENHEIM', available: true, pick_up_enabled: true } ]; // Variables pour éviter les conflits avec le système de filtres let isUpdating = false; let stockUpdateQueue = []; function updateStockDisplay() { if (isUpdating) { // Si une mise à jour est en cours, ajouter à la queue stockUpdateQueue.push(productId); return; } const filterShopElement = document.getElementById('filtershop-1_dealer'); const currentUrl = window.location.href; let storeName = null; let searchStoreName = null; // Détecter le filtre boutique actif if (filterShopElement && filterShopElement.textContent.trim() !== '') { storeName = filterShopElement.textContent.trim(); searchStoreName = storeName.replace('STOKOMANI ', ''); } else if (currentUrl.includes('filter.p.tag=STOKOMANI')) { const match = currentUrl.match(/filter\.p\.tag=STOKOMANI\+([^&]+)/); if (match) { searchStoreName = decodeURIComponent(match[1]).replace(/\+/g, ' '); storeName = 'STOKOMANI ' + searchStoreName; } } // Recherche simple et fiable de l'élément stock const findStockElement = () => { return document.querySelector('[data-product-id="' + productId + '"] .product-card__stock'); }; const stockElement = findStockElement(); if (!stockElement) { return; } // Marquer comme en cours de mise à jour isUpdating = true; if (storeName && searchStoreName) { // Filtre boutique actif - afficher le stock spécifique // Vérifier si le produit a des données de pickup if (storeAvailabilities.length === 0) { // Produit sans pickup - afficher le stock général avec mention boutique const originalAvailable = true; const color = originalAvailable ? '#0D8756' : '#FF2E17'; const status = originalAvailable ? 'En stock' : 'Rupture de stock'; const dotColor = originalAvailable ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; stockElement.setAttribute('data-stock-updated', 'true'); return; } const storeStock = storeAvailabilities.find(store => store.name.toUpperCase().includes(searchStoreName.toUpperCase()) || searchStoreName.toUpperCase().includes(store.name.toUpperCase()) ); if (storeStock) { const color = storeStock.available ? '#0D8756' : '#FF2E17'; const status = storeStock.available ? 'En stock' : 'Rupture de stock'; const dotColor = storeStock.available ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; // Marquer l'élément pour éviter qu'il soit écrasé stockElement.setAttribute('data-stock-updated', 'true'); stockElement.setAttribute('data-store-filter', searchStoreName); } else { // Boutique non trouvée - afficher stock général avec mention const originalAvailable = true; const color = originalAvailable ? '#0D8756' : '#FF2E17'; const status = originalAvailable ? 'En stock' : 'Rupture de stock'; const dotColor = originalAvailable ? '#22c55e' : '#ef4444'; stockElement.innerHTML = '<span style="color: ' + color + '; font-weight: 500;"><span style="background-color: ' + dotColor + '; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>' + status + '</span>'; stockElement.setAttribute('data-stock-updated', 'true'); } } else { // Pas de filtre boutique - afficher stock général const originalAvailable = true; if (originalAvailable) { stockElement.innerHTML = '<span style="color: #0D8756;"><span style="background-color: #22c55e; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>En stock</span>'; } else { stockElement.innerHTML = '<span style="color: #FF2E17;"><span style="background-color: #ef4444; width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle;"></span>Rupture de stock</span>'; } stockElement.removeAttribute('data-stock-updated'); stockElement.removeAttribute('data-store-filter'); } // Marquer comme terminé setTimeout(() => { isUpdating = false; // Traiter la queue si nécessaire if (stockUpdateQueue.length > 0) { stockUpdateQueue = []; setTimeout(updateStockDisplay, 100); } }, 50); } // Événements Shopify pour détecter les recharges de sections function setupShopifyEventListeners() { // Écouter les événements de rechargement de sections Shopify ['shopify:section:load', 'shopify:section:reorder'].forEach(eventName => { document.addEventListener(eventName, function() { // Attendre que Shopify ait fini de recharger, puis mettre à jour setTimeout(updateStockDisplay, 1500); }); }); // Écouter les soumissions de formulaires de filtres document.addEventListener('submit', function(e) { if (e.target && e.target.getAttribute('is') === 'facet-form') { // Attendre que les filtres soient appliqués setTimeout(updateStockDisplay, 2000); } }); // Écouter les changements d'historique (navigation) window.addEventListener('popstate', function() { setTimeout(updateStockDisplay, 1000); }); } // Observer les changements dans le DOM function setupDOMObserver() { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { // Vérifier si notre élément produit a été ajouté if (mutation.type === 'childList') { mutation.addedNodes.forEach((node) => { if (node.nodeType === 1) { // Element node // Vérifier si le nœud ajouté est notre produit ou le contient if (node.getAttribute && node.getAttribute('data-product-id') === productId) { setTimeout(updateStockDisplay, 100); } else if (node.querySelector && node.querySelector('[data-product-id="' + productId + '"]')) { setTimeout(updateStockDisplay, 100); } } }); } }); }); // Observer tout le body pour les changements observer.observe(document.body, { childList: true, subtree: true }); return observer; } // Initialisation function init() { // Première tentative immédiate setTimeout(updateStockDisplay, 100); // Deuxième tentative après Shopify setTimeout(updateStockDisplay, 1500); // Troisième tentative (fallback) setTimeout(updateStockDisplay, 3000); // Configurer l'observer DOM const domObserver = setupDOMObserver(); // Configurer les événements Shopify setupShopifyEventListeners(); // Observer les changements d'URL périodiquement (fallback) let lastUrl = window.location.href; const urlChecker = setInterval(() => { const currentUrl = window.location.href; if (currentUrl !== lastUrl && !isUpdating) { lastUrl = currentUrl; setTimeout(updateStockDisplay, 500); } }, 1000); // Tentatives périodiques de récupération (pour les éléments perdus) let retryCount = 0; const retryInterval = setInterval(() => { const productElement = document.querySelector('[data-product-id="' + productId + '"]'); if (!productElement && retryCount < 10) { setTimeout(updateStockDisplay, 200); retryCount++; } else if (productElement) { clearInterval(retryInterval); } else if (retryCount >= 10) { clearInterval(retryInterval); } }, 2000); } // Lancer l'initialisation if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })(); En stock"