${components.Highlight({ hit: item, attribute: 'label', })}
`; }, header({ items, html }) { if (items.length === 0) { return ""; } return html`
Vos dernières recherches
`; }, }, }; }, }); const redirectUrlPlugin = createRedirectUrlPlugin({ onRedirect(redirects, { event, navigator, state }) { const item = redirects.find(({ sourceId }) => sourceId === "products"); if (item) { const itemUrl = item && item.urls ? item.urls[0] : ''; if (itemUrl) { // Tracking in events.js if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.redirectFromAlgoliaSearch === 'function') { EVENTS_TC.algoliaAutocomplete.redirectFromAlgoliaSearch(item.indexName || "", state.query, itemUrl || ""); } navigator.navigate({ itemUrl, item, state }); } } else { return; } }, }); function createUrl(index, query) { return `/catalog/search?${index}[query]=${query}`; } function getQS(item) { let hl = item._highlightResult; let isHighlighted = hl.query && hl.query.value != ''; if (!isHighlighted) { return item.query } return getQSHighlight(hl); } function getQSHighlight(highlight) { let query = ''; if (highlight.query && highlight.query.value) { let query = highlight.query.value; if (query && query.length > 0) { var startHighlight = "__aa-highlight__"; var endHighlight = "__/aa-highlight__"; var startIndex = query.indexOf(startHighlight); if (startIndex == 0) { // the highlighted word is the first one in the query var n = startIndex + startHighlight.length; //position of the first letter to upper case query = query.substring(0, n) + query[n].toUpperCase() + query.substring(n + 1); // upper case first letter } else { query = query[0].toUpperCase() + query.substring(1); } query = query.replaceAll(startHighlight, "").replaceAll(endHighlight, ""); const sanitizedQuery = DOMPurify.sanitize(query, { ALLOWED_TAGS: ['strong', 'em', 'b', 'i'], ALLOWED_ATTR: [] }); return { __html: sanitizedQuery }; } return { __html: '' }; } else { return { __html: '' }; } } function getQuerySuggestionTemplate(index, item, html) { return html` `; } var querySuggestionsPlugin = null; if (isQuerySuggestionsActive) { querySuggestionsPlugin = createQuerySuggestionsPlugin({ searchClient, indexName: querySuggestionsIndexName, transformSource({ source, onTapAhead }) { return { ...source, onSelect({ item }) { if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.selectQuerySuggestionACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.selectQuerySuggestionACAlgolia(querySuggestionsIndexName, item.query); } }, getItemUrl({ item }) { return createUrl(productsIndexName, item.query); }, templates: { ...source.templates, item(params) { const { item, html } = params; return getQuerySuggestionTemplate(productsIndexName, item, html); }, header({ items, html, state }) { if (items.length === 0) { return ""; } if (isPopularSuggestionsActive) { const hasQuery = state.query !== ''; const title = hasQuery ? 'Suggestions de recherche' : 'Nos recherches populaires'; return html`
${title}
`; } else { return html`
Suggestions de recherche
`; } } }, }; } }) } function submitSearch(query, isSeeAll) { let type = !isSeeAll ? 'submit' : 'suggestion'; let value = !isSeeAll ? 'search' : 'all_items'; // Tracking in events.js if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.submitAlgoliaSearch === 'function') { EVENTS_TC.algoliaAutocomplete.submitAlgoliaSearch(productsIndexName, query, type, value); } window.location.href = createUrl(productsIndexName, query); } function sendEvent(productId, disclaimerId, source) { // if disclaimer id = 0 or disclaimers already accepted, workflow continue const disclaimerCookie = $.cookie("disclaimers"); if ((!disclaimerId || disclaimerId === 0) || (disclaimerCookie && disclaimerCookie === "true")) { if (source.toLowerCase() === "showroomprive") { window.location.href = `/ficheproduit.aspx?produit=${productId}`; } else { window.location.href = `/market/catalog/product.aspx?produit=${productId}`; } } else { if (autocompleteInstance && typeof autocompleteInstance.setIsOpen === 'function') { autocompleteInstance.setIsOpen(false); } DisclaimerPopin.OpenPopin(productId, disclaimerId, source); } } function handleProductClick(productId, disclaimerId, source, addToHistory = false) { // Ajouter à l'historique si demandé et si disclaimers OK if (addToHistory) { const disclaimerCookie = $.cookie("disclaimers"); if ((!disclaimerId || disclaimerId === 0) || (disclaimerCookie && disclaimerCookie === "true")) { RecentlyViewedService.getInstance().addProduct(productId, source); } } // Navigation sendEvent(productId, disclaimerId, source); } function handleRecentProductClick(item) { // Tracking spécifique aux produits récemment vus if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onClickProductHistoryACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onClickProductHistoryACAlgolia(mapProductHistoryItem(item), "suggestion", "item"); } // Navigation (sans ajout à l'historique) sendEvent(item.objectID, item.disclaimerId, item.source); } function clearRecentSearches() { if (globalOnRemove) { const recentSearches = localStorage.getItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); if (recentSearches) { try { const searches = JSON.parse(recentSearches); // Supprimer tous les éléments en utilisant la méthode du plugin searches.forEach(search => { globalOnRemove(search.id); }); } catch (e) { // En cas d'erreur de parsing, supprimer complètement localStorage.removeItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); } } } else { // Fallback si globalOnRemove n'est pas disponible localStorage.removeItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); } } function clearRecentlyViewedProducts() { sessionStorage.removeItem('recently_viewed_products'); RecentlyViewedService.getInstance().products = []; RecentlyViewedService.getInstance().cachedProducts = []; RecentlyViewedService.getInstance().lastStorageState = ''; RecentlyViewedService.getInstance().lastCacheTimestamp = 0; // Recharger l'autocomplete const autocompleteInput = document.querySelector('#autocomplete input'); if (autocompleteInput) { autocompleteInput.dispatchEvent(new Event('input', { bubbles: true })); } } function getPriceTemplate(hit, html) { if (hit.discount) { var price = srpFormat.FormatPrice(hit.price); var publicPrice = srpFormat.FormatPrice(hit.publicPrice); return html`
${price}
${publicPrice}
-${hit.discount}%
` } else { var price = srpFormat.FormatPrice(hit.price); return html`
${price}
` } } function handleRedirectFp(disclaimerId, productId, source) { const disclaimerCookie = $.cookie("disclaimers"); if (!disclaimerId || disclaimerId === 0 || (disclaimerCookie && disclaimerCookie === "true")) { if (source.toLowerCase() === "showroomprive") { return `/ficheproduit.aspx?produit=${productId}`; } else { return `/market/catalog/product.aspx?produit=${productId}`; } } else { return '#' } } function mapInsightEventsItemsToProducts(items) { let products = []; for (let i = 0; i < items.length; i++) { let product = { "name": items[i].label, "variantsId": items[i].variants, "id": items[i].objectID, "brand": items[i].brand.label, "saleId": items[i].sale ? items[i].sale.id : null, "price": items[i].price, "position": items[i].__position } products.push(product); } return products; } function mapInsightEventsItemsToSales(items) { let sales = []; for (let i = 0; i < items.length; i++) { let sale = { label: items[i].label, id: items[i].objectID } sales.push(sale); } return sales; } function mapProductHistoryItem(item) { return { "name": item.label, "price": item.price, "variantsId": item.variants, "id": item.objectID, "brand": item.brand.label, } } const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({ aa, onItemsChange({ insights, insightsEvents, state }) { const events = []; insightsEvents.forEach((insightsEvent) => { let index = insightsEvent.index; if (index) { if (index === productsIndexName) { const event = { ...insightsEvent, eventName: 'Items Viewed from Autocomplete', }; events.push(event); let products = mapInsightEventsItemsToProducts(insightsEvent.items); if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onSearchItemACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onSearchItemACAlgolia(productsIndexName, state.query, products); } } if (index === salesIndexName) { const event = { ...insightsEvent, eventName: 'Sales Viewed from Autocomplete', }; events.push(event); let sales = mapInsightEventsItemsToSales(insightsEvent.items); if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onSearchSaleACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onSearchSaleACAlgolia(salesIndexName, state.query, sales); } } } }); insights.viewedObjectIDs(...events); }, onSelect({ insights, insightsEvents, state }) { const events = []; insightsEvents.forEach((insightsEvent) => { let index = insightsEvent.index; if (index) { if (index === productsIndexName) { const event = { ...insightsEvent, eventName: 'Item Selected from Autocomplete', queryId: insightsEvent.queryID }; events.push(event); let itemToTrack = insightsEvent.items.length > 0 ? insightsEvent.items[0] : null; if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onClickItemACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onClickItemACAlgolia(productsIndexName, state.query, itemToTrack); } } if (index === salesIndexName) { const event = { ...insightsEvent, eventName: 'Sale Selected from Autocomplete', queryId: insightsEvent.queryID }; events.push(event); let saleToTrack = insightsEvent.items.length > 0 ? insightsEvent.items[0] : null; if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onClickSaleACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onClickSaleACAlgolia(salesIndexName, state.query, saleToTrack); } } } }); insights.clickedObjectIDsAfterSearch(...events); } }); var plugins = [algoliaInsightsPlugin, redirectUrlPlugin, recentSearchesPlugin]; if (isQuerySuggestionsActive) { plugins.push(querySuggestionsPlugin); } if (isRecentlyViewedActive) { var recentlyViewedPlugin = generateRecentlyViewedPlugin(); plugins.push(recentlyViewedPlugin); } const DEBOUNCE_MS = 200; const debounced = debouncePromise((items) => Promise.resolve(items), DEBOUNCE_MS); function debouncePromise(fn, time) { let timer; return function debounced(...args) { if (timer) { clearTimeout(timer); // Clear the timeout first if it's already defined. } return new Promise((resolve) => { timer = setTimeout(() => resolve(fn(...args)), time); }); }; } const autocompleteInstance = autocomplete({ container: '#autocomplete', placeholder: 'Que recherchez-vous ?', plugins: plugins, openOnFocus: true, insights: true, getSources({ query }) { const sources = [getAlgoliaProducts(query)]; if (isSaleSuggestionsActive) { sources.push(getAlgoliaSales(query)); } return debounced(sources); }, render({ state, elements, render, html }, root) { const { recentSearchesPlugin, products, sales, querySuggestionsPlugin, recentlyViewed } = elements; const currentQuery = state.query; if (isPopularSuggestionsActive) { var recentSearchExists = hasRecentSearchHistory(); var productHistoryExists = hasProductHistory(); var hasQuery = currentQuery !== ''; var displaySales = isSaleSuggestionsActive && hasQuery; var displayQuerySuggestions = isQuerySuggestionsActive && ((!hasQuery && !recentSearchExists) || hasQuery); var displayRecentSearches = !hasQuery && recentSearchExists; var displayProducts = hasQuery || (!hasQuery && !productHistoryExists); var displayRecentlyViewed = isRecentlyViewedActive && !hasQuery && productHistoryExists; render( html`
${displaySales ? sales : ''} ${displayQuerySuggestions ? querySuggestionsPlugin : ''} ${displayRecentSearches ? recentSearchesPlugin : ''}
${displayProducts ? products : ''} ${displayRecentlyViewed ? recentlyViewed : ''}
`, root ); } else { render( html`
${currentQuery !== '' && isSaleSuggestionsActive ? sales : ''} ${currentQuery !== '' && isQuerySuggestionsActive ? querySuggestionsPlugin : ''} ${currentQuery === '' ? recentSearchesPlugin : ''}
${currentQuery !== '' ? products : ''} ${currentQuery === '' && isRecentlyViewedActive ? recentlyViewed : ''}
`, root ); } }, onSubmit: (params) => { const { state } = params; submitSearch(state.query, false) }, classNames: { detachedCancelButton: '', detachedFormContainer: '', detachedContainer: '', detachedOverlay: '', detachedSearchButton: '', detachedSearchButtonIcon: '', detachedSearchButtonPlaceholder: '', detachedSearchButtonQuery: '', form: 'bg-lvl2 js-algolia-form', input: 'champ_mdr main-header__champRecherche__algolia js-input-rch txt-dark', inputWrapper: '', inputWrapperPrefix: 'champ_mdr', inputWrapperSuffix: 'champ_mdr', item: 'd-block col-6 col-l-3', label: '', list: 'grid-row', loadingIndicator: '', panel: 'bg-header', panelLayout: '', clearButton: '', root: '', source: '', sourceFooter: '', sourceHeader: '', sourceNoResults: '', submitButton: '', } }); function getAlgoliaProducts(query) { return { sourceId: 'products', getItems() { return getAlgoliaResults({ searchClient, queries: [ { indexName: productsIndexName, query, params: { ruleContexts: ['enable-redirect-url'], hitsPerPage: 4, clickAnalytics: true, }, }, ], }); }, templates: { item({ item, html }) { // ajoute sur item la vérification qu'il y a bien "m-" devant l'id pour la source marketplace if (item.objectID && !item.objectID.toLowerCase().startsWith('m-') && item.source.toLowerCase() === "marketplace") { item.objectID = `m-${item.objectID}`; } let redirectToFP = handleRedirectFp(item.disclaimerId, item.objectID, item.source); let priceTemplate = getPriceTemplate(item, html); let pictoTemplate = buildProductPictoHtml(item, html); return html`
${item.brand.label}
${item.label}
${priceTemplate}
`; }, header({ items, html, state }) { if (items.length === 0) { return ""; } if (isPopularSuggestionsActive) { const hasQuery = state.query !== ''; const title = hasQuery ? 'Suggestion de produits' : 'Nos produits populaires'; return html`
${title}
${hasQuery ? html` ` : ''}
`; } else { return html`
Suggestion de produits
`; } }, } } }; function getAlgoliaSales(query) { return { sourceId: 'sales', getItems() { return getAlgoliaResults({ searchClient, queries: [ { indexName: salesIndexName, query, params: { ruleContexts: ['enable-redirect-url'], hitsPerPage: 4, clickAnalytics: true }, }, ], }); }, templates: { item({ item, html, components }) { return html`
${buildSaleImageHtml(item, html)}
`; }, header({ items, html }) { if (items.length === 0) { return ""; } return html`
Nos ventes en cours
`; }, } } } // Fonction pour construire une URL avec des paramètres de requête function buildUrlWithQueryParams(baseUrl, params) { if (!baseUrl) return ''; const url = new URL(baseUrl, window.location.origin); Object.keys(params).forEach(key => { url.searchParams.set(key, params[key]); }); return url.toString(); } // Fonction pour générer le HTML picture d'un produit function buildProductImageHtml(item, html) { const altText = item.label || 'Produit'; if (!item.images || !item.images[0]) { // Pas d'image mais on garde la structure avec alt descriptif return html` ${altText} `; } const webp320 = buildUrlWithQueryParams(item.images[0], { width: "320", quality: "90", output: "webp" }); const webp640 = buildUrlWithQueryParams(item.images[0], { width: "640", quality: "90", output: "webp" }); const jpg320 = buildUrlWithQueryParams(item.images[0], { width: "320", quality: "90", output: "jpg" }); const jpg640 = buildUrlWithQueryParams(item.images[0], { width: "640", quality: "90", output: "jpg" }); const jpgImg = buildUrlWithQueryParams(item.images[0], { width: "320", quality: "90", output: "jpg" }); return html` ${altText} `; } // Fonction pour générer le HTML picture d'une vente function buildSaleImageHtml(item, html) { const altText = item.label || 'Vente'; if (!item.cardMediaUrl) { // Pas d'image mais on garde la structure avec alt descriptif return html` ${altText} `; } const webp420 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "420", quality: "90", output: "webp" }); const webp840 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "840", quality: "90", output: "webp" }); const jpg420 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "420", quality: "90", output: "jpg" }); const jpg840 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "840", quality: "90", output: "jpg" }); const jpgImg = buildUrlWithQueryParams(item.cardMediaUrl, { width: "420", quality: "90", output: "jpg" }); return html` ${altText} `; } // Fonction pour générer le HTML du picto d'un produit function buildProductPictoHtml(item, html) { if (!item.pictos || !item.pictos.length || !item.pictos[0] || !item.pictos[0].url) { return ''; } const altText = item.pictos[0].label || ''; return html`
${item.pictos[0].label}
`; } const STORAGE_KEY = 'recently_viewed_products'; const MAX_ITEMS = 4; const CACHE_INVALIDATION_INTERVAL = 2 * 60 * 1000; // 2 minutes en millisecondes // Dépendances externes à injecter ou à adapter selon votre projet (function (global) { function RecentlyViewedService() { if (RecentlyViewedService._instance) { return RecentlyViewedService._instance; } this.products = []; this.cachedProducts = []; this.lastStorageState = ''; this.cacheInvalidationInterval = null; this.lastCacheTimestamp = 0; this.abortController = null; this.loadFromStorage(); this.startCacheInvalidation(); RecentlyViewedService._instance = this; } RecentlyViewedService.prototype.startCacheInvalidation = function () { if (this.cacheInvalidationInterval) { clearInterval(this.cacheInvalidationInterval); } this.cacheInvalidationInterval = window.setInterval(() => { this.cachedProducts = []; this.lastCacheTimestamp = 0; }, CACHE_INVALIDATION_INTERVAL); }; RecentlyViewedService.prototype.loadFromStorage = function () { const stored = sessionStorage.getItem(STORAGE_KEY); if (stored) { this.products = JSON.parse(stored); this.lastStorageState = stored; } }; RecentlyViewedService.prototype.saveToStorage = function () { const newState = JSON.stringify(this.products); sessionStorage.setItem(STORAGE_KEY, newState); this.lastStorageState = newState; this.cachedProducts = []; this.lastCacheTimestamp = 0; }; RecentlyViewedService.prototype.addProduct = function (id, source) { this.products = this.products.filter(function (p) { return p.id !== id; }); this.products.unshift({ id: id, source: source }); this.products = this.products.slice(0, MAX_ITEMS); this.saveToStorage(); }; RecentlyViewedService.prototype.getRecentProducts = function () { return this.products.slice(); }; RecentlyViewedService.prototype.hasStorageChanged = function () { const currentState = sessionStorage.getItem(STORAGE_KEY); return currentState !== this.lastStorageState; }; RecentlyViewedService.prototype.fetchProductsDetails = async function () { // Annuler l'appel précédent s'il existe if (this.abortController) { this.abortController.abort(); } this.abortController = new AbortController(); try { const queryParams = encodeURIComponent(JSON.stringify(this.products)); const response = await fetch( document.location.origin + '/api/products/list?products=' + queryParams, { signal: this.abortController.signal } ); if (!response.ok) { throw new Error('Network response was not ok'); } const apiResponse = await response.json(); // Correction ici : utiliser .data si présent, sinon le tableau directement const products = apiResponse.status != null && apiResponse.status.code == 200 ? apiResponse.data : []; this.cachedProducts = Array.isArray(products) ? products.map(function (product) { const hit = {}; Object.assign(hit, product); return hit; }) : []; this.lastCacheTimestamp = Date.now(); this.lastStorageState = JSON.stringify(this.products); if (this.cachedProducts.length > 0) { let trackedProducts = mapInsightEventsItemsToProducts(this.cachedProducts); if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onSearchProductHistoryACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onSearchProductHistoryACAlgolia(trackedProducts, "suggestion", "item_view"); } } return this.cachedProducts; } catch (error) { if (error instanceof Error && error.name === 'AbortError') { return []; } // En cas d'erreur, on retourne un tableau vide au lieu de relancer l'erreur // Cela évite que l'autocomplete réessaie automatiquement // On invalide le cache pour éviter les appels répétés this.cachedProducts = []; this.lastCacheTimestamp = 0; return []; } finally { this.abortController = null; } }; RecentlyViewedService.prototype.getRecentProductsDetails = async function () { if (this.products.length === 0) { return []; } const now = Date.now(); const isCacheExpired = now - this.lastCacheTimestamp > CACHE_INVALIDATION_INTERVAL; if (this.hasStorageChanged() || isCacheExpired || this.cachedProducts.length === 0) { try { return await this.fetchProductsDetails(); } catch (error) { // En cas d'erreur, on retourne le cache existant ou un tableau vide return this.cachedProducts.length > 0 ? this.cachedProducts.slice() : []; } } return this.cachedProducts.slice(); }; RecentlyViewedService.prototype.destroy = function () { if (this.cacheInvalidationInterval) { clearInterval(this.cacheInvalidationInterval); this.cacheInvalidationInterval = null; } if (this.abortController) { this.abortController.abort(); this.abortController = null; } }; // Singleton accessor RecentlyViewedService.getInstance = function () { return new RecentlyViewedService(); }; // Export global global.RecentlyViewedService = RecentlyViewedService; })(typeof window !== 'undefined' ? window : this); function generateRecentlyViewedPlugin() { return { name: 'recentlyViewed', getSources() { return [ { sourceId: 'recentlyViewed', async getItems() { var recentlyViewedService = RecentlyViewedService.getInstance(); return recentlyViewedService.getRecentProductsDetails(); }, templates: { header({ items, html }) { if (items.length === 0) { return ""; } return html`
Derniers produits vus
`; }, item({ item, html, state }) { // ajoute sur item la vérification qu'il y a bien "m-" devant l'id pour la source marketplace if (item.objectID && !item.objectID.toLowerCase().startsWith('m-') && item.source.toLowerCase() === "marketplace") { item.objectID = `m-${item.objectID}`; } var collection = (state.collections.find(function (c) { return c.source.sourceId === 'recentlyViewed'; }) || {}).items; var position = collection ? collection.indexOf(item) : -1; let redirectToFP = handleRedirectFp(item.disclaimerId, item.objectID, item.source); let priceTemplate = getPriceTemplate(item, html); let pictoTemplate = buildProductPictoHtml(item, html); return html`
${item.brand.label}
${item.label}
${priceTemplate}
`; } } } ]; } } } function hasRecentSearchHistory() { const recentSearches = localStorage.getItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); if (!recentSearches) return false; try { const searches = JSON.parse(recentSearches); return Array.isArray(searches) && searches.length > 0; } catch (e) { return false; } } function hasProductHistory() { try { const service = window.RecentlyViewedService.getInstance(); return Array.isArray(service.cachedProducts) && service.cachedProducts.length > 0; } catch (e) { return false; } } // Export global si besoin if (typeof window !== 'undefined') { window.generateRecentlyViewedPlugin = generateRecentlyViewedPlugin; }
Showroomprivé se soucie de votre vie privée
Showroomprive.com utilise des cookies et technologies similaires afin d’analyser la navigation, mesurer l’audience du site et ses performances ainsi que pour vous proposer, avec nos partenaires, des publicités adaptées à vos centres d’intérêts. En cliquant sur « J’accepte », vous consentez au dépôt de ces cookies et notamment à ce que ces informations soient partagées avec nos partenaires. Vous pouvez choisir de cliquer sur « Je refuse » et dans ce cas, vous ne pourrez pas recevoir de contenu personnalisé et seuls les cookies nécessaires au fonctionnement du site seront utilisés. En cliquant sur « Je paramètre mes choix » vous pourrez paramétrer vos préférences et obtenir plus d’informations. Vous pourrez également modifier vos préférences à tout moment (à partir de l’onglet « Gérer mes cookies »). Pour en savoir plus sur la collecte des informations et la manière dont celle-ci sont utilisées rendez-vous ici.
J'accepte
Je refuse