async function fetchData() { const container = document.querySelector('.card-container'); container.innerHTML = '

Chargement des coupons...

'; // Message de chargement // Fonction pour effectuer une requête avec gestion des erreurs et retries async function fetchWithRetry(url, maxRetries = 3, delay = 5000) { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const response = await fetch(url); if (response.status === 429) { // Si erreur 429, attendre et réessayer console.warn(`Erreur 429: Trop de requêtes. Tentative ${attempt}/${maxRetries}. Réessai dans ${delay / 1000} secondes...`); if (attempt === maxRetries) { throw new Error('Trop de tentatives échouées : erreur 429'); } await new Promise(resolve => setTimeout(resolve, delay)); continue; } if (!response.ok) { throw new Error(`Erreur HTTP : ${response.status}`); } return await response.text(); } catch (error) { if (attempt === maxRetries || error.message !== 'Trop de tentatives échouées : erreur 429') { throw error; // Relancer l'erreur si toutes les tentatives échouent } } } } try { // Récupérer les données avec gestion des retries const data = await fetchWithRetry( 'https://docs.google.com/spreadsheets/d/e/2PACX-1vT3fVG54fMdWASOjDKSiHop0AuQQ8RB-T82gF0C_Vg9oSjbwwPJ3nIszJQxBzrDjNsux5ig6YDm6vcS/pub?gid=0&single=true&output=csv' ); const rows = data.split(/\r?\n/).slice(1); // Supprimer la ligne d'en-tête // Vider le conteneur après le chargement container.innerHTML = ''; const totalRows = rows.length; if (totalRows === 0) { container.innerHTML = '

Aucun coupon disponible pour le moment.

'; return; } // Sélectionner 10 lignes au hasard if (totalRows <= 10) { rows.forEach(row => { const columns = row.split(','); if (columns.length < 17) return; createCard(columns, container); }); } else { const indices = new Set(); while (indices.size < 10) { const randomIndex = Math.floor(Math.random() * totalRows); indices.add(randomIndex); } indices.forEach(index => { const row = rows[index]; const columns = row.split(','); if (columns.length < 17) return; createCard(columns, container); }); } } catch (error) { console.error('Erreur lors de la récupération des données:', error); container.innerHTML = '

Erreur lors du chargement des coupons. Veuillez réessayer plus tard.

'; } } // Fonction pour créer une carte function createCard(columns, container) { const merchant = columns[0].trim(); const description = columns[1].trim(); const couponCode = columns[2].trim(); const trackingUrl = columns[3].trim(); const imageUri = columns[10