mealz-injector 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ !function(){"use strict";try{if("undefined"!=typeof document){var o=document.createElement("style");o.appendChild(document.createTextNode('.miam-no-scroll{overflow:hidden!important}:root{--miam-color-primary: #0970e6;--miam-color-primary-hover: #0863cc;--miam-color-primary-900: #121212;--miam-color-primary-100: #f7f7f7;--miam-color-neutral-black: #121212;--miam-color-neutral-200: #f7f7f7;--miam-color-secondary-text: #575757;--miam-color-border: #d9d9d9;--miam-color-background-primary-hover: #f7f7f7}:root .miam-ds-text{font-family:Ubuntu,BlinkMacSystemFont,Open Sans,"sans-serif"}:root .miam-ds-text img{margin:unset}:root .miam-ds-button{transition:background-color .3s,border-color .3s,color .3s}:root .miam-ds-button img{margin:unset}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__top .miam-recipe-card__content .miam-recipe-card__top-container .miam-recipe-card__sponsor-container .miam-recipe-card__sponsor-picture{margin:0}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__top .miam-recipe-card__content .miam-recipe-card__picture__bottom .miam-recipe-card__counter img{margin:unset}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__bottom .miam-recipe-card__actions .miam-recipe-card__price .miam-recipe-pricing{max-width:unset}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__bottom .miam-recipe-card__actions .miam-recipe-card__price .miam-recipe-pricing .miam-recipe-pricing__wrapper{width:100%;flex-direction:column}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__bottom .miam-recipe-card__actions .miam-recipe-card__price .miam-recipe-pricing .miam-recipe-pricing__wrapper .miam-recipe-pricing__wrapper__price{color:var(--miam-ds-color-neutral-black)}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__bottom .miam-recipe-card__actions .miam-recipe-card__price .miam-recipe-pricing .miam-recipe-pricing__wrapper .miam-recipe-pricing__wrapper__price span:last-of-type{font-size:14px}:root .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__bottom .miam-recipe-card__actions .miam-recipe-card__price .miam-recipe-pricing .miam-recipe-pricing__wrapper .miam-recipe-pricing__wrapper__subline{color:var(--miam-color-secondary-text);font-size:.75rem;line-height:16px}:root ng-miam-meals-planner-link{display:none}:root webc-miam-recipe-card{display:block;outline:1px solid #e5e5e5}:root webc-miam-recipe-card .miam-recipe-card{border-radius:unset;height:100%;width:auto}:root webc-miam-recipe-card .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__top .miam-recipe-card__content .miam-recipe-card__picture__bottom .miam-recipe-card__counter img{margin:unset}:root webc-miam-recipe-card .miam-recipe-card .miam-recipe-card__container .miam-recipe-card__bottom{border-radius:unset;border:unset}:root .miam-recipe-card-cta button.miam-ds-button{font-weight:400;align-items:center;display:inline-flex;flex-direction:row;gap:.25rem;justify-content:center;padding:unset;height:40px;width:40px;font-size:1.5rem}:root .miam-recipe-card-cta button.miam-ds-button img{display:none}:root .miam-recipe-card-cta button.miam-ds-button:after{font-family:icomoon!important;content:""}:root .miam-recipe-card-cta button.miam-ds-button.secondary.in-basket:hover{border:1px solid var(--miam-ds-color-neutral-black)}:root .miam-recipe-card-cta button.miam-ds-button.secondary.in-basket:after{content:""}:root .miam-like-button.miam-ds-button.primary.reverse.square.small .miam-like-button__icon img{display:none}:root .miam-like-button.miam-ds-button.primary.reverse.square.small .miam-like-button__icon:after{font-family:icomoon!important;content:"";color:var(--miam-color-primary)!important;font-size:16px;line-height:16px}:root .miam-like-button.miam-ds-button.primary.reverse.square.small .miam-like-button__icon.fill:after{content:""}:root .miam-recipe-details__actions__icon .miam-like-button.miam-ds-button.primary.reverse.square.small .miam-like-button__icon:after{font-size:24px;line-height:24px}:root .miam-counter-input .miam-counter-input__counter .miam-counter-input__minus img{display:none}:root .miam-counter-input .miam-counter-input__counter .miam-counter-input__minus:after{font-family:icomoon!important;content:"";color:var(--miam-color-primary)!important;font-size:16px;line-height:16px}:root .miam-counter-input .miam-counter-input__counter .miam-counter-input__plus img{display:none}:root .miam-counter-input .miam-counter-input__counter .miam-counter-input__plus:after{font-family:icomoon!important;content:"";color:var(--miam-color-primary)!important;font-size:16px;line-height:16px}:root .miam-recipe-details .miam-recipe-details__container .miam-recipe-details__picture .miam-recipe-details__banner_buttons .miam-recipe-details__top-button-wrapper .miam-recipe-details__close-button img{display:none}:root .miam-recipe-details .miam-recipe-details__container .miam-recipe-details__picture .miam-recipe-details__banner_buttons .miam-recipe-details__top-button-wrapper .miam-recipe-details__close-button:after{font-family:icomoon!important;content:"";color:var(--miam-ds-color-primary)!important;font-size:24px;line-height:24px}:root .miam-recipe-details .miam-recipe-details__container .miam-recipe-details__picture .miam-recipe-details__banner_buttons .miam-recipe-details__top-button-wrapper .miam-recipe-details__close-button:hover:after{color:var(--miam-ds-color-neutral-white)!important}:root .miam-recipe-details .miam-recipe-details__container .miam-recipe-details__picture .miam-recipe-details__banner_buttons .miam-recipe-details__top-button-wrapper .miam-recipe-details__mobile-header-buttons .miam-like-button .miam-like-button__icon:after{font-size:24px;line-height:24px}:root .miam-recipe-details .miam-recipe-details__container .miam-recipe-details__footer .miam-recipe-details__add-to-basket-cta img{display:none}:root .miam-recipe-details .miam-recipe-details__container .miam-recipe-details__footer .miam-recipe-details__add-to-basket-cta:before{font-family:icomoon!important;content:"";font-size:24px;line-height:24px;font-weight:400}:root .miam-product-card__container .miam-product-card__content .miam-product-card__selected-product .miam-product-card__badges{display:none}:root .miam-product-card__container .miam-product-card__content .miam-product-card__lower-action .miam-product-card__cta .miam-product-card__add-product{font-weight:400;align-items:center;display:inline-flex;flex-direction:row;gap:.25rem;justify-content:center;padding:unset;height:40px;width:40px;font-size:1.5rem}:root .miam-product-card__container .miam-product-card__content .miam-product-card__lower-action .miam-product-card__cta .miam-product-card__add-product img{display:none}:root .miam-product-card__container .miam-product-card__content .miam-product-card__lower-action .miam-product-card__cta .miam-product-card__add-product:after{font-family:icomoon!important;content:"";font-size:24px;line-height:24px}:root .miam-catalog-category .miam-catalog-category__header .miam-catalog-category__header__bottom .miam-catalog-category__link img{display:none}:root .miam-catalog-category .miam-catalog-category__header .miam-catalog-category__header__bottom .miam-catalog-category__link:after{font-family:icomoon!important;content:"";font-size:20px;line-height:20px}@media(min-width:1024px){:root .miam-catalog-category .miam-catalog-category__header .miam-catalog-category__header__bottom .miam-catalog-category__link:hover{text-decoration:unset}:root .miam-catalog-category .miam-catalog-category__header .miam-catalog-category__header__bottom .miam-catalog-category__link:hover span{text-decoration:underline}}:root .miam-catalog-toolbar .miam-catalog-toolbar__searchbar-container .miam-catalog-toolbar__searchbar{flex-direction:row-reverse;padding:unset;overflow:hidden;border-radius:4px}:root .miam-catalog-toolbar .miam-catalog-toolbar__searchbar-container .miam-catalog-toolbar__searchbar input{padding:8px;border:unset!important}:root .miam-catalog-toolbar .miam-catalog-toolbar__searchbar-container .miam-catalog-toolbar__searchbar .miam-ds-button{margin-right:unset;padding:8px;background-color:var(--miam-ds-color-primary);border-radius:unset}:root .miam-catalog-toolbar .miam-catalog-toolbar__searchbar-container .miam-catalog-toolbar__searchbar .miam-ds-button:hover{background-color:var(--miam-ds-color-primary-hover)}:root .miam-catalog-toolbar .miam-catalog-toolbar__searchbar-container .miam-catalog-toolbar__searchbar .miam-ds-button img{display:none}:root .miam-catalog-toolbar .miam-catalog-toolbar__searchbar-container .miam-catalog-toolbar__searchbar .miam-ds-button:after{content:"";font-family:icomoon!important;font-size:24px;line-height:24px;font-weight:400;color:var(--miam-ds-color-neutral-white)}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button{border:1px solid var(--miam-ds-color-border)}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button:hover{border:1px solid var(--miam-ds-color-primary)}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button:hover .miam-catalog-toolbar__controls__preferences-label,:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button:hover .miam-catalog-toolbar__controls__favorites-label{color:var(--miam-ds-color-primary)}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__preferences img{display:none}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__preferences:before{font-family:icomoon!important;content:"";font-size:24px;line-height:24px}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__favorites img{display:none}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__favorites:before{font-family:icomoon!important;content:"";font-size:24px;line-height:24px}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__preferences,:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__favorites,:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__personal{padding:8px;color:var(--miam-ds-color-neutral-black)}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__preferences:not(.ghost):not(.hidden),:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__favorites:not(.ghost):not(.hidden),:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__personal:not(.ghost):not(.hidden){border-radius:4px;background-color:#fff}:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__preferences:not(.ghost):not(.hidden):hover,:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__favorites:not(.ghost):not(.hidden):hover,:root .miam-catalog-toolbar .miam-catalog-toolbar__buttons-container .miam-ds-button.miam-catalog-toolbar__controls__personal:not(.ghost):not(.hidden):hover{color:var(--miam-ds-color-primary)}:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter img{display:none}:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter:after{font-family:icomoon!important;content:"";font-size:24px;line-height:24px}:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter,:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__preferences{border-radius:4px;border:1px solid var(--miam-ds-color-border);background-color:#fff;padding:8px;color:var(--miam-ds-color-neutral-black)}:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter:hover,:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__preferences:hover{border:1px solid var(--miam-ds-color-primary);color:var(--miam-ds-color-primary)}:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter:hover .miam-catalog-toolbar__controls__preferences-label,:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter:hover .miam-catalog-toolbar__controls__favorites-label,:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__preferences:hover .miam-catalog-toolbar__controls__preferences-label,:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__preferences:hover .miam-catalog-toolbar__controls__favorites-label{color:var(--miam-ds-color-primary)}:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__filter:not(.full) .miam-catalog-toolbar__controls__filter-badge,:root .miam-catalog-toolbar .miam-catalog-toolbar__controls__preferences:not(.full) .miam-catalog-toolbar__controls__filter-badge{right:-6px;top:-6px}:root .miam-recipe-catalog .miam-recipe-catalog__toolbar-container{background-color:transparent}:root .miam-recipe-catalog .miam-recipe-catalog__toolbar-container.sticking{background-color:#fff;transition:top .3s ease-out}:root .miam-recipe-catalog .miam-recipe-catalog__content__myMeal__button{background-color:var(--miam-ds-color-primary)}:root .miam-recipe-catalog .miam-recipe-catalog__content__myMeal__button img{margin:unset}:root ng-miam-replace-item .miam-replace-item__top-container .miam-replace-item__searchbar{flex-direction:row-reverse}:root ng-miam-replace-item .miam-replace-item__top-container .miam-replace-item__searchbar ng-miam-icon{display:none}:root ng-miam-replace-item .miam-replace-item__top-container .miam-replace-item__searchbar .miam-ds-loader{display:none}:root ng-miam-replace-item .miam-replace-item__top-container .miam-replace-item__searchbar:before{content:"";font-family:icomoon!important;font-size:24px;line-height:24px;font-weight:400;color:var(--miam-ds-color-neutral-black)}:root ng-miam-replace-item .miam-replace-item__product-list .miam-replace-item__card-upper-section .miam-replace-item__product-info .miam-ds-badge{display:none}')),document.head.appendChild(o)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}}();
2
+ var e=Object.defineProperty,t=(t,r,o)=>((t,r,o)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[r]=o)(t,"symbol"!=typeof r?r+"":r,o);import{e as r}from"./mealz-injector-environment.js";let o;let n=new class{constructor(e){t(this,"storeId"),window.mealz.supplier.setupWithToken(r.carrefour.token),window.mealz.setDefaultScrollElementGetter(()=>document.getElementsByTagName("html")[0]),this.getUserId(t=>{this.handleLogin(t).subscribe(()=>{console.debug("[Miam injector] User logged in Mealz!"),this.getCart((t,r)=>{console.debug("[Miam injector] Loaded storeID + cart --\x3e",t,r),window.mealz.pos.load(t),window.mealz.basketSync.definePushProductsToCart(this.pushProductsToBasket.bind(this)),window.mealz.basket.initialize(),window.mealz.hook.setHookCallback(this.hookCallback),this.sendCartToMealz(r),e()})})})}getUserId(e){e(ONECF.getUserContext().userId)}handleLogin(e){return console.debug("[Miam injector] Log user in Mealz...",e),window.mealz.user.loadWithExternalId(e)}getCart(e){console.debug("[Miam injector] Load Carrefour cart from API...");let t=new XMLHttpRequest;t.open("GET","https://www.carrefour.fr/api/cart"),t.setRequestHeader("x-requested-with","XMLHttpRequest"),t.onload=()=>{let r=JSON.parse(t.responseText),o=r.cart.facilityServiceId;if(!o)return e(null,[]);this.storeId=o;let n=r?.cart.items;if(!n||0===n.length)return e(o,[]);let i=[];n.forEach(e=>{e.products.forEach(e=>{let t=e?.product?.attributes?.ean;t&&t.length>0&&i.push({id:t,quantity:e.counter||1})})}),e(o,i)},t.send()}pushProductsToBasket(e){console.debug("[Miam injector] Push Mealz products to Carrefour",e),this.getCart((t,r)=>{let o=e.map(e=>{let o=r.find(t=>t.id==e.id),n=(o?o.quantity:0)+e.quantity;return{ean:e.id,counter:n,basketServiceId:t}});window.ONECF.addToCart(o)})}sendCartToMealz(e=null){console.debug("[Miam injector] Send Carrefour cart to Mealz"),e?window.mealz.basketSync.retailerBasketChanged(e):this.getCart((e,t)=>{window.mealz.basketSync.retailerBasketChanged(t)})}hookCallback(e,t){return e&&t}}(()=>{!function(){document.addEventListener("onAddToCart",e=>{n.sendCartToMealz()});const e=window.dataLayer.push;window.dataLayer.push=function(t){"event"===t[0]&&"remove_from_cart"===t[1]&&"remove_all_cart"===t[2].event_action&&n.sendCartToMealz(),e(t)}}(),i(),function(e=1){if(!location.href.includes("/recette"))return;const t=document.querySelector("carrefour-recipes");if(!t)return setTimeout(()=>i(e+1),1e3);console.debug(`[Miam injector] Recipes page found (${e} attempts), injecting catalog...`);const r=document.createElement("webc-miam-recipe-catalog");r.style="width: 100%;",t.parentNode.replaceChild(r,t)}(),null==o&&function(){const e=document.querySelector("html");let t=72;o=new MutationObserver(()=>{const e=document.querySelector("html"),r=+getComputedStyle(e).getPropertyValue("--header-full-height").replace("px","");if(t!==r)if(window.innerWidth<768){let r=+getComputedStyle(e).getPropertyValue("--header-height").replace("px","");r>t&&(r+=40),t=r,window.mealz.setStickyHeaderHeight(r)}else window.mealz.setStickyHeaderHeight(t),t=r}),o.observe(e,{attributes:!0,childList:!1,subtree:!1})}()});function i(e=1){if(!location.href.match(/carrefour\.fr\/s(\?.*)?$/)&&!location.href.match(/carrefour\.fr\/r\/.*/))return;const t=document.querySelector(".product-grid");if(!t||0===t.length)return setTimeout(()=>i(e+1),1e3);console.debug(`[Miam injector] Products list found in DOM (${e} attempts), injecting recipe cards...`),a(3),a(8),a(10),a(15)}function a(e){const t=document.querySelector(".product-grid"),r=document.createElement("li");r.classList.add("product-grid-item"),r.style=`order: ${e};`;for(let n=e;n<t.children.length;n++)t.children.item(n-1).style=`order: ${n+1};`;const o=document.createElement("webc-miam-recipe-card");o.productIds=[{id:t.children.item(e-1).querySelector("article").id},{id:t.children.item(e).querySelector("article").id}],o.style="height: 100%; width: 100%;",r.appendChild(o),t.insertBefore(r,t.children.item(e-1)),console.debug("[Miam injector] Injected recipe card at position --\x3e",e,o.productIds)}
3
+ //# sourceMappingURL=mealz-injector-carrefour.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mealz-injector-carrefour.js","sources":["../src/retailers/carrefour/main.js"],"sourcesContent":["import \"./style.scss\";\nimport { env } from \"../../environments/environment.js\";\n\nlet mutationObserver;\n\nexport class Mealz {\n storeId;\n\n constructor(callback) {\n window.mealz.supplier.setupWithToken(env.carrefour.token);\n window.mealz.setDefaultScrollElementGetter(() => document.getElementsByTagName('html')[0])\n\n this.getUserId(userId => {\n this.handleLogin(userId).subscribe(() => {\n console.debug(\"[Miam injector] User logged in Mealz!\");\n\n this.getCart((storeId, cart) => {\n console.debug(\"[Miam injector] Loaded storeID + cart -->\", storeId, cart);\n window.mealz.pos.load(storeId)\n\n window.mealz.basketSync.definePushProductsToCart(this.pushProductsToBasket.bind(this));\n window.mealz.basket.initialize();\n window.mealz.hook.setHookCallback(this.hookCallback);\n this.sendCartToMealz(cart);\n\n callback();\n });\n });\n })\n }\n\n getUserId(callback) {\n callback(ONECF.getUserContext().userId);\n }\n\n handleLogin(userId) {\n console.debug(\"[Miam injector] Log user in Mealz...\", userId);\n return window.mealz.user.loadWithExternalId(userId);\n }\n\n // handleLogout() {\n // window.mealz.user.reset()\n // }\n\n getCart(callback) {\n console.debug(\"[Miam injector] Load Carrefour cart from API...\");\n let url = `https://www.carrefour.fr/api/cart`;\n\n let req = new XMLHttpRequest();\n req.open(\"GET\", url);\n req.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n req.onload = () => {\n let response = JSON.parse(req.responseText)\n let storeId = response.cart.facilityServiceId;\n if (!storeId) {\n return callback(null, []);\n }\n this.storeId = storeId;\n\n let categories = response?.cart.items;\n if (!categories || categories.length === 0) {\n return callback(storeId, []);\n }\n\n let cart = [];\n categories.forEach(c => {\n c.products.forEach(p => {\n let id = p?.product?.attributes?.ean;\n if (id && id.length > 0) {\n cart.push({ id: id, quantity: p.counter || 1 });\n }\n });\n });\n\n callback(storeId, cart);\n }\n req.send();\n }\n\n // { id: string, quantity: number, additionalInfos?: any}\n pushProductsToBasket(mealzProducts) {\n console.debug(\"[Miam injector] Push Mealz products to Carrefour\", mealzProducts);\n\n this.getCart((storeId, cart) => {\n let data = mealzProducts.map(p => {\n let existingProduct = cart.find(item => item.id == p.id);\n let existingQty = existingProduct ? existingProduct.quantity : 0;\n let newQty = existingQty + p.quantity;\n return { ean: p.id, counter: newQty, basketServiceId: storeId };\n })\n window.ONECF.addToCart(data);\n });\n }\n\n sendCartToMealz(existingCart = null) {\n console.debug(\"[Miam injector] Send Carrefour cart to Mealz\");\n\n if (existingCart) {\n window.mealz.basketSync.retailerBasketChanged(existingCart);\n } else {\n this.getCart((_storeId, cart) => {\n window.mealz.basketSync.retailerBasketChanged(cart);\n })\n }\n }\n\n // sendPaymentNotificationToMealz(cart) {\n // window.mealz.basketSync.handlePayment(cart.price);\n // }\n\n hookCallback(isLogged, isPosValid) {\n if (!isPosValid) {\n // Navigate to 'Choose my Point of Sale' page\n }\n if (!isLogged) {\n // Navigate to login page\n }\n return isLogged && isPosValid;\n }\n}\n\nfunction initHeaderMutationObserver() {\n const mutationTarget = document.querySelector('html'); // element to watch\n const observedAtts = { attributes: true, childList: false, subtree: false };\n let lastHeaderHeight = 72;\n mutationObserver = new MutationObserver(() => {\n const htmlElement = document.querySelector('html');\n const newHeaderHeight = +getComputedStyle(htmlElement).getPropertyValue('--header-full-height').replace('px', '');\n if (lastHeaderHeight !== newHeaderHeight) {\n // Mobile\n if (window.innerWidth < 768) {\n let mobileHeaderHeight = +getComputedStyle(htmlElement).getPropertyValue('--header-height').replace('px', '')\n if (mobileHeaderHeight > lastHeaderHeight) mobileHeaderHeight += 40;\n lastHeaderHeight = mobileHeaderHeight;\n window.mealz.setStickyHeaderHeight(mobileHeaderHeight);\n } else { // Desktop\n window.mealz.setStickyHeaderHeight(lastHeaderHeight);\n lastHeaderHeight = newHeaderHeight;\n }\n }\n });\n mutationObserver.observe(mutationTarget, observedAtts);\n}\n\nlet mealz = new Mealz(() => {\n // Start injection only after Mealz is ready\n\n listenToCartChanges();\n injectRecipeCards();\n injectMealzSpace();\n\n // To avoid multiple listener on same element\n if (mutationObserver == null) initHeaderMutationObserver();\n});\n\nfunction listenToCartChanges() {\n // Add / remove products to / from Carrefour cart\n document.addEventListener(\"onAddToCart\", (e) => {\n mealz.sendCartToMealz();\n })\n\n // Click on \"Remove all\" button from cart drawer\n const oldPush = window.dataLayer.push;\n window.dataLayer.push = function (e) {\n if (e[0] === 'event' && e[1] === 'remove_from_cart' && e[2].event_action === 'remove_all_cart') {\n mealz.sendCartToMealz();\n }\n oldPush(e);\n }\n}\n\nfunction injectRecipeCards(attempt = 1) {\n if (!(location.href.match(/carrefour\\.fr\\/s(\\?.*)?$/) || location.href.match(/carrefour\\.fr\\/r\\/.*/))) {\n return;\n }\n\n const productsList = document.querySelector('.product-grid');\n if (!productsList || productsList.length === 0) {\n return setTimeout(() => injectRecipeCards(attempt + 1), 1000);\n }\n\n console.debug(`[Miam injector] Products list found in DOM (${attempt} attempts), injecting recipe cards...`);\n\n injectCardAtPosition(3);\n injectCardAtPosition(8);\n injectCardAtPosition(10);\n injectCardAtPosition(15);\n}\n\n// Position starts at 1 (elements in children array start at 0)\nfunction injectCardAtPosition(i) {\n const productsList = document.querySelector('.product-grid');\n const cardContainer = document.createElement('li');\n cardContainer.classList.add('product-grid-item');\n\n cardContainer.style = `order: ${i};`;\n for (let index = i ; index < productsList.children.length ; index++) {\n productsList.children.item(index-1).style = `order: ${index+1};`;\n }\n\n const recipeCard = document.createElement('webc-miam-recipe-card');\n recipeCard.productIds = [\n { id: productsList.children.item(i-1).querySelector('article').id },\n { id: productsList.children.item(i).querySelector('article').id }\n ]\n recipeCard.style = \"height: 100%; width: 100%;\";\n cardContainer.appendChild(recipeCard);\n productsList.insertBefore(cardContainer, productsList.children.item(i-1));\n\n console.debug('[Miam injector] Injected recipe card at position -->', i, recipeCard.productIds);\n}\n\n\nfunction injectMealzSpace(attempt = 1) {\n if (!location.href.includes(\"/recette\")) {\n return;\n }\n\n const page = document.querySelector('carrefour-recipes');\n if (!page) {\n return setTimeout(() => injectRecipeCards(attempt + 1), 1000);\n }\n\n console.debug(`[Miam injector] Recipes page found (${attempt} attempts), injecting catalog...`);\n\n const mealzSpace = document.createElement('webc-miam-recipe-catalog');\n mealzSpace.style = \"width: 100%;\";\n page.parentNode.replaceChild(mealzSpace, page);\n}\n"],"names":["mutationObserver","mealz","constructor","callback","__publicField","this","window","supplier","setupWithToken","env","carrefour","token","setDefaultScrollElementGetter","document","getElementsByTagName","getUserId","userId","handleLogin","subscribe","console","debug","getCart","storeId","cart","pos","load","basketSync","definePushProductsToCart","pushProductsToBasket","bind","basket","initialize","hook","setHookCallback","hookCallback","sendCartToMealz","ONECF","getUserContext","user","loadWithExternalId","req","XMLHttpRequest","open","setRequestHeader","onload","response","JSON","parse","responseText","facilityServiceId","categories","items","length","forEach","c","products","p","id","product","attributes","ean","push","quantity","counter","send","mealzProducts","data","map","existingProduct","find","item","newQty","basketServiceId","addToCart","existingCart","retailerBasketChanged","_storeId","isLogged","isPosValid","addEventListener","e","oldPush","dataLayer","event_action","listenToCartChanges","injectRecipeCards","attempt","location","href","includes","page","querySelector","setTimeout","mealzSpace","createElement","style","parentNode","replaceChild","injectMealzSpace","mutationTarget","lastHeaderHeight","MutationObserver","htmlElement","newHeaderHeight","getComputedStyle","getPropertyValue","replace","innerWidth","mobileHeaderHeight","setStickyHeaderHeight","observe","childList","subtree","initHeaderMutationObserver","match","productsList","injectCardAtPosition","i","cardContainer","classList","add","index","children","recipeCard","productIds","appendChild","insertBefore"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ !function(){"use strict";try{if("undefined"!=typeof document){var e=document.createElement("style");e.appendChild(document.createTextNode("body{overflow:hidden!important}@keyframes open{0%{right:-800px}to{right:0}}:root{--miam-color-primary: #8caa0a;--miam-color-secondary: #da291c;--oftenDeleted-color: #88cbf9;--miam-unavailable-color: #ec7981;--miam-removed-color: #faae31c2;--miam-font-size-medium: 16px;--miam-font-size-small: 14px;color:#3c3c37}:root .miam-hidden{display:none!important}:root .miamRecipeCardContainer{padding:0;border:none}:root .icon-container{background:none}:root .miam-counter-input .miam-counter-input__count{border:1px solid gray}:root .miam-counter-input .miam-counter-input__button{border-radius:20px}:root .miam-counter-input .miam-counter-input__button.miam-counter-input__button__plus{border:1px solid lightgray;background-color:#fff}:root .miam-counter-input .miam-counter-input__button.miam-counter-input__button__minus{border:1px solid #da291c}:root .miam-counter-input .miam-counter-input__button.miam-counter-input__button__minus .icon-container{margin-left:3px}:root .m-button-primary,:root .m-button-secondary,:root .m-button-grey,:root #continueButton,:root #removeAllButton,:root #confirmOrderButton{font-weight:700;font-size:14px;font-family:arial;line-height:16px;letter-spacing:.5px;padding:8px 18px;border-radius:16px;border:solid 1px;cursor:pointer}:root .m-button-fab-primary{font-family:arial}:root .m-button-grey{background-color:#fff;border-color:#818198;color:#818198}:root .m-button-grey:hover{color:#fff;background-color:#818198}:root .m-button-primary{border-color:var(--m-color-primary);background-color:var(--m-color-primary);color:#fff}:root .m-button-primary:hover{background-color:#fff;color:var(--m-color-primary)}:root .m-button-secondary{background-color:#fff;border-color:var(--m-color-secondary);color:var(--m-color-secondary)}:root .m-button-secondary:hover{background-color:#fbfbfb}:root .miam-recipe-card{width:auto;min-height:346px;max-height:346px;font-family:arial;border:none;border-radius:0}:root .miam-recipe-card .miam-recipe-card__header{display:block;height:30px;color:#fff;font-size:15px;font-family:arial;display:flex;justify-content:center;align-items:center;border-bottom:solid 1px white;background-color:#8caa0a;font-weight:700}:root .miam-recipe-card .miam-recipe-card__picture{height:160px}:root .miam-recipe-card .miam-recipe-card__picture img{border-radius:0}:root .miam-recipe-card .miam-recipe-card__picture .miam-recipe-card__picture__tag{font-size:12px}:root .miam-recipe-card .miam-recipe-card__picture .miam-recipe-card__picture__actions{display:none}:root .miam-recipe-card .miam-recipe-card__attributes{padding:8px 6px 0}:root .miam-recipe-card .miam-recipe-card__attributes .miam-recipe-card__attributes__title{font-size:15px;font-weight:700;line-height:1.2;margin:0 6px 6px 0}:root .miam-recipe-card .miam-recipe-card__attributes .miam-recipe-card__attributes__ingredients{font-size:13px}:root .miam-recipe-card .miam-recipe-card__attributes .miam-recipe-card__attributes__infos{justify-content:center;padding:6px 0}:root .miam-recipe-card .miam-recipe-card__attributes .miam-recipe-card__attributes__infos .miam-recipe-card__attributes__info{align-items:center}:root .miam-recipe-card .miam-recipe-card__attributes .miam-recipe-card__attributes__infos .miam-recipe-card__attributes__info .miam-recipe-card__info__label{font-size:11px}:root .miam-recipe-card .miam-recipe-card__control__left__col{display:none}:root .miam-recipe-card .miam-recipe-card__attributes__control .miam-recipe-card__control__right__col{flex-direction:row;justify-content:space-between;width:100%;padding:0 4px 4px}:root .miam-recipe-card .miam-recipe-card__attributes__control .miam-recipe-card__control__right__col .m-button-fab-primary{background-color:transparent}:root .miam-recipe-card .miam-recipe-card__attributes__control .miam-recipe-card__control__right__col .m-button-fab-primary .icon-container{width:45px!important;height:45px!important;border-radius:45px;background:url(https://static1.chronodrive.com/assets/2.59.0.7-SNAPSHOT/ctx/static/images/template/sprite_global.png?v=20180917) no-repeat;background-position:-321px -134px;background-color:#8caa0a;cursor:pointer}:root .miam-recipe-card .miam-recipe-card__attributes__control .miam-recipe-card__control__right__col .m-button-fab-primary .icon-container svg{display:none}:root .miam-recipe-card .miam-recipe-pricing__wrapper__price{font-size:20px;color:#da291c}:root .miam-recipe-card .miam-recipe-pricing__wrapper__price :first-child{font-size:25px}:root .miam-recipe-card .miam-recipe-pricing__wrapper__price :last-child{margin-left:-5px}:root .miam-recipe-card .miam-recipe-pricing__wrapper__subline{font-size:11px}:root .miam-modal{overflow:hidden;position:fixed;top:0;animation-name:open;animation-duration:.5s;animation-timing-function:cubic-bezier(.075,.82,.165,1);height:100%;max-width:875px;right:0;left:unset;background-color:#fff;border-radius:unset}@media print{:root .miam-modal{overflow:unset;position:unset;top:unset;z-index:unset;animation-name:unset;animation-duration:unset;animation-timing-function:unset;height:unset;max-width:unset;right:unset}}:root .miam-modal .miam-modal__title{font-size:20px}:root .miam-modal .miam-wrapper-preview{margin-right:8px;box-shadow:none;padding:0 20px}:root .miam-modal .miam-modal__container{overflow-y:auto;overflow-x:hidden;width:800px}:root .miam-modal .miam-modal__container .miam-modal__header{background-color:#fff}:root .miam-recipe-details{height:inherit}:root .miam-recipe-details .miam-recipe-details__top__container .miam-recipe-details__top__container__infos .miam-recipe-details__infos__description .miam-recipe-details__description__action{display:none}:root .miam-recipe-details .miam-recipe-details__top__container .miam-recipe-details__top__container__img{border-radius:12px}:root .miam-recipe-details .miam-recipe-details__top__container .miam-recipe-details__top__container__img .miam-recipe-details__img__actions{display:none}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__price .miam-recipe-pricing__wrapper .miam-recipe-pricing__wrapper__price{color:#da291c;font-size:20px}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__price .miam-recipe-pricing__wrapper .miam-recipe-pricing__wrapper__price :first-child{font-size:25px}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__price .miam-recipe-pricing__wrapper .miam-recipe-pricing__wrapper__price :last-child{margin-left:-5px}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__action .icon-container{width:45px!important;height:45px!important;border-radius:45px;background:url(https://static1.chronodrive.com/assets/2.59.0.7-SNAPSHOT/ctx/static/images/template/sprite_global.png?v=20180917) no-repeat;background-position:-321px -134px;background-color:#8caa0a;cursor:pointer}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__action .icon-container svg{display:none}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__action{display:flex;align-items:center;cursor:pointer;background-color:#da291c;color:#fff;font-weight:700;padding:0 8px 0 18px}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__action .icon-container{background-color:#da291c}:root .miam-recipe-details .miam-recipe-details__infos__price__wrapper .miam-recipe-details__infos__action:hover{color:#fff}:root .miam-recipe-details .miam-recipe-details__bottom__container .miam-recipe-details__bottom__container__ingredients .miam-recipe-details__ingredients__row{align-items:center}:root .miam-basket-preview-block .miam-basket-preview-lines{border:none}:root .miam-basket-preview-block .miam-basket-preview-lines .miam-basket-preview-disabled .miam-basket-preview-disabled__header{width:unset}:root .miam-basket-preview-block .miam-basket-preview-lines .miam-basket-preview-disabled .miam-basket-preview-disabled__entry{margin:0 0 5px 25px;padding:8px 10px;line-height:1.2;font-size:14px;display:flex;justify-content:space-between;align-items:center;background-color:#fff}:root .miam-basket-preview-block .miam-basket-preview-line{border:none;margin-bottom:16px}:root .miam-basket-preview-block .miam-basket-preview-line.expanded{box-shadow:0 2px 6px #00000029}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item{padding:16px 0}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__title{font-size:18px}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__picture img{border-radius:10px}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__right{flex-direction:row-reverse}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price{margin:0 45px;font-size:20px}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price :first-child{font-size:25px}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price :last-child{margin-left:-5px}:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__count .miam-basket-preview-line__item__count__for,:root .miam-basket-preview-block .miam-basket-preview-line.expanded .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__count .miam-basket-preview-line__item__count__people{display:none}:root .miam-basket-preview-block .miam-basket-preview-line .miam-basket-preview-line__item{padding:12px 0 15px}:root .miam-basket-preview-block .miam-basket-preview-line .miam-basket-preview-line__item .miam-basket-preview-line__item__left .miam-basket-preview-line__item__remove .icon-container{justify-content:center;align-items:center;padding:0}:root .miam-basket-preview-block .miam-basket-preview-line .miam-basket-preview-line__item .miam-basket-preview-line__item__left .miam-basket-preview-line__item__details .miam-basket-preview-line__item__actions .miam-basket-preview-line__item__inlineTag{display:flex;justify-content:center;align-items:center}:root .miam-basket-preview-block .miam-basket-preview-line .miam-basket-preview-line__item .miam-basket-preview-line__item__title{font-family:InterstateBoldCn;font-weight:400}:root .miam-basket-preview-block .miam-basket-preview-line .miam-basket-preview-line__item .miam-basket-preview-line__item__description{color:#acb0b9;margin:2px 0 10px}:root .miam-basket-preview-block .miam-basket-preview-line .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price{color:var(--m-color-secondary)}:root .miam-recap-page__main__container{margin:28px 80px}:root .miam-recap-page__main__container .miam-recipes-page__header{display:none}:root .miam-recap-page__main__container #recapPageLeftHeader{font-size:28px;margin-bottom:28px}:root .miam-recap-page__main__container .miam-recap-page__left__recipe__block{border:solid 1px #eaeaea;padding:20px 28px}:root .miam-recap-page__main__container .miam-recap-page__recipe__block__header{text-align:center;margin-bottom:20px;font-size:24px;line-height:1.6}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-block__header .miam-basket-preview-block__header__title .miam-basket-preview-block__header__text{font-family:InterstateBoldCn;font-size:20px;font-weight:400}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-block__header .miam-basket-preview-block__header__actions{display:none}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line{border:none;margin-bottom:16px}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item{padding:16px 0}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__title{font-size:18px}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__picture img{border-radius:10px}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__right{flex-direction:row-reverse}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price{margin:0 45px;font-size:20px}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price :first-child{font-size:25px}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__price :last-child{margin-left:-5px}:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__count .miam-basket-preview-line__item__count__for,:root .miam-recap-page__main__container .miam-basket-preview-block .miam-basket-preview-line.clickable .miam-basket-preview-line__item .miam-basket-preview-line__item__right .miam-basket-preview-line__item__count .miam-basket-preview-line__item__count__people{display:none}:root .miam-recap-page__main__container .miam-recap-page__sub__container{display:flex;width:100%}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__left{flex-grow:1}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right{margin-left:60px;min-width:200px}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right .miam-recap-page__right__card__header{font-family:InterstateBoldCn;font-size:20px;font-weight:400;color:var(--m-color-primary)}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right .miam-recap-page__right__card__divider{border:none;background-color:transparent;background-image:radial-gradient(circle,#9f9f9f 0px,transparent 1px);background-size:6px 4px;background-repeat:repeat-x;height:3px;margin:12px 0}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right .miam-recap-page__right__card__stats{font-size:15px;font-weight:700;margin-bottom:16px;margin-top:16px}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right .miam-recap__right__card__price{font-size:20px;display:flex;justify-content:space-between;color:var(--m-color-secondary);font-weight:700}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right .miam-recap__card__price__info{display:none}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right .miam-recap__card__comfirm_raw{margin-top:28px}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__sub__container__right #confirmOrderButton{border-color:var(--m-color-primary);background-color:var(--m-color-primary);color:#fff}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__left__button__raw{display:flex;justify-content:space-between;margin:35px 28px}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__left__button__raw #continueButton,:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__left__button__raw #removeAllButton{background-color:#fff;border-color:var(--m-color-light-slate);color:var(--m-color-light-slate)}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__left__button__raw #continueButton:hover{background-color:var(--m-color-primary);border-color:var(--m-color-primary);color:#fff}:root .miam-recap-page__main__container .miam-recap-page__sub__container .miam-recap-page__left__button__raw #removeAllButton:hover{background-color:var(--m-color-secondary);border-color:var(--m-color-secondary);color:#fff}:root .miam-recipe-tags__container{margin-top:0}:root .miam-recipe-tag-container{margin-bottom:8px}")),document.head.appendChild(e)}}catch(i){console.error("vite-plugin-css-injected-by-js",i)}}();
2
+ var e=Object.defineProperty,t=(t,r,i)=>((t,r,i)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[r]=i)(t,"symbol"!=typeof r?r+"":r,i);import{U as r,S as i,R as a,C as s,a as n}from"./mealz-injector-store-wrapper.js";class o{constructor(e,r,i=!1){t(this,"_cardWrapper"),t(this,"_firstChange",!0),t(this,"listMutationObserver"),this._cardWrapper=r,this.modifyHelperString(),this.initListMutationObserver(e),i&&this.injectCardsPlaceholders(e)}initListMutationObserver(e){this.listMutationObserver=new MutationObserver(this.onDomChangeCallback.bind(this)),this.listMutationObserver.observe(e,{attributes:!1,childList:!0,subtree:!0}),this.onDomChangeCallback(),this._firstChange=!1}endMutationObserver(){this.listMutationObserver.disconnect()}onDomChangeCallback(){const e=this.getListElements();this.needsUpdate(e)&&this.injectRecipes(e)}needsUpdate(e){return e?.length>=1}getListElements(){return Array.from(document.getElementsByClassName("miamRecipeCard"))}handleCachedRecipe(){localStorage.removeItem("_miam/cached-recipe");const e=sessionStorage.getItem("_miam/cachedRecipeUrl");if(null!=e&&e!=window.location.href)return sessionStorage.removeItem("_miam/cachedRecipeUrl"),sessionStorage.removeItem("_miam/cached-recipe"),null;const t=JSON.parse(sessionStorage.getItem("_miam/cached-recipe"));return this._firstChange&&t&&this._cardWrapper.shouldShowCachedRecipe()?(sessionStorage.removeItem("_miam/cached-recipe"),sessionStorage.removeItem("_miam/cachedRecipeUrl"),t):null}injectRecipes(e){e.forEach((t,r)=>{this.injectRecipe(e,r)})}buildCard(e,t){const r=this.getContext(e,t),i=r.forcedRecipeId,a=document.createElement("webc-miam-recipe-card");return i?a.recipeId=i:r?a.productIds=r.shelfIngredients?r.shelfIngredients.map(e=>({id:e})):r:a.randomModeEnable=!0,a.headerText=this._cardWrapper.cardHeaderText(),a.displayVariant=this._cardWrapper.recipeCardVariant(),a.contextId=r.contextId,a}injectRecipe(e,t){const r=this.buildCard(e,t);r&&(this.appendToDOM(e,t,r),r.addEventListener("hide",()=>{r.parentElement.style.display="none"}))}modifyHelperString(){const e=document.querySelector("webc-miam-recipe-helper");void 0!==this._cardWrapper.recipeRecapLocationString()&&(e.stringDetailLocation=this._cardWrapper.recipeRecapLocationString())}getContext(e,t){const r=JSON.parse(e[t].dataset.context);return r.contextId=e[t].dataset.contextId,r}isContextEmpty(e){return e?.shelfIngredients?.length<1&&e.currentIngredients?.length<1&&e.basketIngredients?.length<1&&e.length}appendToDOM(e,t,r){e[t].replaceWith(r)}injectCardsPlaceholders(e){const t=this._cardWrapper.cardsPositionsByScreenWidth(),r=Array.from(e.children);t.filter(e=>e>0).forEach(t=>{let i=document.createElement("div");i.classList.add("miamRecipeCardContainer"),this._cardWrapper.cardContainerCssClasses().forEach(e=>{i.classList.add(e)});let a=document.createElement("div");a.classList.add("miamRecipeCard"),i.appendChild(a);const s=this._cardWrapper.getProductsIds(r.slice(t-1,t+1));a.dataset.context=JSON.stringify({shelfIngredients:s}),a.dataset.contextId=t.toString(),e.insertBefore(i,r[t])})}}class c{constructor({template:e=null,toInjectBefore:t=null}={}){c.initCounterWrapperIfNeeded(window.mealz.basket.recipeCount()?.value,e,t),window.mealz.basket.recipeCount().subscribe(e=>c.refreshRecipesCounters(e))}static initCounterWrapperIfNeeded(e=0,t=null,r=null){let i=document.getElementById("miamMesRepas");if(!(i||t&&r))return;t&&r&&(i=t?.firstElementChild?t.firstElementChild:t,r.parentNode.insertBefore(t,r)),i.style.position="relative",i.setAttribute("id","miamMesRepasInit");const a=c.initCounter(e);i.appendChild(a)}static initCounter(e=0){const t=document.createElement("span");return 0==e&&t.classList.add("miam-hidden"),t.classList.add("miam-recipe-counter"),t.innerHTML=e,t}static refreshRecipesCounters(e=0){const t=document.getElementsByClassName("miam-recipe-counter");if(t&&0!==t.length)for(let r of t)r.innerHTML=e,0==e?r.classList.add("miam-hidden"):r.classList.remove("miam-hidden")}}class d{constructor(e,r,i=null){t(this,"_buttonList"),t(this,"_domFragment"),t(this,"_routeWrapper"),this._routeWrapper=e,this._domFragment=document.createRange().createContextualFragment(r),this._buttonList=i,this._initButtonListeners()}_initButtonListeners(){null!=this._buttonList&&this._buttonList.foreach(e=>{this._bindOrHideButton(e)})}_bindOrHideButton(e){const t=document.getElementById(e.id);t&&(this._routeWrapper.doesRouteExists(e.route)?(e.addEventListener("click",()=>{this._routeWrapper.navigate(e.route)},!1),this._isCounterParentElem(e)&&t.appendChild(c.initCounter(window.mealz.basket.recipeCount()?.value))):t.style.display="none")}_isCounterParentElem(e){return"mes-repas"===e.route}injectPageFragment(e){e&&e.replaceWith(this._domFragment)}}class m extends d{constructor(e,r,i,{buttonList:a=null,header:s=null,footer:n=null}=null){super(e,'\n<div class="miam-recap-page__main__container">\n <div class="miam-recipes-page__header">\n <div id="catalogButton" class="miam-recipes-page__tab">\n Recettes\n </div>\n <div id="recipeRecapButton" class="miam-recipes-page__tab miam-recipes-page__tab__curent">\n Mes repas\n </div>\n </div>\n <div class="miam-recap-page__sub__container">\n <div class="miam-recap-page__sub__container__left">\n <div class="miam-recap-page__left__header ">\n <h1 id=\'recapPageLeftHeader\'>\n </h1>\n </div>\n <div class="miam-recap-page__left__recipe__block">\n <p id="previewBlockHeader" class="miam-recap-page__recipe__block__header">\n Vous avez sélectionné <span id="nbOfMeals"></span> repas. <br />\n On y jette un dernier petit coup d\'oeil ?\n </p>\n <webc-miam-basket-preview-block></webc-miam-basket-preview-block>\n </div>\n <div class="miam-recap-page__left__button__raw">\n <div class="miam-recap-page__raw__continue__button">\n <span id="continueButton">\n Continuer mes achats\n </span>\n </div>\n <button class="miam-recap-page__raw__remove__all__button">\n <span id="removeAllButton">\n Retirer tous les repas\n </span>\n </button>\n </div>\n </div>\n <div class="miam-recap-page__sub__container__right">\n <div class="miam-recap-page__right__card">\n <h3 class="miam-recap-page__right__card__header">\n Récapitulatif des repas\n </h3>\n <hr class="miam-recap-page__right__card__divider">\n <p id="rightCardStats" class="miam-recap-page__right__card__stats">\n </p>\n <div class="miam-recap__card__comfirm_raw">\n <button id="confirmOrderButton">\n <span id="confirmOrderText">OK, voir mon panier</span>\n </button>\n </div>\n \x3c!-- <p id="rightCardFooter" class="miam-recap__right__card__footer"></p> --\x3e\n </div>\n </div>\n </div>\n',a),t(this,"_homeRoute"),t(this,"_basketRoute"),t(this,"_header"),t(this,"_footer"),this._header=s,this._footer=n,this._homeRoute=r,this._basketRoute=i,this._initBasketSubscription()}_initBasketSubscription(){window.mealz.basket.recipeCount().subscribe(e=>{this._refreshRecipeRecapFragmentView(e)})}_refreshRecipeRecapFragmentView(e){if(!this._domFragment?.firstElementChild?.getElementsByClassName("miam-recap-page__main__container"))return;const t=this._domFragment.getElementById("previewBlockHeader"),r=this._domFragment.getElementById("recapPageLeftHeader"),i=this._domFragment.getElementById("rightCardStats"),a=this._domFragment.getElementById("removeAllButton");e>0?this._setFillState(e,t,a,r,i):this._setEmptyState(t,a,r,i)}_setFillState(e,t,r,i,a){const s=this._domFragment.getElementById("nbOfMeals");t.classList.remove("miam-hidden"),r.classList.remove("hidden"),i.innerHTML="Avant de passer au panier...",s.innerHTML=e,a.innerHTML=`${e} repas`}_setEmptyState(e,t,r,i){e.classList.add("miam-hidden"),t.classList.add("miam-hidden"),r.innerHTML="Mes repas",i.innerHTML="0 repas, 0 produits"}_initButtonListeners(){super._initButtonListeners();const e=this._domFragment.getElementById("confirmOrderButton"),t=this._domFragment.getElementById("continueButton"),r=this._domFragment.getElementById("removeAllButton");e.addEventListener("click",()=>{this._routeWrapper.navigate(this._basketRoute).bind(this)},!1),t.addEventListener("click",()=>{this._routeWrapper.navigate(this._homeRoute).bind(this)},!1),r.addEventListener("click",()=>{window.mealz.basket.reset()},!1)}injectPageFragment(e){e&&(this._refreshRecipeRecapFragmentView(window.mealz.basket.recipeCount()),this._initButtonListeners(),this._header&&e.parentElement.insertBefore(this._header,e),this._footer&&e.parentElement.insertBefore(this._footer,e.nextSibling),e.replaceWith(this._domFragment))}}class l{constructor(e){t(this,"miamQuantity",0),t(this,"miamTargetQuantity",0),t(this,"miamBasketEntryIds",{}),t(this,"_retailerProducts",[]),t(this,"_basketWrapper"),this._basketWrapper=e}get retailerQuantity(){return this._retailerProducts.map(e=>e.quantity).reduce((e,t)=>parseInt(e)+parseInt(t),0)}clearRetailerProduct(){this._retailerProducts=[]}get miamBasketEntryIdsToStr(){let e="";return Object.keys(this.miamBasketEntryIds).forEach(t=>{const r=this.miamBasketEntryIds[t];e+=`${t}: ${r}, `}),e}get firstBasketEntryId(){return Object.keys(this.miamBasketEntryIds)[0]}removeFirstMiamEntry(e){const t=Object.keys(this.miamBasketEntryIds)[0];let r=this.miamBasketEntryIds[t];return r>e?(this.miamBasketEntryIds[t]=r-e,[t,e]):(delete this.miamBasketEntryIds[t],[t,r])}addOrUpdateRetailerProduct(e){if(0===this._retailerProducts.length||0===this.retailerQuantity)return void(this._retailerProducts=[e]);this._retailerProducts[0].quantity=e.quantity}createRetailerProducts(e,t){return e.selectedItem&&(this._retailerProducts=[this._basketWrapper.mapProductToEntry(e.selectedItem.attributes,t)]),this._retailerProducts}updateRetailerProducts(){const e=this.miamTargetQuantity-this.miamQuantity;if(0===e||0===this._retailerProducts.length)return[];let t=this._retailerProducts[0];return t.quantity+=e,t.quantity<=0&&this.clearRetailerProduct(),[t]}}class p{constructor(e,r,i,a=l){t(this,"_extIdToComparisonItem",{}),t(this,"_comparisonItemType"),t(this,"_basketWrapper"),this._comparisonItemType=a,this._basketWrapper=e,this.addEntryInMapFromRetailer(r),this._setFromMiam(i)}_fetchComparisonItem(e){let t=this._extIdToComparisonItem[e];return t||(t=new this._comparisonItemType(this._basketWrapper),this._extIdToComparisonItem[e]=t),t}cleanNullProducts(){Object.keys(this._extIdToComparisonItem).forEach(e=>{const t=this._extIdToComparisonItem[e];0===t.miamQuantity&&0===t.retailerQuantity&&delete this._extIdToComparisonItem[e]})}updateMapFromRetailer(e){this.addEntryInMapFromRetailer(e),this.deleteEntrieInMapFromRetailer(e)}addEntryInMapFromRetailer(e){e.forEach(e=>{this._fetchComparisonItem(e.id).addOrUpdateRetailerProduct(e)})}deleteEntrieInMapFromRetailer(e){Object.keys(this._extIdToComparisonItem).forEach(t=>{this.checkIfEntryIsToDeleteFromMap(t,e)})}checkIfEntryIsToDeleteFromMap(e,t){const r=this._extIdToComparisonItem[e];t.find(t=>t.id===e)||r.clearRetailerProduct()}resolveFromRetailer(){let e=[];return Object.keys(this._extIdToComparisonItem).forEach(t=>{const r=this._extIdToComparisonItem[t],i=r.miamQuantity-r.retailerQuantity;i>0&&(e=[...e,...this.getQuantityToRemove(r,i)],r.miamQuantity=r.retailerQuantity)}),e}getQuantityToRemove(e,t){const r=[];for(;t>0;){let i,a;[i,a]=e.removeFirstMiamEntry(t),null==i||null==a?t=0:(t-=a,r.push({id:i,qty:a}))}return r}setTargetFromMiam(e){this._updateTargetFromMiam(e),this._addTargetFromMiam(e)}resolveFromMiam(e){let t=[];return Object.keys(this._extIdToComparisonItem).forEach(r=>{t=[...t,...this.createOrUpdate(r,e)]}),t}createOrUpdate(e,t){const r=this._extIdToComparisonItem[e];let i;if(0===r.retailerQuantity&&0!==r.miamTargetQuantity){const e=t.find(e=>e.id==r.firstBasketEntryId);i=r.createRetailerProducts(e,r.miamTargetQuantity)}else i=r.updateRetailerProducts();return r.miamQuantity=r.miamTargetQuantity,i}_setFromMiam(e){e.forEach(e=>{const t=e.selectedItem&&e.selectedItem.attributes["ext-id"];if(!t)return;const r=this._fetchComparisonItem(t);r.miamQuantity+=e.attributes.quantity,r.miamBasketEntryIds[e.id]=e.attributes.quantity})}_updateTargetFromMiam(e){Object.keys(this._extIdToComparisonItem).forEach(t=>{const r=this._extIdToComparisonItem[t],i=e.filter(e=>e.selectedItem&&e.selectedItem.attributes["ext-id"]===t);if(i.length>0){const e=i.map(e=>e.attributes.quantity);r.miamTargetQuantity=e.reduce((e,t)=>parseInt(e)+parseInt(t),0),r.miamBasketEntryIds=i.reduce(function(e,t){return e[t.id]=parseInt(t.attributes.quantity),e},{})}else r.miamTargetQuantity=0,r.miamBasketEntryIds={}})}_addTargetFromMiam(e){e.forEach(e=>{const t=e.selectedItem&&e.selectedItem.attributes["ext-id"];if(!t)return;if(this._extIdToComparisonItem[t])return;const r=this._fetchComparisonItem(t);r.miamTargetQuantity+=e.attributes.quantity,r.miamBasketEntryIds[e.id]=e.attributes.quantity})}}class u{constructor(e,r,i,a=p){t(this,"_comparisonMap"),t(this,"_basketWrapper"),t(this,"isProcessingRetailerEvent"),this.isProcessingRetailerEvent=!0,this._basketWrapper=e,this._comparisonMap=new a(e,r,i);const s=this._comparisonMap.resolveFromRetailer();this.sendUpdateToMiam(s)}updateReceivedFromMiam(e){this._comparisonMap.setTargetFromMiam(e);const t=this._comparisonMap.resolveFromMiam(e);this._comparisonMap.cleanNullProducts(),this.sendUpdateToRetailer(t)}updateReceivedFromRetailer(e){this.isProcessingRetailerEvent=!0,this._comparisonMap.updateMapFromRetailer(e);const t=this._comparisonMap.resolveFromRetailer();this._comparisonMap.cleanNullProducts(),this.sendUpdateToMiam(t)}sendUpdateToMiam(e){0!==e.length?window.mealz.basket.removeEntries(e).subscribe(()=>{this.isProcessingRetailerEvent=!1}):this.isProcessingRetailerEvent=!1}sendUpdateToRetailer(e){0!==e.length&&this._basketWrapper.pushProductsToBasket(e.map(e=>this._basketWrapper.mapEntryToProduct(e)))}}class h{constructor(){}doesRouteExists(e){throw new Error("You must implement 'doesRouteExists' for this retailer")}navigate(e){throw new Error("You must implement 'navigate' for this retailer")}onRoutingEvent(e){}}class _{hasPayment(){throw new Error("You must implement 'hasPayment' for this retailer")}paymentTotal(){throw new Error("You must implement 'paymentTotal' for this retailer")}listenToRetailerBasket(e){throw new Error("You must implement 'lisentToRetailerBasket' for this retailer")}getBasketProducts(){throw new Error("You must implement 'getBasketProducts' for this retailer")}pushProductsToBasket(e){throw new Error("You must implement 'pushProductsToBasket' for this retailer")}mapEntryToProduct(e){throw new Error("You must implement 'mapEntryToProduct' for this retailer")}mapProductToEntry(e){throw new Error("You must implement 'mapProductToEntry' for this retailer")}}class g extends r{analyticsAllowed(){return!0}profilingAllowed(){return!0}isUserLogged(){return!!this.getUserId()}getUserId(){const e=document.cookie.match(/chronoUser="userId=([0-9]+)";/);return e&&e[1]}getUserPwd(){return localStorage.getItem("_miam/userPwd")}interceptUserPwd(){let e=window.XMLHttpRequest.prototype.send;window.XMLHttpRequest.prototype.send=function(t){return this.addEventListener("load",function(e){if(this.responseURL.match("login.connexion.login.loginform")){const e=t.match(/pwd_login=(.+)&/)[1];localStorage.setItem("_miam/userPwd",e),console.debug("[Miam] User pwd saved")}}),e.apply(this,arguments)}}static getAuthToken(e){const t=new g,r=t.getUserId(),i=t.getUserPwd();if(!r||!i)return console.debug("[Miam] Cannot get auth token as user is not logged in"),localStorage.removeItem("_miam/userPwd"),e(null);let a=new XMLHttpRequest;const s=`v2=true&login=${r}&password=${i}`;return a.addEventListener("load",function(t){e(JSON.parse(this.responseText).token)}),a.open("post","https://www.chronodrive.com/mobile/ws/login",!0),a.setRequestHeader("Content-type","application/x-www-form-urlencoded"),a.send(s)}}class C extends i{setPos(e){}getPosExtId(){const e=document.cookie.match(/chronoShop=\"shopId=([0-9]+)\";/);return e&&e[1]}invalidPosCallback(){throw new Error("You must implement 'invalidPosCallback' for this retailer")}isAvailable(){return window.mealz.user.device.matchMedia("(min-width: 1023px)").matches}availableOnShelf(){return!!document.getElementById("productListZone")}}class y{constructor(){}basketProductIds(){return[]}onHideCard(e){throw new Error("You must implement 'onHideCard' for this retailer")}recipeRecapLocationString(){}cardHeaderText(){return"Recette commandable"}detectCardsContainer(){return document.getElementById("productListZone")}cardsPositionsByScreenWidth(){return 2===window.prevItemPerLine?[3,7,12,17]:3===window.prevItemPerLine?[2,7,14,21]:4===window.prevItemPerLine?[3,10,19,25]:[4,7,15,23]}cardContainerCssClasses(){return["item","item--recipe"]}getProductsIds(e){return e.map(e=>{const t=e?.getElementsByClassName("item-actions")&&e.getElementsByClassName("item-actions")[0];return t?.getAttribute("data-cug")}).filter(e=>!!e)}}class f extends h{doesRouteExists(e){throw new Error("You must implement 'doesRouteExists' for this retailer")}navigate(e){window.location.href=e}onRoutingEvent(e){}}class E extends a{constructor(e=!0){super(e)}tagPlaceholders(){return[...document.getElementsByClassName("item")].forEach(e=>{if(0==e.getElementsByClassName("miam-recipe-tag-container").length){const t=document.createRange().createContextualFragment('<div class="miam-recipe-tag-container"><div class="miam-recipe-tag-placeholder"></div></div>');e.appendChild(t),e.getElementsByClassName("item-actions")[0].style="bottom: auto; top: 34px;"}}),document.getElementsByClassName("miam-recipe-tag-placeholder")}itemExtId(e){return e.parentElement.parentElement.getElementsByClassName("item-actions")[0].getAttribute("data-cug")}}const b={supplierId:"3",analyticsKey:"-",apiHost:"https://api-uat.miam.tech"};let v=window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open=function(e,t,r){if(t.match(b.apiHost)){let e=v.apply(this,arguments);return this.setRequestHeader("Content-Type","application/vnd.api+json"),e}return v.apply(this,arguments)};const w=new g,I=new C;if(new s(b.supplierId,w,I,b.analyticsKey),w.interceptUserPwd(),new class{constructor(e,r=null,i=u){t(this,"_firstMiamBasketReceived"),t(this,"_comparatorClass"),t(this,"_comparator"),t(this,"_basketWrapper"),this._basketWrapper=e,this._comparatorClass=i,this._firstMiamBasketReceived=!1,this.initBasketProcess(r)}initBasketProcess(e){this.handlePayment(()=>{this.handleBasketSync()}),e&&this.listenForConfirmation(e)}listenForConfirmation(e){const t=this;var r=t.checkAndSendEvent(void 0,e);new MutationObserver(function(){r=t.checkAndSendEvent(r,e)}).observe(document.body,{attributes:!1,childList:!0,subtree:!1})}checkAndSendEvent(e,t){if(location.href!==e&&(e=location.href,location.href.includes(t))){const e=this._basketWrapper.paymentTotal();window.mealz.paymentStarted(e)}return location.href}handlePayment(e){if(this._basketWrapper.hasPayment()){const t=this._basketWrapper.paymentTotal(),r=localStorage.getItem("_miam/basketToken");r?(localStorage.removeItem("_miam/basketToken"),this.sendMiamOrder(t,r),e()):this.confirmBasket(t,e)}else e()}sendMiamOrder(e,t){t&&window.mealz.supplier.notifyBasketUpdated(t,"PAID",e)}confirmBasket(e,t){window.mealz.basket.confirm(e).subscribe(r=>{if(r&&r.token&&r.totalPrice>0){const t=r.token;window.mealz.supplier.notifyBasketUpdated(t,"CONFIRMED"),this.sendMiamOrder(e,t)}t()})}listenToRetailer(e){this._basketWrapper.listenToRetailerBasket(e)}listenToMiam(e){window.mealz.basket.entries$.subscribe(t=>{this._firstMiamBasketReceived||0!==t.length?e(t):this._firstMiamBasketReceived=!0})}handleBasketSync(){this.listenToMiam(e=>{if(!this._comparator){const t=this._basketWrapper.getBasketProducts();return this._comparator=new this._comparatorClass(this._basketWrapper,t,e),void this.listenToRetailer(this.retailerBasketChangeCallBack.bind(this))}this._comparator.isProcessingRetailerEvent||this._comparator.updateReceivedFromMiam(e)})}retailerBasketChangeCallBack(e){this._comparator.updateReceivedFromRetailer(e)}}(new class extends _{hasPayment(){return!1}listenToRetailerBasket(e){return null}getBasketProducts(){const e=(document.getElementById("miniCartZone")||document.getElementById("cartDetailZone")).getElementsByClassName("item");let t=[];return Array.from(e).forEach(e=>{const r=e.getElementsByClassName("item-actions")[0],i=r.getElementsByClassName("qte_basket")[0];r&&i&&t.push({id:r.getAttribute("data-cug"),quantity:parseInt(i.textContent)})}),t}pushProductsToBasket(e){g.getAuthToken(t=>{if(t){const r=`v2=true&token=${t}&userId=${(new g).getUserId()}&shopId=${(new C).getPosExtId()}&cugs=${e.map(e=>`${e.id}:${e.quantity}:miam`).join(";")}`;let i=new XMLHttpRequest;return i.open("post","https://www.chronodrive.com/mobile/ws/SendCart",!0),i.addEventListener("load",this._refreshCartDisplay),i.setRequestHeader("Content-type","application/x-www-form-urlencoded"),i.send(r)}})}mapEntryToProduct(e){return e}mapProductToEntry(e,t){return{id:e["ext-id"],quantity:t}}_refreshCartDisplay(){let e=new XMLHttpRequest;e.open("get",location.href,!0),e.addEventListener("load",()=>{const e=document.createElement("div");e.innerHTML=this.responseText;const t=e.querySelector("a#m_panier"),r=document.body.querySelector("a#m_panier");r.parentNode.replaceChild(t,r);const i=e.querySelector("div#miniCartZone"),a=document.body.querySelector("div#miniCartZone");a.parentNode.replaceChild(i,a)}),e.send()}}),I.availableOnShelf()){const e=new y;new o(e.detectCardsContainer(),e,!0)}const k=document.getElementById("baccount").querySelector("ul"),R=document.createElement("li"),B=document.createElement("a");B.style="display: flex; align-items: center;",R.appendChild(B),B.innerHTML='<svg style="margin-left:-3px; margin-right:9px;" width="25" height="25" viewBox="0 0 49 49" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M24.5 17.7037C23.0662 17.7037 21.6646 18.1289 20.4725 18.9255C19.2804 19.722 18.3512 20.8542 17.8026 22.1788C17.2539 23.5034 17.1103 24.961 17.39 26.3672C17.6697 27.7734 18.3602 29.0651 19.374 30.0789C20.3878 31.0928 21.6795 31.7832 23.0857 32.0629C24.4919 32.3426 25.9495 32.1991 27.2741 31.6504C28.5988 31.1017 29.7309 30.1726 30.5275 28.9804C31.324 27.7883 31.7492 26.3867 31.7492 24.953C31.747 23.031 30.9826 21.1884 29.6235 19.8294C28.2645 18.4704 26.4219 17.7059 24.5 17.7037ZM24.5 31.296C23.2454 31.296 22.0191 30.924 20.9759 30.227C19.9328 29.5301 19.1198 28.5394 18.6397 27.3804C18.1596 26.2213 18.034 24.9459 18.2788 23.7155C18.5235 22.4851 19.1276 21.3548 20.0147 20.4677C20.9018 19.5806 22.0321 18.9765 23.2625 18.7318C24.4929 18.487 25.7683 18.6126 26.9274 19.0927C28.0864 19.5728 29.0771 20.3858 29.774 21.4289C30.471 22.4721 30.843 23.6984 30.843 24.953C30.8411 26.6347 30.1722 28.247 28.9831 29.4361C27.794 30.6252 26.1817 31.2941 24.5 31.296Z" fill="#FF7F7A" stroke="#FF7F7A"/>\n<path d="M37.6392 12.72H36.7331C35.652 12.7212 34.6155 13.1512 33.851 13.9157C33.0866 14.6801 32.6566 15.7166 32.6554 16.7977V17.7605C31.6983 16.6751 30.5341 15.7917 29.2312 15.1621C27.9283 14.5325 26.5127 14.1693 25.0676 14.0939C23.6225 14.0184 22.1768 14.2323 20.8154 14.7228C19.454 15.2134 18.2042 15.9708 17.1393 16.9506L16.897 13.1442C16.8884 13.025 16.833 12.9141 16.743 12.8355C16.653 12.7569 16.5355 12.7171 16.4163 12.7247C16.297 12.7323 16.1856 12.7867 16.1063 12.8761C16.027 12.9655 15.9861 13.0825 15.9927 13.2018L16.2804 17.7207C16.0717 17.8675 15.4785 18.0881 14.5323 18.1437V13.1731C14.5323 13.0529 14.4846 12.9377 14.3996 12.8527C14.3146 12.7677 14.1994 12.72 14.0792 12.72C13.959 12.72 13.8438 12.7677 13.7588 12.8527C13.6739 12.9377 13.6261 13.0529 13.6261 13.1731V18.1436C12.734 18.0903 12.1113 17.8871 11.878 17.7193L12.1657 13.2019C12.1723 13.0826 12.1315 12.9655 12.0521 12.8761C11.9728 12.7868 11.8614 12.7324 11.7421 12.7248C11.6229 12.7172 11.5055 12.757 11.4154 12.8355C11.3254 12.9141 11.27 13.0251 11.2614 13.1443L10.9114 18.6413C10.8803 19.1698 11.049 19.6907 11.384 20.1006C11.719 20.5105 12.1959 20.7795 12.72 20.8543V25.4062C12.5998 25.4062 12.4846 25.4539 12.3996 25.5389C12.3146 25.6238 12.2669 25.7391 12.2669 25.8592V34.4677C12.2669 34.9483 12.4578 35.4093 12.7977 35.7492C13.1376 36.0891 13.5986 36.28 14.0792 36.28C14.5599 36.28 15.0208 36.0891 15.3607 35.7492C15.7006 35.4093 15.8915 34.9483 15.8915 34.4677V31.5951C17.0459 33.0897 18.5694 34.2581 20.3123 34.9853C22.0552 35.7125 23.9573 35.9735 25.8316 35.7425C27.706 35.5116 29.4879 34.7967 31.0021 33.6681C32.5163 32.5396 33.7107 31.0363 34.4677 29.3062V34.4677C34.4677 34.9483 34.6586 35.4093 34.9985 35.7492C35.3384 36.0891 35.7993 36.28 36.28 36.28C36.7606 36.28 37.2216 36.0891 37.5615 35.7492C37.9014 35.4093 38.0923 34.9483 38.0923 34.4677V13.1731C38.0923 13.0529 38.0446 12.9377 37.9596 12.8527C37.8746 12.7677 37.7594 12.72 37.6392 12.72ZM14.9854 34.4677C14.9854 34.708 14.8899 34.9385 14.72 35.1084C14.55 35.2784 14.3195 35.3738 14.0792 35.3738C13.8389 35.3738 13.6084 35.2784 13.4385 35.1084C13.2685 34.9385 13.1731 34.708 13.1731 34.4677V26.3123H14.9854V34.4677ZM13.6261 25.4062V20.8754H14.5323V25.4062H13.6261ZM15.1405 19.9692H13.0179C12.8543 19.9692 12.6924 19.9359 12.5421 19.8712C12.3918 19.8066 12.2562 19.7119 12.1437 19.5931C12.0312 19.4743 11.9441 19.3338 11.8877 19.1802C11.8313 19.0266 11.8069 18.8631 11.8158 18.6997C12.3238 18.9087 13.0711 19.0631 14.0792 19.0631C14.9072 19.0631 15.7386 18.9473 16.3425 18.7019C16.3512 18.8651 16.3265 19.0283 16.27 19.1817C16.2135 19.3351 16.1264 19.4753 16.0139 19.5939C15.9014 19.7125 15.766 19.807 15.6158 19.8715C15.4657 19.936 15.3039 19.9693 15.1405 19.9692ZM31.2554 32.2826C30.1592 33.2928 28.8505 34.0443 27.4256 34.4818C26.0006 34.9193 24.4956 35.0316 23.0215 34.8105C21.5474 34.5894 20.1416 34.0405 18.9077 33.2043C17.6737 32.368 16.6431 31.2657 15.8915 29.9784V25.8592C15.8915 25.7391 15.8438 25.6238 15.7588 25.5389C15.6738 25.4539 15.5586 25.4062 15.4384 25.4062V20.8543C15.9629 20.7795 16.4401 20.5101 16.7751 20.0997C17.1101 19.6893 17.2786 19.168 17.2469 18.6391L17.2157 18.1497C18.2277 17.0659 19.4689 16.2216 20.8486 15.6783C22.2283 15.1351 23.7119 14.9065 25.1912 15.0094C26.6705 15.1122 28.1082 15.5439 29.3995 16.2729C30.6907 17.0019 31.8031 18.0099 32.6554 19.2233V25.8592C32.6554 25.9794 32.7031 26.0946 32.7881 26.1796C32.873 26.2646 32.9883 26.3123 33.1084 26.3123H34.3753C34.0623 28.605 32.9589 30.7166 31.2554 32.2826ZM37.1861 34.4677C37.1861 34.708 37.0907 34.9385 36.9207 35.1084C36.7508 35.2784 36.5203 35.3738 36.28 35.3738C36.0397 35.3738 35.8092 35.2784 35.6392 35.1084C35.4693 34.9385 35.3738 34.708 35.3738 34.4677V26.3123H37.1861V34.4677ZM37.1861 25.4062H33.5615V16.7977C33.5625 15.9568 33.8969 15.1507 34.4915 14.5561C35.0861 13.9615 35.8922 13.6271 36.7331 13.6262H37.1861V25.4062Z" fill="#007E92" stroke="#007E92" stroke-width="0.5"/>\n<rect x="1.25" y="1.25" width="46.5" height="46.5" rx="23.25" stroke="#007E92" stroke-width="1.5"/>\n</svg> Mes repas',k.insertBefore(R,k.children[2]),R.addEventListener("click",function(){const e=document.getElementById("overlayH"),t=document.createEvent("Events");t.initEvent("click",!0,!1),e.dispatchEvent(t);const r=document.getElementById("content");r.innerHTML="<div></div>";new m(new f,window.location.href,"/cartdetail",{}).injectPageFragment(r.firstChild)}),window.location.href.includes("/cartdetail")&&new n(new E);
3
+ //# sourceMappingURL=mealz-injector-chronodrive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mealz-injector-chronodrive.js","sources":["../src/core/common/recipe-injector.js","../src/core/common/recipe-counter.js","../src/core/common/pages/generic-page.js","../src/core/common/pages/recap-page.js","../src/core/common/basket/basket-handling/comparison-item.js","../src/core/common/basket/basket-handling/comparison-map.js","../src/core/common/basket/basket-handling/baskets-comparator.js","../src/core/wrappers/routing-wrapper.js","../src/core/wrappers/basket-wrapper.js","../src/retailers/chronodrive/wrappers/chronodrive-user-wrapper.js","../src/retailers/chronodrive/wrappers/chronodrive-store-wrapper.js","../src/retailers/chronodrive/wrappers/chronodrive-card-injector-wrapper.js","../src/retailers/chronodrive/wrappers/chronodrive-routing-wrapper.js","../src/retailers/chronodrive/wrappers/chronodrive-recipe-tag-wrapper.js","../src/retailers/chronodrive/environment.js","../src/retailers/chronodrive/main.js","../src/core/common/basket/basket-handler.js","../src/retailers/chronodrive/wrappers/chronodrive-basket-wrapper.js"],"sourcesContent":["export class RecipeInjector {\n _cardWrapper;\n _firstChange = true;\n listMutationObserver;\n\n /**\n * RecipeInjector is design to be a singleton\n * @param {HTMLElement} targetContainer target container\n * @param {CardInjectorWrapper} cardWrapper\n */\n constructor(container, cardWrapper, autoinject = false) {\n this._cardWrapper = cardWrapper;\n this.modifyHelperString();\n this.initListMutationObserver(container);\n\n // Case where the webcomponent is not inserted in the supplier's code\n // => We arbitrary decide where to inject the recipe cards\n if (autoinject) {\n this.injectCardsPlaceholders(container);\n }\n }\n\n /**\n * Init mutation Observer that will watch change on\n * targetContainer and call onDomChangeCallback method\n * each time change is detected and one time at init\n * @param {HTMLElement} targetContainer target container\n */\n initListMutationObserver(targetContainer) {\n const observedAtts = { attributes: false, childList: true, subtree: true };\n this.listMutationObserver = new MutationObserver(\n this.onDomChangeCallback.bind(this)\n );\n this.listMutationObserver.observe(targetContainer, observedAtts);\n this.onDomChangeCallback();\n this._firstChange = false;\n // console.debug('[Miam] dom lister init', this.listMutationObserver);\n }\n\n endMutationObserver() {\n this.listMutationObserver.disconnect();\n }\n\n /**\n * Action to do on dom changes\n */\n onDomChangeCallback() {\n const elementsDOM = this.getListElements();\n if (!this.needsUpdate(elementsDOM)) {\n return;\n }\n // console.debug('[Miam] dom change detected',elementsDOM);\n this.injectRecipes(elementsDOM);\n }\n\n /**\n * @param {DomElement} elementsDOM\n * @returns true if there is still a placeholder In DOM\n */\n needsUpdate(elementsDOM) {\n return elementsDOM?.length >= 1\n }\n\n /**\n * @returns placeholder DomElements list use to inject webcCard\n */\n getListElements() {\n return Array.from(document.getElementsByClassName(\"miamRecipeCard\"));\n }\n\n /**\n * if there is a recipe in local storage\n * and if we can inject recipe in the current page open\n * a drawer with the stored recipe\n * and clear storage\n * @returns cachedRecipe or null\n */\n handleCachedRecipe() {\n //retro compatibility\n localStorage.removeItem(\"_miam/cached-recipe\");\n\n const cachedRecipeUrl = sessionStorage.getItem('_miam/cachedRecipeUrl');\n\n // remove cached recipe if user has navigate\n // coursesu connexion page does not inject Miam so it is not considered a navigation\n if(cachedRecipeUrl != null && cachedRecipeUrl != window.location.href ){\n sessionStorage.removeItem('_miam/cachedRecipeUrl');\n sessionStorage.removeItem(\"_miam/cached-recipe\");\n return null;\n }\n\n const cachedRecipe = JSON.parse(\n sessionStorage.getItem(\"_miam/cached-recipe\")\n );\n\n // On DOM change without reloading\n if (!this._firstChange || !cachedRecipe || ! this._cardWrapper.shouldShowCachedRecipe() ) {\n return null;\n }\n\n // Show drawer if it's first change (page has reload) and there is a cachedRecipe\n // window.mealz?.recipes.display(cachedRecipe.id);\n sessionStorage.removeItem(\"_miam/cached-recipe\");\n sessionStorage.removeItem('_miam/cachedRecipeUrl')\n return cachedRecipe;\n }\n /**\n * browse elementsDOM, get context and create webcCard for each element\n * and then inject it into DOM\n * @param {HTMLElement} elementsDOM to browse\n */\n injectRecipes(elementsDOM) {\n elementsDOM.forEach((_, index) => {\n this.injectRecipe(elementsDOM, index);\n });\n }\n\n /**\n * @param {Array<DomElement>} elementsDOM\n * @param {number} index\n * @returns return a form id card if threre is an id pass in placeholder dataset\n * otherwise return a display card if context is empty\n * otherwise return a standard webc card\n */\n buildCard(elementsDOM, index) {\n const context = this.getContext(elementsDOM, index);\n const forcedRecipeId = context.forcedRecipeId;\n const webcCard = document.createElement(\"webc-miam-recipe-card\");\n if (forcedRecipeId) {\n webcCard.recipeId = forcedRecipeId;\n } else {\n context\n ? (webcCard.productIds = context.shelfIngredients ? context.shelfIngredients.map(i => ({ id: i })) : context)\n : (webcCard.randomModeEnable = true);\n }\n webcCard.headerText = this._cardWrapper.cardHeaderText();\n webcCard.displayVariant = this._cardWrapper.recipeCardVariant();\n webcCard.contextId = context.contextId;\n return webcCard;\n }\n\n /**\n * @param {Array<DomElement>} elementsDOM\n * @param {number} index\n */\n injectRecipe(elementsDOM, index) {\n const webcCard = this.buildCard(elementsDOM, index);\n if (webcCard) {\n this.appendToDOM(elementsDOM, index, webcCard);\n webcCard.addEventListener(\"hide\", () => {\n // console.debug('[Miam] have hidden cards');\n webcCard.parentElement.style.display = \"none\";\n });\n }\n }\n\n /**\n * Update card helper message\n */\n modifyHelperString() {\n const helper = document.querySelector('webc-miam-recipe-helper');\n if (this._cardWrapper.recipeRecapLocationString() !== undefined) {\n helper.stringDetailLocation = this._cardWrapper.recipeRecapLocationString();\n }\n }\n\n /**\n * get data-context attribute on card placeholder\n * and return it as an object\n * @param {HTMLElement} elementsDOM list of placeholder div\n * @param {number} index of the current DOMelement\n * @returns context [{ id:ext_id_1 }, { id:ext_id_2 }, ...]\n */\n getContext(elementsDOM, index) {\n const context = JSON.parse(elementsDOM[index].dataset.context);\n context.contextId = elementsDOM[index].dataset.contextId;\n // If context is in previous format, map it to current format, else keep it as the new format\n return context;\n }\n\n /**\n * @param {Object} context [{ id:ext_id_1 }, { id:ext_id_2 }, ...]\n * @returns true is context attributes are empty of if context == null\n */\n isContextEmpty(context) {\n return (\n context?.shelfIngredients?.length < 1 &&\n context.currentIngredients?.length < 1 &&\n context.basketIngredients?.length < 1 &&\n context.length\n );\n }\n\n /**\n * inject our web component into DOM\n * @param {HTMLElement} elementsDOM list of placeholder div\n * @param {number} index of the current DOMelement\n * @param {HTMLElement} webcCard element <webc-miam-recipe-card></webc-miam-recipe-card> to inject\n */\n appendToDOM(elementsDOM, index, webcCard) {\n elementsDOM[index].replaceWith(webcCard);\n }\n\n injectCardsPlaceholders(container) {\n const positions = this._cardWrapper.cardsPositionsByScreenWidth();\n const elements = Array.from(container.children);\n // console.debug('[Miam] Inject recipe cards placeholders @ positions:', positions);\n\n // Exclude injection of cards at the beginning of the array\n positions.filter(pos => pos > 0).forEach(position => {\n let cardContainer = document.createElement('div');\n cardContainer.classList.add(\"miamRecipeCardContainer\");\n this._cardWrapper.cardContainerCssClasses().forEach(cssClass => {\n cardContainer.classList.add(cssClass);\n });\n\n let cardPlaceholder = document.createElement('div');\n cardPlaceholder.classList.add(\"miamRecipeCard\");\n cardContainer.appendChild(cardPlaceholder);\n\n // Add context based on elements right before and after the injected placeholder\n const itemsIds = this._cardWrapper.getProductsIds(elements.slice(position - 1, position + 1));\n // console.debug('[Miam] Set context with items ids:', itemsIds);\n cardPlaceholder.dataset.context = JSON.stringify({ shelfIngredients: itemsIds });\n cardPlaceholder.dataset.contextId = position.toString();\n\n container.insertBefore(cardContainer, elements[position]);\n })\n }\n}\n","\n/**\n * There is three way to use Miam's recipe counter \n * \n * 1 => Classic mode : threre is already a div with the id `miamMesRepas` in DOM \n * You just need to call an empty constructor then \n * example :\n * new RecipeCounter();\n * \n * 2 => Custom mode : We have to inject a wrapper ourself in DOM for our counter \n * We need a DOM element whitch 'll be the wrapper and second element already in DOM that 'll be use as a target.\n * Our warpper 'll inject juste before target\n * example : \n * const template = document.createElement('div');\n * const injectBefore = document.getElementById('coraToolBar')\n * new RecipeCounter({template, injectBefore});\n * \n * 3 => Manual mode : \n * You can transphorm anything into a counter wrapper \n * example :\n * const ourWarpper = getElementsByName('button')[0];\n * ourWrapper.appendChild(RecipeCounter.initCounter(number))\n * \n * Or inject a custom warpper directly \n * example :\n * const template = document.createElement('div');\n * const injectBefore = document.getElementById('coraToolBar')\n * RecipeCounter.initCounterWrapperIfNeeded(number, template, injectBefore);\n * \n * Note that differences between manual mode, classique and custom is that you\n * have to initiate yourself subscription on Miam's basket stats \n * \n * You can also use modes together \n */\nexport class RecipeCounter {\n\n /**\n * Have to be a singleton\n * if not there 'll have severale subscription on miam's basket stats\n * @param {DOMelement} template to insert in DOM optional \n * @param {DOMelement} toInjectBefore target in DOM optional \n * template and toInjectBefore need eachother and have to be both pass as argument or not at all\n */\n constructor({template = null, toInjectBefore= null} = {} ) {\n RecipeCounter.initCounterWrapperIfNeeded(window.mealz.basket.recipeCount()?.value, template, toInjectBefore);\n window.mealz.basket.recipeCount().subscribe((recipeCount) => RecipeCounter.refreshRecipesCounters(recipeCount));\n }\n\n /**\n * Find first Element with id `miamMesRepas` inject a counter in clasique mode\n * In custom mode inject template beafore the target and add a counter inside\n * @param {number} recipeCount number use to initate counter \n * @param {DOMelement} template to insert in DOM optional \n * @param {DOMelement} toInjectBefore target in DOM optional \n * template and toInjectBefore need eachother and have to be both pass as argument or not at all\n */\n static initCounterWrapperIfNeeded (recipeCount = 0, template = null, toInjectBefore = null) {\n let mesRepas = document.getElementById(\"miamMesRepas\");\n\n if (!mesRepas && !(template && toInjectBefore)) return;\n\n if(template && toInjectBefore){\n // in case of fragment element \n mesRepas = template?.firstElementChild ? template.firstElementChild : template ; \n toInjectBefore.parentNode.insertBefore(template, toInjectBefore);\n }\n\n mesRepas.style.position = 'relative';\n //to avoid init two times same wrapper\n mesRepas.setAttribute('id', 'miamMesRepasInit'); \n const newCounter = RecipeCounter.initCounter(recipeCount);\n mesRepas.appendChild(newCounter);\n }\n\n /**\n * init a new counter element \n * if recipeCounte is 0 will hide counter\n * @param {number} recipesCount number insert in counter\n * @returns a DOM elenemt\n */\n static initCounter(recipesCount = 0){\n\n const newCounter = document.createElement('span');\n\n if (recipesCount == 0) newCounter.classList.add('miam-hidden');\n\n newCounter.classList.add('miam-recipe-counter');\n newCounter.innerHTML = recipesCount;\n\n return newCounter;\n }\n\n \n /**\n * this function update all recipes's counter\n * @param {number} recipesCount number insert in counter\n * hide them if recipesCount is 0\n * show them if above\n */\n static refreshRecipesCounters(recipesCount = 0) {\n \n const counters = document.getElementsByClassName('miam-recipe-counter');\n if (!counters || counters.length === 0) return;\n \n for (let counter of counters){\n counter.innerHTML = recipesCount;\n recipesCount == 0 ? counter.classList.add('miam-hidden') : counter.classList.remove('miam-hidden')\n }\n }\n}\n","import { RecipeCounter } from \"@core\";\n\nexport class GenericPage {\n _buttonList;\n _domFragment;\n _routeWrapper;\n\n /**\n *\n * @param {string} template html as string\n * @param {Array<{id: string, route: string}>} buttonList list of all existing miam page for retailer (optional)\n */\n constructor(routeWrapper, template, buttonList = null) {\n this._routeWrapper = routeWrapper;\n this._domFragment = document\n .createRange()\n .createContextualFragment(template);\n this._buttonList = buttonList;\n this._initButtonListeners();\n }\n\n /**\n * Add listener to buttons and call backs\n * we can not use onclik in template beacause it's a literal string\n * and function's name'll change after compilation.\n * Pass fonction inside \"${ }\" will pass value and not reference of the funtion\n * for this reason it will not work either\n */\n _initButtonListeners() {\n if (this._buttonList == null) return;\n this._buttonList.foreach((button) => {\n this._bindOrHideButton(button);\n });\n }\n\n /**\n * init button listener , add a recipe counter if needeed, and hide\n * it if route is not already avalaible on hosting retailer\n * @param {{id: string, route: string}} button current button info\n */\n _bindOrHideButton(button) {\n const domButton = document.getElementById(button.id);\n if (!domButton) return;\n if (this._routeWrapper.doesRouteExists(button.route)) {\n button.addEventListener(\n \"click\",\n () => {\n this._routeWrapper.navigate(button.route);\n },\n false\n );\n if (this._isCounterParentElem(button)) {\n domButton.appendChild(\n RecipeCounter.initCounter(window.mealz.basket.recipeCount()?.value)\n );\n }\n } else {\n domButton.style.display = \"none\";\n }\n }\n\n /**\n * @param {{id: string, route: string}} button\n * @returns true is button have to hold a recipe counter\n */\n _isCounterParentElem(button) {\n return button.route === \"mes-repas\";\n }\n\n /**\n * @param {DomElement} placeholder of the container to replace\n */\n injectPageFragment(placeholderClass) {\n if (placeholderClass) {\n placeholderClass.replaceWith(this._domFragment);\n }\n }\n}\n","import { GenericPage } from \"./generic-page\";\n\n\n/**\n * This is a link to the very version of old order-history, which can be seen only on CoursesU\n * They currently want us to maintain it only because we don't have an url pointing to the order-history directly and apparently CoursesU links\n * to the recap page when sending confirmation mails for orders which contain recipes\n * Until they can't link to the new order history they want us to maintain the recap page\n */\n\nconst PAGE_TEMPLATE = `\n<div class=\"miam-recap-page__main__container\">\n <div class=\"miam-recipes-page__header\">\n <div id=\"catalogButton\" class=\"miam-recipes-page__tab\">\n Recettes\n </div>\n <div id=\"recipeRecapButton\" class=\"miam-recipes-page__tab miam-recipes-page__tab__curent\">\n Mes repas\n </div>\n </div>\n <div class=\"miam-recap-page__sub__container\">\n <div class=\"miam-recap-page__sub__container__left\">\n <div class=\"miam-recap-page__left__header \">\n <h1 id='recapPageLeftHeader'>\n </h1>\n </div>\n <div class=\"miam-recap-page__left__recipe__block\">\n <p id=\"previewBlockHeader\" class=\"miam-recap-page__recipe__block__header\">\n Vous avez sélectionné <span id=\"nbOfMeals\"></span> repas. <br />\n On y jette un dernier petit coup d'oeil ?\n </p>\n <webc-miam-basket-preview-block></webc-miam-basket-preview-block>\n </div>\n <div class=\"miam-recap-page__left__button__raw\">\n <div class=\"miam-recap-page__raw__continue__button\">\n <span id=\"continueButton\">\n Continuer mes achats\n </span>\n </div>\n <button class=\"miam-recap-page__raw__remove__all__button\">\n <span id=\"removeAllButton\">\n Retirer tous les repas\n </span>\n </button>\n </div>\n </div>\n <div class=\"miam-recap-page__sub__container__right\">\n <div class=\"miam-recap-page__right__card\">\n <h3 class=\"miam-recap-page__right__card__header\">\n Récapitulatif des repas\n </h3>\n <hr class=\"miam-recap-page__right__card__divider\">\n <p id=\"rightCardStats\" class=\"miam-recap-page__right__card__stats\">\n </p>\n <div class=\"miam-recap__card__comfirm_raw\">\n <button id=\"confirmOrderButton\">\n <span id=\"confirmOrderText\">OK, voir mon panier</span>\n </button>\n </div>\n <!-- <p id=\"rightCardFooter\" class=\"miam-recap__right__card__footer\"></p> -->\n </div>\n </div>\n </div>\n`;\n\nexport class RecapPage extends GenericPage {\n _homeRoute;\n _basketRoute;\n _header;\n _footer;\n\n /**\n * @param {string} homeRoute route to navigate on click on continue shopping\n * @param {string} basketRoute route to navigate on click on go to basket\n * @param {Array<{id: string, route: string}} buttonList list of available miam button on retailer\n */\n constructor(\n routeWrapper,\n homeRoute,\n basketRoute,\n { buttonList = null, header = null, footer = null } = null\n ) {\n super(routeWrapper, PAGE_TEMPLATE, buttonList);\n this._header = header;\n this._footer = footer;\n this._homeRoute = homeRoute;\n this._basketRoute = basketRoute;\n this._initBasketSubscription();\n }\n\n /**\n * Each time miam basket change update reicpe page\n */\n _initBasketSubscription() {\n window.mealz.basket.recipeCount().subscribe((recipeCount) => {\n this._refreshRecipeRecapFragmentView(recipeCount);\n });\n }\n\n /**\n * Call each time recipeCount changed and on load\n * @param {recipesCount, entriesCount, totalPrice } recipeCount\n */\n _refreshRecipeRecapFragmentView(recipeCount) {\n if (\n !this._domFragment?.firstElementChild?.getElementsByClassName(\n \"miam-recap-page__main__container\"\n )\n )\n return;\n const previewBlockHeader =\n this._domFragment.getElementById(\"previewBlockHeader\");\n const leftHeader = this._domFragment.getElementById(\"recapPageLeftHeader\");\n const rightCardStats = this._domFragment.getElementById(\"rightCardStats\");\n const removeAllButton = this._domFragment.getElementById(\"removeAllButton\");\n\n if (recipeCount > 0) {\n this._setFillState(\n recipeCount,\n previewBlockHeader,\n removeAllButton,\n leftHeader,\n rightCardStats\n );\n } else {\n this._setEmptyState(\n previewBlockHeader,\n removeAllButton,\n leftHeader,\n rightCardStats\n );\n }\n }\n\n /**\n * Call if there is at least one recipe in basket\n * @param {{recipesCount, entriesCount, totalPrice }} recipeCount\n * @param {DomElement} previewBlockHeader\n * @param {DomElement} removeAllButton\n * @param {DomElement} leftHeader\n * @param {DomElement} rightCardStats\n */\n _setFillState(\n recipeCount,\n previewBlockHeader,\n removeAllButton,\n leftHeader,\n rightCardStats\n ) {\n const nbOfMeals = this._domFragment.getElementById(\"nbOfMeals\");\n\n previewBlockHeader.classList.remove(\"miam-hidden\");\n removeAllButton.classList.remove(\"hidden\");\n\n leftHeader.innerHTML = \"Avant de passer au panier...\";\n nbOfMeals.innerHTML = recipeCount;\n rightCardStats.innerHTML = `${recipeCount} repas`;\n }\n\n /**\n * Call if there is no recipe in basket\n * @param {DomElement} previewBlockHeader\n * @param {DomElement} removeAllButton\n * @param {DomElement} leftHeader\n * @param {DomElement} rightCardStats\n */\n _setEmptyState(\n previewBlockHeader,\n removeAllButton,\n leftHeader,\n rightCardStats\n ) {\n previewBlockHeader.classList.add(\"miam-hidden\");\n removeAllButton.classList.add(\"miam-hidden\");\n leftHeader.innerHTML = \"Mes repas\";\n rightCardStats.innerHTML = `0 repas, 0 produits`;\n }\n\n /**\n * Override _initButtonListeners to add specific page button\n */\n _initButtonListeners() {\n super._initButtonListeners();\n const confirmOrderButton =\n this._domFragment.getElementById(\"confirmOrderButton\");\n const continueButton = this._domFragment.getElementById(\"continueButton\");\n const removeAllButton = this._domFragment.getElementById(\"removeAllButton\");\n confirmOrderButton.addEventListener(\n \"click\",\n () => {\n this._routeWrapper.navigate(this._basketRoute).bind(this);\n },\n false\n );\n continueButton.addEventListener(\n \"click\",\n () => {\n this._routeWrapper.navigate(this._homeRoute).bind(this);\n },\n false\n );\n removeAllButton.addEventListener(\n \"click\",\n () => {\n window.mealz.basket.reset();\n },\n false\n );\n }\n\n /**\n *\n * @param {DomElement} pagePlaceHolder\n */\n injectPageFragment(pagePlaceHolder) {\n if (!pagePlaceHolder) return;\n this._refreshRecipeRecapFragmentView(window.mealz.basket.recipeCount());\n this._initButtonListeners();\n if (this._header)\n pagePlaceHolder.parentElement.insertBefore(this._header, pagePlaceHolder);\n if (this._footer)\n pagePlaceHolder.parentElement.insertBefore(\n this._footer,\n pagePlaceHolder.nextSibling\n );\n pagePlaceHolder.replaceWith(this._domFragment);\n }\n}\n","\n// Interface to translate products between Miam and Cora\n// This is where the special conditions related to PFT products are handled,\n// as well as the quantities updates are calculated\nexport class ComparisonItem {\n miamQuantity = 0;\n miamTargetQuantity = 0;\n miamBasketEntryIds = {};\n _retailerProducts = [];\n _basketWrapper;\n\n constructor(basketWrapper){\n this._basketWrapper = basketWrapper;\n }\n\n get retailerQuantity() {\n const quantities = this._retailerProducts.map(retailerProduct => retailerProduct.quantity);\n // make the sum\n return quantities.reduce((a,b) => parseInt(a) + parseInt(b), 0);\n\n }\n\n\n clearRetailerProduct() {\n this._retailerProducts = [];\n }\n\n // only for logging purpose\n get miamBasketEntryIdsToStr() {\n let res = '';\n Object.keys(this.miamBasketEntryIds).forEach(beId => {\n const qty = this.miamBasketEntryIds[beId];\n res += `${beId}: ${qty}, `\n });\n return res;\n }\n\n get firstBasketEntryId() {\n return Object.keys(this.miamBasketEntryIds)[0];\n }\n\n removeFirstMiamEntry(qtyToRemove){\n const firstKey = Object.keys(this.miamBasketEntryIds)[0];\n let quantity = this.miamBasketEntryIds[firstKey];\n if (quantity > qtyToRemove) {\n this.miamBasketEntryIds[firstKey] = quantity - qtyToRemove;\n return [firstKey, qtyToRemove];\n } else {\n delete this.miamBasketEntryIds[firstKey];\n return [firstKey, quantity];\n }\n }\n\n // --------------------------------------------------------------------------------------------\n // --- COMING FROM Retailer -----------------------------------------------------------------------\n // --------------------------------------------------------------------------------------------\n\n /**\n * _retailerProducts is a array for some retailer (like cora)\n * so to have the moset standart code we turn it into an array\n * even if it's not needed\n * @param {array<{id:string, quantity:quantity}>} retailerProduct \n */\n addOrUpdateRetailerProduct(retailerProduct) {\n if (this._retailerProducts.length === 0 || this.retailerQuantity === 0){\n this._retailerProducts = [retailerProduct];\n return;\n }\n const existingRetailerProduct = this._retailerProducts[0];\n existingRetailerProduct.quantity = retailerProduct.quantity;\n return;\n\n }\n\n\n // --------------------------------------------------------------------------------------------\n // --- COMING FROM MIAM -----------------------------------------------------------------------\n // --------------------------------------------------------------------------------------------\n\n createRetailerProducts(basketEntry, targetQuantity){\n if (basketEntry.selectedItem) { \n this._retailerProducts = [this._basketWrapper.mapProductToEntry(basketEntry.selectedItem.attributes, targetQuantity)];\n }\n return this._retailerProducts;\n }\n\n // will update cora quantity according to quantityDiff = compItem.miamTargetQuantity - compItem.miamQuantity\n // could be a simple update or a delete (or partial delete for pft items)\n // NB : compItem.miamTargetQuantity === 0 does NOT mean a total delete, for exemple if coraQuantity > miamQuantity\n updateRetailerProducts() {\n const quantityDiff = this.miamTargetQuantity - this.miamQuantity;\n if (quantityDiff === 0 || this._retailerProducts.length === 0){ // here length of cora product should never be 0 but security check it\n return [];\n }\n let item = this._retailerProducts[0];\n // TODO quantity / quantite ??\n item.quantity += quantityDiff;\n if (item.quantity <= 0 ) {\n // no more cora product, in this case miamQuantity should have been coraQuantity and miamTargetQuantity 0\n this.clearRetailerProduct();\n }\n return [item];\n }\n}","import { ComparisonItem } from \"./comparison-item\";\n\n// Controller that handles the events coming from Cora or Miam\n// This is where we define the comparison objects for each product, depending on what updates happened in Cora or Miam\n// The \"resolve\" functions return an array of products to be updated (removed / added). Three possible cases :\n// - products to be removed from Miam\n// - products to be added to Cora\n// - products to be removed from Cora\nexport class ComparisonMap {\n _extIdToComparisonItem = {};\n _comparisonItemType;\n _basketWrapper;\n\n /**\n *\n * @param retailerBasket\n * @param miamBasket\n * @param comparisonItemType\n */\n constructor(\n basketWrapper,\n retailerBasket,\n miamBasket,\n comparisonItemType = ComparisonItem\n ) {\n this._comparisonItemType = comparisonItemType;\n this._basketWrapper = basketWrapper;\n this.addEntryInMapFromRetailer(retailerBasket);\n this._setFromMiam(miamBasket);\n }\n\n /**\n *\n * @param extId\n * @returns\n */\n _fetchComparisonItem(extId) {\n let compItem = this._extIdToComparisonItem[extId];\n if (!compItem) {\n compItem = new this._comparisonItemType(this._basketWrapper);\n this._extIdToComparisonItem[extId] = compItem;\n }\n return compItem;\n }\n\n /**\n *\n */\n cleanNullProducts() {\n Object.keys(this._extIdToComparisonItem).forEach((extId) => {\n const compItem = this._extIdToComparisonItem[extId];\n if (compItem.miamQuantity === 0 && compItem.retailerQuantity === 0) {\n delete this._extIdToComparisonItem[extId];\n }\n });\n }\n\n // --------------------------------------------------------------------------------------------\n // --- COMING FROM Retailer-----------------------------------------------------------------------\n // --------------------------------------------------------------------------------------------\n\n /**\n * add / update / delete compraisonItem to _extIdToComparisonItem\n * @param {*} retailerBasket\n */\n updateMapFromRetailer(retailerBasket) {\n this.addEntryInMapFromRetailer(retailerBasket);\n this.deleteEntrieInMapFromRetailer(retailerBasket);\n }\n\n /**\n *\n * @param {*} retailerBasket\n */\n addEntryInMapFromRetailer(retailerBasket) {\n retailerBasket.forEach((retailerEntrie) => {\n const compItem = this._fetchComparisonItem(retailerEntrie.id);\n compItem.addOrUpdateRetailerProduct(retailerEntrie);\n });\n }\n\n /**\n *\n * @param {*} retailerBasket\n */\n deleteEntrieInMapFromRetailer(retailerBasket) {\n Object.keys(this._extIdToComparisonItem).forEach((extId) => {\n this.checkIfEntryIsToDeleteFromMap(extId, retailerBasket);\n });\n }\n\n /**\n * if there is no more item with given extId\n * on Retailer's basket we have to remove it\n * @param extId to check\n * @param retailerBasket current retailer's basket\n */\n checkIfEntryIsToDeleteFromMap(extId, retailerBasket) {\n const compItem = this._extIdToComparisonItem[extId];\n const itemInRetailerBasket = retailerBasket.find(\n (retailerEntrie) => retailerEntrie.id === extId\n );\n if (!itemInRetailerBasket) {\n compItem.clearRetailerProduct();\n }\n }\n\n /**\n * Retailler can only delete miam's entries\n * @returns\n */\n resolveFromRetailer() {\n let toRemoveFromMiam = [];\n Object.keys(this._extIdToComparisonItem).forEach((extId) => {\n const compItem = this._extIdToComparisonItem[extId];\n const quantityDelta = compItem.miamQuantity - compItem.retailerQuantity;\n if (quantityDelta > 0) {\n toRemoveFromMiam = [...toRemoveFromMiam , ...this.getQuantityToRemove(compItem, quantityDelta)];\n compItem.miamQuantity = compItem.retailerQuantity;\n }\n });\n return toRemoveFromMiam;\n }\n\n\n /**\n * while there is still qty to remove \n * remove qunatity from the next basket entry\n * @param {Object} compItem\n * @param {number}\n * @returns an array of entries to remove from miam\n */\n getQuantityToRemove(compItem, stillToRemove) {\n const toRemoveFromMiam = []\n while(stillToRemove > 0) {\n let beId;\n let quantityRemoved;\n [beId, quantityRemoved] = compItem.removeFirstMiamEntry(stillToRemove);\n if (beId == undefined || quantityRemoved == undefined){\n stillToRemove = 0;\n } else {\n stillToRemove -= quantityRemoved;\n toRemoveFromMiam.push({ id: beId, qty: quantityRemoved});\n }\n }\n return toRemoveFromMiam\n }\n\n // --------------------------------------------------------------------------------------------\n // --- COMING FROM MIAM -----------------------------------------------------------------------\n // --------------------------------------------------------------------------------------------\n\n /**\n *\n * @param {*} miamBasket\n */\n setTargetFromMiam(miamBasket) {\n // console.debug(\"set target from miam\", miamBasket);\n\n // loop on comparison map and update targetQuantity according to miamB\n this._updateTargetFromMiam(miamBasket);\n // add those missing in comparison item\n this._addTargetFromMiam(miamBasket);\n }\n\n /**\n *\n * @param {*} miamBasket\n * @returns\n */\n resolveFromMiam(miamBasket) {\n // console.debug(\"resolve from Miam basket\", miamBasket);\n let toPushToRetailer = [];\n Object.keys(this._extIdToComparisonItem).forEach((extId) => {\n toPushToRetailer = [\n ...toPushToRetailer,\n ...this.createOrUpdate(extId, miamBasket),\n ];\n });\n return toPushToRetailer;\n }\n\n /**\n *\n */\n createOrUpdate(extId, miamBasket) {\n const compItem = this._extIdToComparisonItem[extId];\n let itemsToPush;\n if (compItem.retailerQuantity === 0 && compItem.miamTargetQuantity !== 0) {\n // it is a creation\n // if there is more than one basket id for this product, arbitrary take the first\n // it will result at the same cora creation anyway\n const basketEntry = miamBasket.find(\n (be) => be.id == compItem.firstBasketEntryId\n );\n itemsToPush = compItem.createRetailerProducts(\n basketEntry,\n compItem.miamTargetQuantity\n );\n } else {\n itemsToPush = compItem.updateRetailerProducts();\n }\n compItem.miamQuantity = compItem.miamTargetQuantity;\n return itemsToPush;\n }\n\n _setFromMiam(miamBasket) {\n miamBasket.forEach((basketEntry) => {\n // TODO : retirer si on a que des basketEntry actives ?\n const extId =\n basketEntry.selectedItem &&\n basketEntry.selectedItem.attributes[\"ext-id\"];\n if (!extId) {\n return;\n }\n const compItem = this._fetchComparisonItem(extId);\n // may already exist if two different ingredients matched same item\n compItem.miamQuantity += basketEntry.attributes.quantity;\n compItem.miamBasketEntryIds[basketEntry.id] =\n basketEntry.attributes.quantity;\n });\n }\n\n // loop on comparison map and update targetQuantity according to miamB\n _updateTargetFromMiam(miamBasket) {\n Object.keys(this._extIdToComparisonItem).forEach((extId) => {\n const compItem = this._extIdToComparisonItem[extId];\n // you can have différent ingredients (ie different be) matching the same product\n const miamBasketEntries = miamBasket.filter((basketEntry) => {\n return (\n basketEntry.selectedItem &&\n basketEntry.selectedItem.attributes[\"ext-id\"] === extId\n );\n });\n if (miamBasketEntries.length > 0) {\n const quantities = miamBasketEntries.map(\n (be) => be.attributes.quantity\n );\n compItem.miamTargetQuantity = quantities.reduce(\n (a, b) => parseInt(a) + parseInt(b),\n 0\n );\n compItem.miamBasketEntryIds = miamBasketEntries.reduce(function (\n map,\n be\n ) {\n map[be.id] = parseInt(be.attributes.quantity);\n return map;\n },\n {});\n } else {\n compItem.miamTargetQuantity = 0;\n compItem.miamBasketEntryIds = {};\n }\n });\n }\n\n // add comparisonItem and target quantity according to those in miamB missing in comparisonMap\n _addTargetFromMiam(miamBasket) {\n // ---\n miamBasket.forEach((basketEntry) => {\n // TODO : retirer si on a que des basketEntry actives ?\n const extId =\n basketEntry.selectedItem &&\n basketEntry.selectedItem.attributes[\"ext-id\"];\n if (!extId) {\n return;\n }\n if (this._extIdToComparisonItem[extId]) {\n return;\n }\n const compItem = this._fetchComparisonItem(extId);\n // here in fact the target quantity is useless as we we will need to create a product, we can use basketEntry.quantity\n compItem.miamTargetQuantity += basketEntry.attributes.quantity;\n compItem.miamBasketEntryIds[basketEntry.id] =\n basketEntry.attributes.quantity;\n });\n }\n}\n","\nimport { ComparisonMap } from './comparison-map';\n\n/**\n * \n */\nexport class BasketsComparator {\n\n _comparisonMap;\n _basketWrapper\n isProcessingRetailerEvent;\n\n /**\n * \n * @param {*} existingRetailerBasket \n * @param {*} firstMiamBasket \n * @param {*} comparisonMapClass \n */\n constructor(basketWrapper, existingRetailerBasket, firstMiamBasket , comparisonMapClass = ComparisonMap) {\n this.isProcessingRetailerEvent = true;\n this._basketWrapper = basketWrapper\n this._comparisonMap = new comparisonMapClass(basketWrapper, existingRetailerBasket, firstMiamBasket);\n const toRemoveFromMiam = this._comparisonMap.resolveFromRetailer();\n this.sendUpdateToMiam(toRemoveFromMiam);\n }\n\n /**\n * \n * @param {*} basket \n */\n updateReceivedFromMiam(basket) {\n this._comparisonMap.setTargetFromMiam(basket);\n const toPushToRetailer = this._comparisonMap.resolveFromMiam(basket);\n this._comparisonMap.cleanNullProducts();\n this.sendUpdateToRetailer(toPushToRetailer);\n }\n\n /**\n * \n * @param {*} retailerBasket \n */\n updateReceivedFromRetailer(retailerBasket) { \n this.isProcessingRetailerEvent = true;\n this._comparisonMap.updateMapFromRetailer(retailerBasket);\n const toRemoveFromMiam = this._comparisonMap.resolveFromRetailer();\n this._comparisonMap.cleanNullProducts();\n this.sendUpdateToMiam(toRemoveFromMiam);\n }\n\n /**\n * \n * @param {*} entriesToRemove \n * @returns \n */\n sendUpdateToMiam(entriesToRemove) {\n // console.debug('will remove from miam', entriesToRemove);\n if (entriesToRemove.length === 0){\n // console.debug('stop processing retailer event');\n this.isProcessingRetailerEvent = false;\n return;\n }\n window.mealz.basket.removeEntries(entriesToRemove).subscribe(() => {\n // console.debug('stop processing retailer event');\n this.isProcessingRetailerEvent = false;\n });\n }\n\n /**\n * \n * @param {*} itemsToAdd \n * @returns \n */\n sendUpdateToRetailer(itemsToAdd) {\n // console.debug('will update retailer', itemsToAdd);\n if (itemsToAdd.length === 0){\n return;\n }\n this._basketWrapper.pushProductsToBasket(itemsToAdd.map(item => { \n return this._basketWrapper.mapEntryToProduct(item)\n }));\n }\n \n}","\nexport class RoutingWrapper {\n\n constructor() { }\n\n /**\n * @param {string} route to check\n * @returns true is host know the route\n */\n // eslint-disable-next-line no-unused-vars\n doesRouteExists(route) {\n throw new Error('You must implement \\'doesRouteExists\\' for this retailer');\n }\n\n /**\n * go to the given page \n * @param {string} route to go\n */\n // eslint-disable-next-line no-unused-vars\n navigate(route) {\n throw new Error('You must implement \\'navigate\\' for this retailer');\n }\n\n\n /**\n * @optional\n * only for SPA action to do on navigation\n * this function purpose is to subscribe to routting event\n * and call a callBack then witch is designe to be @resolveRoute\n */\n // eslint-disable-next-line no-unused-vars\n onRoutingEvent(callBack) {\n }\n}","\nexport class BasketWrapper {\n\n /**\n * @returns true if payment occured\n */\n hasPayment() {\n throw new Error('You must implement \\'hasPayment\\' for this retailer');\n }\n\n\n /**\n * @returns payment total when a payment occured\n */\n paymentTotal(){\n throw new Error('You must implement \\'paymentTotal\\' for this retailer');\n }\n\n /**\n * Here we listen to Retailer basket change and then call the given\n * retailerBasketChangeCallBack\n * @param {Function} retailerBasketChangeCallBack implemented in basket handler\n */\n // eslint-disable-next-line no-unused-vars\n listenToRetailerBasket(retailerBasketChangeCallBack){\n throw new Error('You must implement \\'lisentToRetailerBasket\\' for this retailer');\n }\n\n /**\n * @return a list of articles in retailer's basket in RETAILER format\n */\n getBasketProducts(){\n throw new Error('You must implement \\'getBasketProducts\\' for this retailer');\n }\n\n /**\n * This call retailer function for adding programaticaly product to cart\n * @param {Object} retailerProducts format use by retailer to add product in his cart\n */\n // eslint-disable-next-line no-unused-vars\n pushProductsToBasket(retailerProducts){\n throw new Error('You must implement \\'pushProductsToBasket\\' for this retailer');\n }\n\n /**\n * transform object to needed format to push on retailer basket\n * @param {Object} injectEntry \n * @returns product to retailer format\n */\n // eslint-disable-next-line no-unused-vars\n mapEntryToProduct(injectEntry){\n throw new Error('You must implement \\'mapEntryToProduct\\' for this retailer');\n }\n\n /**\n * transforms product (and potentially additional parameters such as quantity) \n * @param {Object} retailerProduct product of retailer format\n * @returns miam format\n */\n // eslint-disable-next-line no-unused-vars\n mapProductToEntry(retailerProduct){\n throw new Error('You must implement \\'mapProductToEntry\\' for this retailer');\n }\n \n}\n","import { UserWrapper } from '@core';\n\nexport class ChronodriveUserWrapper extends UserWrapper {\n // TODO\n analyticsAllowed() {\n return true;\n }\n \n // TODO\n profilingAllowed() {\n return true;\n }\n\n isUserLogged() {\n return !!this.getUserId();\n }\n\n getUserId() {\n const matcher = document.cookie.match(/chronoUser=\"userId=([0-9]+)\";/);\n return matcher && matcher[1];\n }\n\n getUserPwd() {\n return localStorage.getItem('_miam/userPwd');\n }\n\n // Catch user password at login (from form)\n interceptUserPwd() {\n let oldXHRSend = window.XMLHttpRequest.prototype.send;\n \n window.XMLHttpRequest.prototype.send = function (data) {\n this.addEventListener('load',\n function (_loadEvent) {\n if (this.responseURL.match('login.connexion.login.loginform')) {\n const pwd = data.match(/pwd_login=(.+)&/)[1];\n localStorage.setItem('_miam/userPwd', pwd);\n console.debug(\"[Miam] User pwd saved\");\n }\n }\n );\n\n return oldXHRSend.apply(this, arguments);\n }\n }\n\n // TODO: cache token ?\n static getAuthToken(callback) {\n // TODO: use static methods\n const wrapper = new ChronodriveUserWrapper();\n const id = wrapper.getUserId();\n const pwd = wrapper.getUserPwd();\n\n if (!id || !pwd) {\n console.debug('[Miam] Cannot get auth token as user is not logged in');\n localStorage.removeItem('_miam/userPwd')\n return callback(null);\n }\n\n let req = new XMLHttpRequest();\n const params = `v2=true&login=${id}&password=${pwd}`;\n\n req.addEventListener('load', function(_event) {\n // Logged in, pass auth token back\n callback(JSON.parse(this.responseText)['token']);\n })\n req.open('post', 'https://www.chronodrive.com/mobile/ws/login', true);\n req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n\n return req.send(params);\n }\n}\n","import { StoreWrapper } from '@core';\n\nexport class ChronodriveStoreWrapper extends StoreWrapper {\n // TODO\n setPos(posExtId) {\n // throw new Error(\"You must implement 'setPos' for this retailer\");\n }\n\n getPosExtId() {\n const matcher = document.cookie.match(/chronoShop=\\\"shopId=([0-9]+)\\\";/);\n return matcher && matcher[1];\n }\n\n // TODO\n invalidPosCallback() {\n throw new Error(\n \"You must implement 'invalidPosCallback' for this retailer\"\n );\n }\n\n isAvailable() {\n return window.mealz.user.device.matchMedia(\"(min-width: 1023px)\").matches;\n }\n\n // TODO: exclude irrelevant places\n availableOnShelf() {\n return !!document.getElementById('productListZone');\n }\n}\n","export class ChronodriveCardInjectorWrapper {\n\n constructor(){}\n\n // TODO\n basketProductIds() {\n return [];\n }\n\n /**\n * action to do when we remove card from DOM\n * @param {DomElement} webcCard a recipe card\n */\n // eslint-disable-next-line no-unused-vars\n onHideCard(webcCard){\n throw new Error('You must implement \\'onHideCard\\' for this retailer');\n }\n\n /**\n * @returns the string displayed in recipe-helper after \"Retrouvez le détails \" (ex: \"dans l'onglet Mes Repas\")\n */\n recipeRecapLocationString() {\n return undefined;\n }\n\n cardHeaderText() {\n return 'Recette commandable';\n }\n\n // Container the holds all the product tiles\n detectCardsContainer() {\n return document.getElementById('productListZone');\n }\n\n cardsPositionsByScreenWidth() {\n if (window.prevItemPerLine === 2) {\n return [3, 7, 12, 17];\n } if (window.prevItemPerLine === 3) {\n return [2, 7, 14, 21];\n } if (window.prevItemPerLine === 4) {\n return [3, 10, 19, 25];\n } else {\n return [4, 7, 15, 23];\n }\n }\n\n cardContainerCssClasses() {\n return ['item', 'item--recipe'];\n }\n\n // Pass DOM elements representing items (articles), and return their respective ids\n // When the id cannot be found, exclude it from the resultset to avoid returning array with null elements\n getProductsIds(contextElements) {\n return contextElements.map(element => {\n const actionsElement = element?.getElementsByClassName('item-actions') && element.getElementsByClassName('item-actions')[0];\n return actionsElement?.getAttribute('data-cug');\n }).filter(id => !!id);\n }\n}","import { RoutingWrapper } from \"@core\";\n\nexport class ChronodriveRoutingWrapper extends RoutingWrapper {\n /**\n * @param {string} route to check\n * @returns true is host know the route\n */\n // eslint-disable-next-line no-unused-vars\n doesRouteExists(route) {\n throw new Error('You must implement \\'doesRouteExists\\' for this retailer');\n }\n\n /**\n * go to the given page \n * @param {string} route to go\n */\n // eslint-disable-next-line no-unused-vars\n navigate(route) {\n window.location.href = route;\n }\n\n\n /**\n * @optional\n * only for SPA action to do on navigation\n * this function purpose is to subscribe to routting event\n * and call a callBack then witch is designe to be @resolveRoute\n */\n // eslint-disable-next-line no-unused-vars\n onRoutingEvent(callBack) {\n }\n}","import { RecipeTagWrapper } from '@core';\n\nexport class ChronodriveRecipeTagWrapper extends RecipeTagWrapper {\n constructor(recipeDetailPreviewAllowed = true) {\n super(recipeDetailPreviewAllowed)\n }\n\n tagPlaceholders() {\n const items = document.getElementsByClassName('item');\n [...items].forEach(item => {\n if (item.getElementsByClassName('miam-recipe-tag-container').length == 0) { // Don't insert a tag if there is one already\n const tagContainer = document.createRange().createContextualFragment(\n `<div class=\"miam-recipe-tag-container\"><div class=\"miam-recipe-tag-placeholder\"></div></div>`\n );\n item.appendChild(tagContainer);\n item.getElementsByClassName('item-actions')[0].style = \"bottom: auto; top: 34px;\";\n }\n })\n return document.getElementsByClassName('miam-recipe-tag-placeholder')\n }\n\n itemExtId(recipeTagElement) {\n return recipeTagElement.parentElement.parentElement.getElementsByClassName('item-actions')[0].getAttribute('data-cug');\n }\n}\n","// switch to 'uat' or 'prod'\nexport const environment = getEnv('uat');\n\nfunction getEnv(env) {\n if (env === 'dev') {\n return {\n supplierId: '7',\n analyticsKey: '-',\n apiHost: 'http://localhost:3000'\n };\n } else if (env === 'uat') {\n return {\n supplierId: '3',\n analyticsKey: '-',\n apiHost: 'https://api-uat.miam.tech'\n };\n } else {\n return {\n supplierId: '-', // TODO\n analyticsKey: '-', // TODO\n apiHost: 'https://api.miam.tech'\n };\n }\n}\n","import \"./style.scss\";\nimport { CoreInitializer, BasketHandler, RecipeInjector, RecapPage, RecipeTagsInjector } from \"@core\";\nimport { ChronodriveUserWrapper } from \"./wrappers/chronodrive-user-wrapper\";\nimport { ChronodriveStoreWrapper } from \"./wrappers/chronodrive-store-wrapper\";\nimport { ChronodriveBasketWrapper } from \"./wrappers/chronodrive-basket-wrapper\";\nimport { ChronodriveCardInjectorWrapper } from \"./wrappers/chronodrive-card-injector-wrapper\";\nimport { ChronodriveRoutingWrapper } from './wrappers/chronodrive-routing-wrapper'\nimport { ChronodriveRecipeTagWrapper } from './wrappers/chronodrive-recipe-tag-wrapper'\nimport { environment as env } from './environment';\n\n// -------------------------------------------------------------------------\n// Init\n// -------------------------------------------------------------------------\n\n// Intercepts Miam API requests and forces content-type header (Chrono forces it to text/plain otherwise)\nlet oldXHROpen = window.XMLHttpRequest.prototype.open;\nwindow.XMLHttpRequest.prototype.open = function (method, url, data) {\n if (url.match(env.apiHost)) {\n let req = oldXHROpen.apply(this, arguments);\n this.setRequestHeader('Content-Type', 'application/vnd.api+json');\n return req\n } else {\n return oldXHROpen.apply(this, arguments);\n }\n}\n\nconst userWrapper = new ChronodriveUserWrapper();\nconst storeWrapper = new ChronodriveStoreWrapper();\nnew CoreInitializer(env.supplierId, userWrapper, storeWrapper, env.analyticsKey);\n\n// -------------------------------------------------------------------------\n// Basket Handling\n// -------------------------------------------------------------------------\n\n// user password required to push items to Chrono basket via mobile API\nuserWrapper.interceptUserPwd();\nnew BasketHandler(new ChronodriveBasketWrapper());\n\n// -------------------------------------------------------------------------\n// Recipe cards injection\n// -------------------------------------------------------------------------\n\nif (storeWrapper.availableOnShelf()) {\n const cardWrapper = new ChronodriveCardInjectorWrapper();\n // TODO: make the change in core & pass only the wrapper\n const targetContainer = cardWrapper.detectCardsContainer();\n // ---\n new RecipeInjector(targetContainer, cardWrapper, true);\n}\n\n// -------------------------------------------------------------------------\n// Recap page & menu entry injection\n// -------------------------------------------------------------------------\n\nconst MEAL_ICON = `<svg style=\"margin-left:-3px; margin-right:9px;\" width=\"25\" height=\"25\" viewBox=\"0 0 49 49\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M24.5 17.7037C23.0662 17.7037 21.6646 18.1289 20.4725 18.9255C19.2804 19.722 18.3512 20.8542 17.8026 22.1788C17.2539 23.5034 17.1103 24.961 17.39 26.3672C17.6697 27.7734 18.3602 29.0651 19.374 30.0789C20.3878 31.0928 21.6795 31.7832 23.0857 32.0629C24.4919 32.3426 25.9495 32.1991 27.2741 31.6504C28.5988 31.1017 29.7309 30.1726 30.5275 28.9804C31.324 27.7883 31.7492 26.3867 31.7492 24.953C31.747 23.031 30.9826 21.1884 29.6235 19.8294C28.2645 18.4704 26.4219 17.7059 24.5 17.7037ZM24.5 31.296C23.2454 31.296 22.0191 30.924 20.9759 30.227C19.9328 29.5301 19.1198 28.5394 18.6397 27.3804C18.1596 26.2213 18.034 24.9459 18.2788 23.7155C18.5235 22.4851 19.1276 21.3548 20.0147 20.4677C20.9018 19.5806 22.0321 18.9765 23.2625 18.7318C24.4929 18.487 25.7683 18.6126 26.9274 19.0927C28.0864 19.5728 29.0771 20.3858 29.774 21.4289C30.471 22.4721 30.843 23.6984 30.843 24.953C30.8411 26.6347 30.1722 28.247 28.9831 29.4361C27.794 30.6252 26.1817 31.2941 24.5 31.296Z\" fill=\"#FF7F7A\" stroke=\"#FF7F7A\"/>\n<path d=\"M37.6392 12.72H36.7331C35.652 12.7212 34.6155 13.1512 33.851 13.9157C33.0866 14.6801 32.6566 15.7166 32.6554 16.7977V17.7605C31.6983 16.6751 30.5341 15.7917 29.2312 15.1621C27.9283 14.5325 26.5127 14.1693 25.0676 14.0939C23.6225 14.0184 22.1768 14.2323 20.8154 14.7228C19.454 15.2134 18.2042 15.9708 17.1393 16.9506L16.897 13.1442C16.8884 13.025 16.833 12.9141 16.743 12.8355C16.653 12.7569 16.5355 12.7171 16.4163 12.7247C16.297 12.7323 16.1856 12.7867 16.1063 12.8761C16.027 12.9655 15.9861 13.0825 15.9927 13.2018L16.2804 17.7207C16.0717 17.8675 15.4785 18.0881 14.5323 18.1437V13.1731C14.5323 13.0529 14.4846 12.9377 14.3996 12.8527C14.3146 12.7677 14.1994 12.72 14.0792 12.72C13.959 12.72 13.8438 12.7677 13.7588 12.8527C13.6739 12.9377 13.6261 13.0529 13.6261 13.1731V18.1436C12.734 18.0903 12.1113 17.8871 11.878 17.7193L12.1657 13.2019C12.1723 13.0826 12.1315 12.9655 12.0521 12.8761C11.9728 12.7868 11.8614 12.7324 11.7421 12.7248C11.6229 12.7172 11.5055 12.757 11.4154 12.8355C11.3254 12.9141 11.27 13.0251 11.2614 13.1443L10.9114 18.6413C10.8803 19.1698 11.049 19.6907 11.384 20.1006C11.719 20.5105 12.1959 20.7795 12.72 20.8543V25.4062C12.5998 25.4062 12.4846 25.4539 12.3996 25.5389C12.3146 25.6238 12.2669 25.7391 12.2669 25.8592V34.4677C12.2669 34.9483 12.4578 35.4093 12.7977 35.7492C13.1376 36.0891 13.5986 36.28 14.0792 36.28C14.5599 36.28 15.0208 36.0891 15.3607 35.7492C15.7006 35.4093 15.8915 34.9483 15.8915 34.4677V31.5951C17.0459 33.0897 18.5694 34.2581 20.3123 34.9853C22.0552 35.7125 23.9573 35.9735 25.8316 35.7425C27.706 35.5116 29.4879 34.7967 31.0021 33.6681C32.5163 32.5396 33.7107 31.0363 34.4677 29.3062V34.4677C34.4677 34.9483 34.6586 35.4093 34.9985 35.7492C35.3384 36.0891 35.7993 36.28 36.28 36.28C36.7606 36.28 37.2216 36.0891 37.5615 35.7492C37.9014 35.4093 38.0923 34.9483 38.0923 34.4677V13.1731C38.0923 13.0529 38.0446 12.9377 37.9596 12.8527C37.8746 12.7677 37.7594 12.72 37.6392 12.72ZM14.9854 34.4677C14.9854 34.708 14.8899 34.9385 14.72 35.1084C14.55 35.2784 14.3195 35.3738 14.0792 35.3738C13.8389 35.3738 13.6084 35.2784 13.4385 35.1084C13.2685 34.9385 13.1731 34.708 13.1731 34.4677V26.3123H14.9854V34.4677ZM13.6261 25.4062V20.8754H14.5323V25.4062H13.6261ZM15.1405 19.9692H13.0179C12.8543 19.9692 12.6924 19.9359 12.5421 19.8712C12.3918 19.8066 12.2562 19.7119 12.1437 19.5931C12.0312 19.4743 11.9441 19.3338 11.8877 19.1802C11.8313 19.0266 11.8069 18.8631 11.8158 18.6997C12.3238 18.9087 13.0711 19.0631 14.0792 19.0631C14.9072 19.0631 15.7386 18.9473 16.3425 18.7019C16.3512 18.8651 16.3265 19.0283 16.27 19.1817C16.2135 19.3351 16.1264 19.4753 16.0139 19.5939C15.9014 19.7125 15.766 19.807 15.6158 19.8715C15.4657 19.936 15.3039 19.9693 15.1405 19.9692ZM31.2554 32.2826C30.1592 33.2928 28.8505 34.0443 27.4256 34.4818C26.0006 34.9193 24.4956 35.0316 23.0215 34.8105C21.5474 34.5894 20.1416 34.0405 18.9077 33.2043C17.6737 32.368 16.6431 31.2657 15.8915 29.9784V25.8592C15.8915 25.7391 15.8438 25.6238 15.7588 25.5389C15.6738 25.4539 15.5586 25.4062 15.4384 25.4062V20.8543C15.9629 20.7795 16.4401 20.5101 16.7751 20.0997C17.1101 19.6893 17.2786 19.168 17.2469 18.6391L17.2157 18.1497C18.2277 17.0659 19.4689 16.2216 20.8486 15.6783C22.2283 15.1351 23.7119 14.9065 25.1912 15.0094C26.6705 15.1122 28.1082 15.5439 29.3995 16.2729C30.6907 17.0019 31.8031 18.0099 32.6554 19.2233V25.8592C32.6554 25.9794 32.7031 26.0946 32.7881 26.1796C32.873 26.2646 32.9883 26.3123 33.1084 26.3123H34.3753C34.0623 28.605 32.9589 30.7166 31.2554 32.2826ZM37.1861 34.4677C37.1861 34.708 37.0907 34.9385 36.9207 35.1084C36.7508 35.2784 36.5203 35.3738 36.28 35.3738C36.0397 35.3738 35.8092 35.2784 35.6392 35.1084C35.4693 34.9385 35.3738 34.708 35.3738 34.4677V26.3123H37.1861V34.4677ZM37.1861 25.4062H33.5615V16.7977C33.5625 15.9568 33.8969 15.1507 34.4915 14.5561C35.0861 13.9615 35.8922 13.6271 36.7331 13.6262H37.1861V25.4062Z\" fill=\"#007E92\" stroke=\"#007E92\" stroke-width=\"0.5\"/>\n<rect x=\"1.25\" y=\"1.25\" width=\"46.5\" height=\"46.5\" rx=\"23.25\" stroke=\"#007E92\" stroke-width=\"1.5\"/>\n</svg>`;\n\n// Append menu entry to Account menu\nconst accountMenu = document.getElementById('baccount').querySelector('ul');\nconst entry = document.createElement('li');\nconst entryLink = document.createElement('a');\nentryLink.style = 'display: flex; align-items: center;';\nentry.appendChild(entryLink);\nentryLink.innerHTML = `${MEAL_ICON} Mes repas`;\naccountMenu.insertBefore(entry,accountMenu.children[2]);\n\n// Close menu & open modal on click\nentry.addEventListener('click', function() {\n const overlay = document.getElementById('overlayH');\n const evObj = document.createEvent('Events');\n evObj.initEvent('click', true, false);\n overlay.dispatchEvent(evObj);\n \n // Clean page content & replace by recipe recap\n const contentContainer = document.getElementById('content');\n contentContainer.innerHTML = \"<div></div>\";\n const recapPage = new RecapPage(new ChronodriveRoutingWrapper(), window.location.href, '/cartdetail', {});\n recapPage.injectPageFragment(contentContainer.firstChild);\n});\n\n// -------------------------------------------------------------------------\n// Recipe tags injection on basket page\n// -------------------------------------------------------------------------\n\nif (window.location.href.includes(\"/cartdetail\")) {\n new RecipeTagsInjector(new ChronodriveRecipeTagWrapper());\n}","import { BasketsComparator } from './basket-handling';\n\n/**\n * Instantiate listener on retailer and Miam\n */\nexport class BasketHandler {\n\n _firstMiamBasketReceived; // we use a behaviourSubject and first emit value is not relevant\n _comparatorClass; // class use for _compartor\n _comparator;\n _basketWrapper;\n\n /**\n * @param {*} basketsComparatorClass default is BasketsComparator you can override this\n * class to provide custom behaviours\n */\n constructor(basketWrapper, confirmationUrl = null, basketsComparatorClass = BasketsComparator){\n this._basketWrapper = basketWrapper;\n this._comparatorClass = basketsComparatorClass;\n this._firstMiamBasketReceived = false;\n this.initBasketProcess(confirmationUrl);\n }\n\n initBasketProcess(confirmationUrl) {\n this.handlePayment(() => {\n this.handleBasketSync();\n });\n if(confirmationUrl) {\n this.listenForConfirmation(confirmationUrl);\n }\n }\n\n listenForConfirmation(confirmationUrl) {\n const basketHandler = this; // neeed the ref as 'this' changes in the MutationObserver\n // initial check if we directly go on page or page reload\n var previousUrl = basketHandler.checkAndSendEvent(undefined, confirmationUrl);\n var observer = new MutationObserver(function() {\n previousUrl = basketHandler.checkAndSendEvent(previousUrl, confirmationUrl);\n });\n observer.observe(document.body, { attributes: false, childList: true, subtree: false })\n }\n\n checkAndSendEvent(previousUrl, confirmationUrl) {\n if (location.href !== previousUrl) {\n previousUrl = location.href;\n if(location.href.includes(confirmationUrl)) {\n const total = this._basketWrapper.paymentTotal();\n window.mealz.paymentStarted(total);\n }\n }\n return location.href;\n }\n\n /**\n * \n * @param {*} callback \n */\n handlePayment(callback) {\n if (this._basketWrapper.hasPayment()) {\n const total = this._basketWrapper.paymentTotal();\n const token = localStorage.getItem('_miam/basketToken');\n if (token) {\n // Miam basket that was confirmed on miam.tech => validate payment\n localStorage.removeItem('_miam/basketToken');\n this.sendMiamOrder(total, token);\n callback();\n } else {\n // Local Miam basket (with entries OR NOT) => confirm it and validate payment only if total received from miam > 0\n this.confirmBasket(total, callback);\n }\n } else {\n callback();\n }\n }\n\n /**\n * \n * @param {*} total \n * @param {*} token \n */\n sendMiamOrder(total, token) {\n if (token) {\n // console.log('[Miam] Send payment notification', token);\n window.mealz.supplier.notifyBasketUpdated(token, 'PAID', total);\n }\n }\n\n /**\n * \n * @param {*} total \n * @param {*} callback \n */\n confirmBasket(total, callback) {\n window.mealz.basket.confirm(total).subscribe(basket => {\n if (basket && basket.token && basket.totalPrice > 0) {\n // console.debug('[Miam] payment detected', total, token);\n \n const token = basket.token;\n // console.log('[Miam] Send confirmation notification', token);\n window.mealz.supplier.notifyBasketUpdated(token, 'CONFIRMED');\n this.sendMiamOrder(total, token);\n }\n callback();\n });\n }\n\n /**\n * To implement for each retailer\n */\n listenToRetailer(callback) {\n this._basketWrapper.listenToRetailerBasket(callback); \n }\n\n /**\n * need to be call with bind(this) to keep object ref\n * else this 'll be globale 'this' => window\n * @param {*} callback \n */\n listenToMiam(callback) {\n window.mealz.basket.entries$.subscribe(miamBasket => {\n // console.debug('Miam basket received', miamBasket, this._firstMiamBasketReceived);\n if (!this._firstMiamBasketReceived && miamBasket.length === 0) {\n // Skip first empty array received\n this._firstMiamBasketReceived = true;\n return;\n } else {\n callback(miamBasket);\n }\n });\n }\n\n /**\n * \n */\n handleBasketSync() {\n this.listenToMiam(miamBasket => {\n // Comparison should be initialized when first Miam basket is received, based on existing Retailer basket\n if (!this._comparator) {\n const existingRetailerBasket = this._basketWrapper.getBasketProducts();\n this._comparator = new this._comparatorClass( this._basketWrapper, existingRetailerBasket, miamBasket);\n // We listen to Retailer basket updates only after the first basket is received from Miam\n this.listenToRetailer(this.retailerBasketChangeCallBack.bind(this));\n return;\n }\n if (this._comparator.isProcessingRetailerEvent) {\n // console.debug('skipping retailer is processing');\n return;\n }\n // When comparison is already initialized, we just update it\n this._comparator.updateReceivedFromMiam(miamBasket)\n });\n }\n\n /**\n * \n * @param {*} retailerBasket \n */\n retailerBasketChangeCallBack(retailerBasket){\n this._comparator.updateReceivedFromRetailer(retailerBasket)\n }\n\n}","import { BasketWrapper } from '@core';\nimport { ChronodriveUserWrapper } from './chronodrive-user-wrapper';\nimport { ChronodriveStoreWrapper } from './chronodrive-store-wrapper';\n\nexport class ChronodriveBasketWrapper extends BasketWrapper {\n\n // TODO\n hasPayment() {\n return false;\n }\n\n // TODO\n listenToRetailerBasket(retailerBasketChangeCallBack) {\n return null;\n }\n\n // Read current basket from miniCartZone element in DOM (or cartDetailZone when on basket page)\n getBasketProducts() {\n let cart = document.getElementById('miniCartZone') || document.getElementById('cartDetailZone');\n const itemElems = cart.getElementsByClassName('item');\n \n let basketProducts = [];\n Array.from(itemElems).forEach(elem => {\n const cugContainer = elem.getElementsByClassName('item-actions')[0];\n const qtyContainer = cugContainer.getElementsByClassName('qte_basket')[0];\n if (cugContainer && qtyContainer) {\n basketProducts.push({\n id: cugContainer.getAttribute('data-cug'),\n quantity: parseInt(qtyContainer.textContent)\n })\n }\n });\n\n return basketProducts;\n }\n\n // Push products to Chrono basket using mobile API\n // Requires a token from mobile API (implemented in UserWrapper)\n // TODO: refresh page when modal closed to reload basket ?\n pushProductsToBasket(products) {\n ChronodriveUserWrapper.getAuthToken(token => {\n if (token) {\n const userId = new ChronodriveUserWrapper().getUserId();\n const shopId = new ChronodriveStoreWrapper().getPosExtId();\n // itemId:quantity:miam;itemId2:quantity2:miam\n const cugs = products.map(p => `${p.id}:${p.quantity}:miam`).join(';');\n const params = `v2=true&token=${token}&userId=${userId}&shopId=${shopId}&cugs=${cugs}`;\n\n let req = new XMLHttpRequest();\n req.open('post', 'https://www.chronodrive.com/mobile/ws/SendCart', true);\n req.addEventListener('load', this._refreshCartDisplay);\n req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n return req.send(params);\n }\n })\n }\n\n // TODO: fix naming + remove???\n // From Chrono to Miam format\n mapEntryToProduct(entry) {\n return entry;\n }\n\n // TODO: fix naming\n // From Miam to Chrono format\n mapProductToEntry(attributes, quantity){\n return {\n id: attributes['ext-id'],\n quantity: quantity\n };\n }\n\n // Fetches current page and replaces miniPanier & menu entry blocks in DOM\n // Used after items are pushed to Chrono basket, to reload basket total without reloading the page\n _refreshCartDisplay() {\n let req = new XMLHttpRequest();\n req.open('get', location.href, true);\n req.addEventListener('load', () => {\n const page = document.createElement('div');\n page.innerHTML = this.responseText;\n\n const newCartMenu = page.querySelector('a#m_panier');\n const existingCartMenu = document.body.querySelector('a#m_panier');\n existingCartMenu.parentNode.replaceChild(newCartMenu, existingCartMenu);\n\n const newMiniCart = page.querySelector('div#miniCartZone');\n const existingMiniCart = document.body.querySelector('div#miniCartZone');\n existingMiniCart.parentNode.replaceChild(newMiniCart, existingMiniCart);\n });\n req.send();\n }\n}"],"names":["RecipeInjector","constructor","container","cardWrapper","autoinject","__publicField","this","_cardWrapper","modifyHelperString","initListMutationObserver","injectCardsPlaceholders","targetContainer","listMutationObserver","MutationObserver","onDomChangeCallback","bind","observe","attributes","childList","subtree","_firstChange","endMutationObserver","disconnect","elementsDOM","getListElements","needsUpdate","injectRecipes","length","Array","from","document","getElementsByClassName","handleCachedRecipe","localStorage","removeItem","cachedRecipeUrl","sessionStorage","getItem","window","location","href","cachedRecipe","JSON","parse","shouldShowCachedRecipe","forEach","_","index","injectRecipe","buildCard","context","getContext","forcedRecipeId","webcCard","createElement","recipeId","productIds","shelfIngredients","map","i","id","randomModeEnable","headerText","cardHeaderText","displayVariant","recipeCardVariant","contextId","appendToDOM","addEventListener","parentElement","style","display","helper","querySelector","recipeRecapLocationString","stringDetailLocation","dataset","isContextEmpty","currentIngredients","basketIngredients","replaceWith","positions","cardsPositionsByScreenWidth","elements","children","filter","pos","position","cardContainer","classList","add","cardContainerCssClasses","cssClass","cardPlaceholder","appendChild","itemsIds","getProductsIds","slice","stringify","toString","insertBefore","RecipeCounter","template","toInjectBefore","initCounterWrapperIfNeeded","mealz","basket","recipeCount","value","subscribe","refreshRecipesCounters","mesRepas","getElementById","firstElementChild","parentNode","setAttribute","newCounter","initCounter","recipesCount","innerHTML","counters","counter","remove","GenericPage","routeWrapper","buttonList","_routeWrapper","_domFragment","createRange","createContextualFragment","_buttonList","_initButtonListeners","foreach","button","_bindOrHideButton","domButton","doesRouteExists","route","navigate","_isCounterParentElem","injectPageFragment","placeholderClass","RecapPage","homeRoute","basketRoute","header","footer","super","_header","_footer","_homeRoute","_basketRoute","_initBasketSubscription","_refreshRecipeRecapFragmentView","previewBlockHeader","leftHeader","rightCardStats","removeAllButton","_setFillState","_setEmptyState","nbOfMeals","confirmOrderButton","continueButton","reset","pagePlaceHolder","nextSibling","ComparisonItem","basketWrapper","_basketWrapper","retailerQuantity","_retailerProducts","retailerProduct","quantity","reduce","a","b","parseInt","clearRetailerProduct","miamBasketEntryIdsToStr","res","Object","keys","miamBasketEntryIds","beId","qty","firstBasketEntryId","removeFirstMiamEntry","qtyToRemove","firstKey","addOrUpdateRetailerProduct","createRetailerProducts","basketEntry","targetQuantity","selectedItem","mapProductToEntry","updateRetailerProducts","quantityDiff","miamTargetQuantity","miamQuantity","item","ComparisonMap","retailerBasket","miamBasket","comparisonItemType","_comparisonItemType","addEntryInMapFromRetailer","_setFromMiam","_fetchComparisonItem","extId","compItem","_extIdToComparisonItem","cleanNullProducts","updateMapFromRetailer","deleteEntrieInMapFromRetailer","retailerEntrie","checkIfEntryIsToDeleteFromMap","find","resolveFromRetailer","toRemoveFromMiam","quantityDelta","getQuantityToRemove","stillToRemove","quantityRemoved","push","setTargetFromMiam","_updateTargetFromMiam","_addTargetFromMiam","resolveFromMiam","toPushToRetailer","createOrUpdate","itemsToPush","be","miamBasketEntries","quantities","BasketsComparator","existingRetailerBasket","firstMiamBasket","comparisonMapClass","isProcessingRetailerEvent","_comparisonMap","sendUpdateToMiam","updateReceivedFromMiam","sendUpdateToRetailer","updateReceivedFromRetailer","entriesToRemove","removeEntries","itemsToAdd","pushProductsToBasket","mapEntryToProduct","RoutingWrapper","Error","onRoutingEvent","callBack","BasketWrapper","hasPayment","paymentTotal","listenToRetailerBasket","retailerBasketChangeCallBack","getBasketProducts","retailerProducts","injectEntry","ChronodriveUserWrapper","UserWrapper","analyticsAllowed","profilingAllowed","isUserLogged","getUserId","matcher","cookie","match","getUserPwd","interceptUserPwd","oldXHRSend","XMLHttpRequest","prototype","send","data","_loadEvent","responseURL","pwd","setItem","console","debug","apply","arguments","getAuthToken","callback","wrapper","req","params","_event","responseText","open","setRequestHeader","ChronodriveStoreWrapper","StoreWrapper","setPos","posExtId","getPosExtId","invalidPosCallback","isAvailable","user","device","matchMedia","matches","availableOnShelf","ChronodriveCardInjectorWrapper","basketProductIds","onHideCard","detectCardsContainer","prevItemPerLine","contextElements","element","actionsElement","getAttribute","ChronodriveRoutingWrapper","ChronodriveRecipeTagWrapper","RecipeTagWrapper","recipeDetailPreviewAllowed","tagPlaceholders","tagContainer","itemExtId","recipeTagElement","environment","supplierId","analyticsKey","apiHost","oldXHROpen","method","url","env","userWrapper","storeWrapper","CoreInitializer","confirmationUrl","basketsComparatorClass","_comparatorClass","_firstMiamBasketReceived","initBasketProcess","handlePayment","handleBasketSync","listenForConfirmation","basketHandler","previousUrl","checkAndSendEvent","body","includes","total","paymentStarted","token","sendMiamOrder","confirmBasket","supplier","notifyBasketUpdated","confirm","totalPrice","listenToRetailer","listenToMiam","entries$","_comparator","itemElems","basketProducts","elem","cugContainer","qtyContainer","textContent","products","p","join","_refreshCartDisplay","entry","page","newCartMenu","existingCartMenu","replaceChild","newMiniCart","existingMiniCart","accountMenu","entryLink","overlay","evObj","createEvent","initEvent","dispatchEvent","contentContainer","firstChild","RecipeTagsInjector"],"mappings":"4OAAO,MAAMA,EAUX,WAAAC,CAAYC,EAAWC,EAAaC,GAAa,GATjDC,EAAAC,KAAA,gBACAD,EAAAC,KAAA,gBAAe,GACfD,EAAAC,KAAA,wBAQEA,KAAKC,aAAeJ,EACpBG,KAAKE,qBACLF,KAAKG,yBAAyBP,GAI1BE,GACFE,KAAKI,wBAAwBR,EAEjC,CAQA,wBAAAO,CAAyBE,GAEvBL,KAAKM,qBAAuB,IAAIC,iBAC9BP,KAAKQ,oBAAoBC,KAAKT,OAEhCA,KAAKM,qBAAqBI,QAAQL,EAJb,CAAEM,YAAY,EAAOC,WAAW,EAAMC,SAAS,IAKpEb,KAAKQ,sBACLR,KAAKc,cAAe,CAEtB,CAEA,mBAAAC,GACEf,KAAKM,qBAAqBU,YAC5B,CAKA,mBAAAR,GACE,MAAMS,EAAcjB,KAAKkB,kBACpBlB,KAAKmB,YAAYF,IAItBjB,KAAKoB,cAAcH,EACrB,CAMA,WAAAE,CAAYF,GACV,OAAOA,GAAaI,QAAU,CAChC,CAKA,eAAAH,GACE,OAAOI,MAAMC,KAAKC,SAASC,uBAAuB,kBACpD,CASA,kBAAAC,GAEEC,aAAaC,WAAW,uBAExB,MAAMC,EAAkBC,eAAeC,QAAQ,yBAI/C,GAAsB,MAAnBF,GAA2BA,GAAmBG,OAAOC,SAASC,KAG/D,OAFAJ,eAAeF,WAAW,yBAC1BE,eAAeF,WAAW,uBACnB,KAGT,MAAMO,EAAeC,KAAKC,MACxBP,eAAeC,QAAQ,wBAIzB,OAAK/B,KAAKc,cAAiBqB,GAAkBnC,KAAKC,aAAaqC,0BAM/DR,eAAeF,WAAW,uBAC1BE,eAAeF,WAAW,yBACnBO,GAPE,IAQX,CAMA,aAAAf,CAAcH,GACZA,EAAYsB,QAAQ,CAACC,EAAGC,KACtBzC,KAAK0C,aAAazB,EAAawB,IAEnC,CASA,SAAAE,CAAU1B,EAAawB,GACrB,MAAMG,EAAU5C,KAAK6C,WAAW5B,EAAawB,GACvCK,EAAiBF,EAAQE,eACzBC,EAAWvB,SAASwB,cAAc,yBAWxC,OAVIF,EACFC,EAASE,SAAWH,EAEpBF,EACKG,EAASG,WAAaN,EAAQO,iBAAmBP,EAAQO,iBAAiBC,IAAIC,IAAA,CAAQC,GAAID,KAAQT,EAClGG,EAASQ,kBAAmB,EAEnCR,EAASS,WAAaxD,KAAKC,aAAawD,iBACxCV,EAASW,eAAiB1D,KAAKC,aAAa0D,oBAC5CZ,EAASa,UAAYhB,EAAQgB,UACtBb,CACT,CAMA,YAAAL,CAAazB,EAAawB,GACxB,MAAMM,EAAW/C,KAAK2C,UAAU1B,EAAawB,GACzCM,IACF/C,KAAK6D,YAAY5C,EAAawB,EAAOM,GACrCA,EAASe,iBAAiB,OAAQ,KAEhCf,EAASgB,cAAcC,MAAMC,QAAU,SAG7C,CAKA,kBAAA/D,GACE,MAAMgE,EAAS1C,SAAS2C,cAAc,gCACgB,IAAlDnE,KAAKC,aAAamE,8BACpBF,EAAOG,qBAAuBrE,KAAKC,aAAamE,4BAEpD,CASA,UAAAvB,CAAW5B,EAAawB,GACtB,MAAMG,EAAUR,KAAKC,MAAMpB,EAAYwB,GAAO6B,QAAQ1B,SAGtD,OAFAA,EAAQgB,UAAY3C,EAAYwB,GAAO6B,QAAQV,UAExChB,CACT,CAMA,cAAA2B,CAAe3B,GACb,OACEA,GAASO,kBAAkB9B,OAAS,GACpCuB,EAAQ4B,oBAAoBnD,OAAS,GACrCuB,EAAQ6B,mBAAmBpD,OAAS,GACpCuB,EAAQvB,MAEZ,CAQA,WAAAwC,CAAY5C,EAAawB,EAAOM,GAC9B9B,EAAYwB,GAAOiC,YAAY3B,EACjC,CAEA,uBAAA3C,CAAwBR,GACtB,MAAM+E,EAAY3E,KAAKC,aAAa2E,8BAC9BC,EAAWvD,MAAMC,KAAK3B,EAAUkF,UAItCH,EAAUI,OAAOC,GAAOA,EAAM,GAAGzC,QAAQ0C,IACvC,IAAIC,EAAgB1D,SAASwB,cAAc,OAC3CkC,EAAcC,UAAUC,IAAI,2BAC5BpF,KAAKC,aAAaoF,0BAA0B9C,QAAQ+C,IAClDJ,EAAcC,UAAUC,IAAIE,KAG9B,IAAIC,EAAkB/D,SAASwB,cAAc,OAC7CuC,EAAgBJ,UAAUC,IAAI,kBAC9BF,EAAcM,YAAYD,GAG1B,MAAME,EAAWzF,KAAKC,aAAayF,eAAeb,EAASc,MAAMV,EAAW,EAAGA,EAAW,IAE1FM,EAAgBjB,QAAQ1B,QAAUR,KAAKwD,UAAU,CAAEzC,iBAAkBsC,IACrEF,EAAgBjB,QAAQV,UAAYqB,EAASY,WAE7CjG,EAAUkG,aAAaZ,EAAeL,EAASI,KAEnD,EClMK,MAAMc,EASX,WAAApG,EAAYqG,SAACA,EAAW,KAAAC,eAAMA,EAAgB,MAAQ,IACpDF,EAAcG,2BAA2BlE,OAAOmE,MAAMC,OAAOC,eAAeC,MAAON,EAAUC,GAC7FjE,OAAOmE,MAAMC,OAAOC,cAAcE,UAAWF,GAAgBN,EAAcS,uBAAuBH,GACpG,CAUC,iCAAOH,CAA4BG,EAAc,EAAGL,EAAW,KAAMC,EAAiB,MACrF,IAAIQ,EAAWjF,SAASkF,eAAe,gBAEvC,KAAKD,GAAgBT,GAAYC,GAAiB,OAE/CD,GAAYC,IAEbQ,EAAWT,GAAUW,kBAAoBX,EAASW,kBAAoBX,EACtEC,EAAeW,WAAWd,aAAaE,EAAUC,IAGlDQ,EAASzC,MAAMiB,SAAW,WAE1BwB,EAASI,aAAa,KAAM,oBAC5B,MAAMC,EAAaf,EAAcgB,YAAYV,GAC7CI,EAASjB,YAAYsB,EACxB,CAQC,kBAAOC,CAAYC,EAAe,GAEjC,MAAMF,EAAatF,SAASwB,cAAc,QAO1C,OALoB,GAAhBgE,GAAmBF,EAAW3B,UAAUC,IAAI,eAEhD0B,EAAW3B,UAAUC,IAAI,uBACzB0B,EAAWG,UAAYD,EAEhBF,CACT,CASC,6BAAON,CAAuBQ,EAAe,GAE5C,MAAME,EAAW1F,SAASC,uBAAuB,uBACjD,GAAKyF,GAAgC,IAApBA,EAAS7F,OAE1B,IAAA,IAAS8F,KAAWD,EAClBC,EAAQF,UAAYD,EACJ,GAAhBA,EAAoBG,EAAQhC,UAAUC,IAAI,eAAiB+B,EAAQhC,UAAUiC,OAAO,cAExF,EC1GK,MAAMC,EAUX,WAAA1H,CAAY2H,EAActB,EAAUuB,EAAa,MATjDxH,EAAAC,KAAA,eACAD,EAAAC,KAAA,gBACAD,EAAAC,KAAA,iBAQEA,KAAKwH,cAAgBF,EACrBtH,KAAKyH,aAAejG,SACjBkG,cACAC,yBAAyB3B,GAC5BhG,KAAK4H,YAAcL,EACnBvH,KAAK6H,sBACP,CASA,oBAAAA,GAC0B,MAApB7H,KAAK4H,aACT5H,KAAK4H,YAAYE,QAASC,IACxB/H,KAAKgI,kBAAkBD,IAE3B,CAOA,iBAAAC,CAAkBD,GAChB,MAAME,EAAYzG,SAASkF,eAAeqB,EAAOzE,IAC5C2E,IACDjI,KAAKwH,cAAcU,gBAAgBH,EAAOI,QAC5CJ,EAAOjE,iBACL,QACA,KACE9D,KAAKwH,cAAcY,SAASL,EAAOI,SAErC,GAEEnI,KAAKqI,qBAAqBN,IAC5BE,EAAUzC,YACRO,EAAcgB,YAAY/E,OAAOmE,MAAMC,OAAOC,eAAeC,SAIjE2B,EAAUjE,MAAMC,QAAU,OAE9B,CAMC,oBAAAoE,CAAqBN,GACpB,MAAwB,cAAjBA,EAAOI,KAChB,CAKA,kBAAAG,CAAmBC,GACbA,GACFA,EAAiB7D,YAAY1E,KAAKyH,aAEtC,ECXK,MAAMe,UAAkBnB,EAW7B,WAAA1H,CACE2H,EACAmB,EACAC,GACAnB,WAAEA,EAAa,KAAAoB,OAAMA,EAAS,KAAAC,OAAMA,EAAS,MAAS,MAEtDC,MAAMvB,EAxEY,sgEAwEiBC,GAhBrCxH,EAAAC,KAAA,cACAD,EAAAC,KAAA,gBACAD,EAAAC,KAAA,WACAD,EAAAC,KAAA,WAcEA,KAAK8I,QAAUH,EACf3I,KAAK+I,QAAUH,EACf5I,KAAKgJ,WAAaP,EAClBzI,KAAKiJ,aAAeP,EACpB1I,KAAKkJ,yBACP,CAKA,uBAAAA,GACElH,OAAOmE,MAAMC,OAAOC,cAAcE,UAAWF,IAC3CrG,KAAKmJ,gCAAgC9C,IAEzC,CAMA,+BAAA8C,CAAgC9C,GAC9B,IACGrG,KAAKyH,cAAcd,mBAAmBlF,uBACrC,oCAGF,OACF,MAAM2H,EACJpJ,KAAKyH,aAAaf,eAAe,sBAC7B2C,EAAarJ,KAAKyH,aAAaf,eAAe,uBAC9C4C,EAAiBtJ,KAAKyH,aAAaf,eAAe,kBAClD6C,EAAkBvJ,KAAKyH,aAAaf,eAAe,mBAErDL,EAAc,EAChBrG,KAAKwJ,cACHnD,EACA+C,EACAG,EACAF,EACAC,GAGFtJ,KAAKyJ,eACHL,EACAG,EACAF,EACAC,EAGN,CAUA,aAAAE,CACEnD,EACA+C,EACAG,EACAF,EACAC,GAEA,MAAMI,EAAY1J,KAAKyH,aAAaf,eAAe,aAEnD0C,EAAmBjE,UAAUiC,OAAO,eACpCmC,EAAgBpE,UAAUiC,OAAO,UAEjCiC,EAAWpC,UAAY,+BACvByC,EAAUzC,UAAYZ,EACtBiD,EAAerC,UAAY,GAAGZ,SAChC,CASA,cAAAoD,CACEL,EACAG,EACAF,EACAC,GAEAF,EAAmBjE,UAAUC,IAAI,eACjCmE,EAAgBpE,UAAUC,IAAI,eAC9BiE,EAAWpC,UAAY,YACvBqC,EAAerC,UAAY,qBAC7B,CAKA,oBAAAY,GACEgB,MAAMhB,uBACN,MAAM8B,EACJ3J,KAAKyH,aAAaf,eAAe,sBAC7BkD,EAAiB5J,KAAKyH,aAAaf,eAAe,kBAClD6C,EAAkBvJ,KAAKyH,aAAaf,eAAe,mBACzDiD,EAAmB7F,iBACjB,QACA,KACE9D,KAAKwH,cAAcY,SAASpI,KAAKiJ,cAAcxI,KAAKT,QAEtD,GAEF4J,EAAe9F,iBACb,QACA,KACE9D,KAAKwH,cAAcY,SAASpI,KAAKgJ,YAAYvI,KAAKT,QAEpD,GAEFuJ,EAAgBzF,iBACd,QACA,KACE9B,OAAOmE,MAAMC,OAAOyD,UAEtB,EAEJ,CAMA,kBAAAvB,CAAmBwB,GACZA,IACL9J,KAAKmJ,gCAAgCnH,OAAOmE,MAAMC,OAAOC,eACzDrG,KAAK6H,uBACD7H,KAAK8I,SACPgB,EAAgB/F,cAAc+B,aAAa9F,KAAK8I,QAASgB,GACvD9J,KAAK+I,SACPe,EAAgB/F,cAAc+B,aAC5B9F,KAAK+I,QACLe,EAAgBC,aAEpBD,EAAgBpF,YAAY1E,KAAKyH,cACnC,EC9NK,MAAMuC,EAOX,WAAArK,CAAYsK,GANZlK,EAAAC,KAAA,eAAe,GACfD,EAAAC,KAAA,qBAAqB,GACrBD,EAAAC,KAAA,qBAAqB,CAAA,GACrBD,EAAAC,KAAA,oBAAoB,IACpBD,EAAAC,KAAA,kBAGEA,KAAKkK,eAAiBD,CACxB,CAEA,oBAAIE,GAGF,OAFmBnK,KAAKoK,kBAAkBhH,IAAIiH,GAAmBA,EAAgBC,UAE/DC,OAAO,CAACC,EAAEC,IAAMC,SAASF,GAAKE,SAASD,GAAI,EAE/D,CAGA,oBAAAE,GACE3K,KAAKoK,kBAAoB,EAC3B,CAGA,2BAAIQ,GACF,IAAIC,EAAM,GAKV,OAJAC,OAAOC,KAAK/K,KAAKgL,oBAAoBzI,QAAQ0I,IAC3C,MAAMC,EAAMlL,KAAKgL,mBAAmBC,GACpCJ,GAAO,GAAGI,MAASC,QAEdL,CACT,CAEA,sBAAIM,GACF,OAAOL,OAAOC,KAAK/K,KAAKgL,oBAAoB,EAC9C,CAEA,oBAAAI,CAAqBC,GACnB,MAAMC,EAAWR,OAAOC,KAAK/K,KAAKgL,oBAAoB,GACtD,IAAIV,EAAWtK,KAAKgL,mBAAmBM,GACvC,OAAIhB,EAAYe,GACdrL,KAAKgL,mBAAmBM,GAAYhB,EAAWe,EACxC,CAACC,EAAUD,YAEXrL,KAAKgL,mBAAmBM,GACxB,CAACA,EAAUhB,GAEtB,CAYA,0BAAAiB,CAA2BlB,GACvB,GAAsC,IAAlCrK,KAAKoK,kBAAkB/I,QAA0C,IAA1BrB,KAAKmK,iBAE9C,YADAnK,KAAKoK,kBAAoB,CAACC,IAGIrK,KAAKoK,kBAAkB,GAC/BE,SAAWD,EAAgBC,QAGvD,CAOA,sBAAAkB,CAAuBC,EAAaC,GAIlC,OAHID,EAAYE,eACd3L,KAAKoK,kBAAoB,CAACpK,KAAKkK,eAAe0B,kBAAkBH,EAAYE,aAAahL,WAAY+K,KAEhG1L,KAAKoK,iBACd,CAKA,sBAAAyB,GACE,MAAMC,EAAe9L,KAAK+L,mBAAqB/L,KAAKgM,aACpD,GAAqB,IAAjBF,GAAwD,IAAlC9L,KAAKoK,kBAAkB/I,OAC/C,MAAO,GAEJ,IAAI4K,EAAOjM,KAAKoK,kBAAkB,GAOrC,OALA6B,EAAK3B,UAAYwB,EACbG,EAAK3B,UAAY,GAEnBtK,KAAK2K,uBAEA,CAACsB,EACZ,EC9FK,MAAMC,EAWX,WAAAvM,CACEsK,EACAkC,EACAC,EACAC,EAAqBrC,GAdvBjK,EAAAC,KAAA,yBAAyB,CAAA,GACzBD,EAAAC,KAAA,uBACAD,EAAAC,KAAA,kBAcEA,KAAKsM,oBAAsBD,EAC3BrM,KAAKkK,eAAiBD,EACtBjK,KAAKuM,0BAA0BJ,GAC/BnM,KAAKwM,aAAaJ,EACpB,CAOA,oBAAAK,CAAqBC,GACnB,IAAIC,EAAW3M,KAAK4M,uBAAuBF,GAK3C,OAJKC,IACHA,EAAW,IAAI3M,KAAKsM,oBAAoBtM,KAAKkK,gBAC7ClK,KAAK4M,uBAAuBF,GAASC,GAEhCA,CACT,CAKA,iBAAAE,GACE/B,OAAOC,KAAK/K,KAAK4M,wBAAwBrK,QAASmK,IAChD,MAAMC,EAAW3M,KAAK4M,uBAAuBF,GACf,IAA1BC,EAASX,cAAoD,IAA9BW,EAASxC,yBACnCnK,KAAK4M,uBAAuBF,IAGzC,CAUA,qBAAAI,CAAsBX,GACpBnM,KAAKuM,0BAA0BJ,GAC/BnM,KAAK+M,8BAA8BZ,EACrC,CAMA,yBAAAI,CAA0BJ,GACxBA,EAAe5J,QAASyK,IACLhN,KAAKyM,qBAAqBO,EAAe1J,IACjDiI,2BAA2ByB,IAExC,CAMA,6BAAAD,CAA8BZ,GAC5BrB,OAAOC,KAAK/K,KAAK4M,wBAAwBrK,QAASmK,IAChD1M,KAAKiN,8BAA8BP,EAAOP,IAE9C,CAQA,6BAAAc,CAA8BP,EAAOP,GACnC,MAAMQ,EAAW3M,KAAK4M,uBAAuBF,GAChBP,EAAee,KACzCF,GAAmBA,EAAe1J,KAAOoJ,IAG1CC,EAAShC,sBAEb,CAMC,mBAAAwC,GACC,IAAIC,EAAmB,GASvB,OARAtC,OAAOC,KAAK/K,KAAK4M,wBAAwBrK,QAASmK,IAChD,MAAMC,EAAW3M,KAAK4M,uBAAuBF,GACvCW,EAAgBV,EAASX,aAAeW,EAASxC,iBACnDkD,EAAgB,IAClBD,EAAmB,IAAIA,KAAsBpN,KAAKsN,oBAAoBX,EAAUU,IAChFV,EAASX,aAAeW,EAASxC,oBAG9BiD,CACT,CAUA,mBAAAE,CAAoBX,EAAUY,GAC5B,MAAMH,EAAmB,GACzB,KAAMG,EAAgB,GAAG,CACvB,IAAItC,EACAuC,GACHvC,EAAMuC,GAAmBb,EAASvB,qBAAqBmC,GAC5C,MAARtC,GAAwC,MAAnBuC,EACvBD,EAAgB,GAEhBA,GAAiBC,EACjBJ,EAAiBK,KAAK,CAAEnK,GAAI2H,EAAMC,IAAKsC,IAE3C,CACA,OAAOJ,CACT,CAUA,iBAAAM,CAAkBtB,GAIhBpM,KAAK2N,sBAAsBvB,GAE3BpM,KAAK4N,mBAAmBxB,EAC1B,CAOA,eAAAyB,CAAgBzB,GAEd,IAAI0B,EAAmB,GAOvB,OANAhD,OAAOC,KAAK/K,KAAK4M,wBAAwBrK,QAASmK,IAChDoB,EAAmB,IACdA,KACA9N,KAAK+N,eAAerB,EAAON,MAG3B0B,CACT,CAKA,cAAAC,CAAerB,EAAON,GACpB,MAAMO,EAAW3M,KAAK4M,uBAAuBF,GAC7C,IAAIsB,EACJ,GAAkC,IAA9BrB,EAASxC,kBAA0D,IAAhCwC,EAASZ,mBAA0B,CAIxE,MAAMN,EAAcW,EAAWc,KAC5Be,GAAOA,EAAG3K,IAAMqJ,EAASxB,oBAE5B6C,EAAcrB,EAASnB,uBACrBC,EACAkB,EAASZ,mBAEb,MACEiC,EAAcrB,EAASd,yBAGzB,OADAc,EAASX,aAAeW,EAASZ,mBAC1BiC,CACT,CAEA,YAAAxB,CAAaJ,GACXA,EAAW7J,QAASkJ,IAElB,MAAMiB,EACJjB,EAAYE,cACZF,EAAYE,aAAahL,WAAW,UACtC,IAAK+L,EACH,OAEF,MAAMC,EAAW3M,KAAKyM,qBAAqBC,GAE3CC,EAASX,cAAgBP,EAAY9K,WAAW2J,SAChDqC,EAAS3B,mBAAmBS,EAAYnI,IACtCmI,EAAY9K,WAAW2J,UAE7B,CAGA,qBAAAqD,CAAsBvB,GACpBtB,OAAOC,KAAK/K,KAAK4M,wBAAwBrK,QAASmK,IAChD,MAAMC,EAAW3M,KAAK4M,uBAAuBF,GAEvCwB,EAAoB9B,EAAWrH,OAAQ0G,GAEzCA,EAAYE,cACZF,EAAYE,aAAahL,WAAW,YAAc+L,GAGtD,GAAIwB,EAAkB7M,OAAS,EAAG,CAChC,MAAM8M,EAAaD,EAAkB9K,IAClC6K,GAAOA,EAAGtN,WAAW2J,UAExBqC,EAASZ,mBAAqBoC,EAAW5D,OACvC,CAACC,EAAGC,IAAMC,SAASF,GAAKE,SAASD,GACjC,GAEFkC,EAAS3B,mBAAqBkD,EAAkB3D,OAAO,SACrDnH,EACA6K,GAGA,OADA7K,EAAI6K,EAAG3K,IAAMoH,SAASuD,EAAGtN,WAAW2J,UAC7BlH,CACT,EACA,GACF,MACEuJ,EAASZ,mBAAqB,EAC9BY,EAAS3B,mBAAqB,CAAA,GAGpC,CAGA,kBAAA4C,CAAmBxB,GAEjBA,EAAW7J,QAASkJ,IAElB,MAAMiB,EACJjB,EAAYE,cACZF,EAAYE,aAAahL,WAAW,UACtC,IAAK+L,EACH,OAEF,GAAI1M,KAAK4M,uBAAuBF,GAC9B,OAEF,MAAMC,EAAW3M,KAAKyM,qBAAqBC,GAE3CC,EAASZ,oBAAsBN,EAAY9K,WAAW2J,SACtDqC,EAAS3B,mBAAmBS,EAAYnI,IACtCmI,EAAY9K,WAAW2J,UAE7B,EC/QK,MAAM8D,EAYX,WAAAzO,CAAYsK,EAAeoE,EAAwBC,EAAkBC,EAAqBrC,GAV1FnM,EAAAC,KAAA,kBACAD,EAAAC,KAAA,kBACAD,EAAAC,KAAA,6BASEA,KAAKwO,2BAA4B,EACjCxO,KAAKkK,eAAiBD,EACtBjK,KAAKyO,eAAiB,IAAIF,EAAmBtE,EAAeoE,EAAwBC,GACpF,MAAMlB,EAAmBpN,KAAKyO,eAAetB,sBAC7CnN,KAAK0O,iBAAiBtB,EACxB,CAMA,sBAAAuB,CAAuBvI,GACrBpG,KAAKyO,eAAef,kBAAkBtH,GACtC,MAAM0H,EAAmB9N,KAAKyO,eAAeZ,gBAAgBzH,GAC7DpG,KAAKyO,eAAe5B,oBACpB7M,KAAK4O,qBAAqBd,EAC5B,CAMA,0BAAAe,CAA2B1C,GACzBnM,KAAKwO,2BAA4B,EACjCxO,KAAKyO,eAAe3B,sBAAsBX,GAC1C,MAAMiB,EAAmBpN,KAAKyO,eAAetB,sBAC7CnN,KAAKyO,eAAe5B,oBACpB7M,KAAK0O,iBAAiBtB,EACxB,CAOA,gBAAAsB,CAAiBI,GAEgB,IAA3BA,EAAgBzN,OAKpBW,OAAOmE,MAAMC,OAAO2I,cAAcD,GAAiBvI,UAAU,KAE3DvG,KAAKwO,2BAA4B,IALjCxO,KAAKwO,2BAA4B,CAOrC,CAOA,oBAAAI,CAAqBI,GAEO,IAAtBA,EAAW3N,QAGfrB,KAAKkK,eAAe+E,qBAAqBD,EAAW5L,IAAI6I,GAC/CjM,KAAKkK,eAAegF,kBAAkBjD,IAEjD,EC/EK,MAAMkD,EAET,WAAAxP,GAAgB,CAOhB,eAAAuI,CAAgBC,GACZ,MAAM,IAAIiH,MAAM,yDACpB,CAOA,QAAAhH,CAASD,GACL,MAAM,IAAIiH,MAAM,kDACpB,CAUA,cAAAC,CAAeC,GACf,EC/BG,MAAMC,EAKX,UAAAC,GACE,MAAM,IAAIJ,MAAM,oDAClB,CAMA,YAAAK,GACE,MAAM,IAAIL,MAAM,sDAClB,CAQC,sBAAAM,CAAuBC,GACrB,MAAM,IAAIP,MAAM,gEAClB,CAKA,iBAAAQ,GACE,MAAM,IAAIR,MAAM,2DAClB,CAOA,oBAAAH,CAAqBY,GACnB,MAAM,IAAIT,MAAM,8DAClB,CAQD,iBAAAF,CAAkBY,GAChB,MAAM,IAAIV,MAAM,2DAClB,CAQA,iBAAAxD,CAAkBvB,GAChB,MAAM,IAAI+E,MAAM,2DAClB,EC5DK,MAAMW,UAA+BC,EAE1C,gBAAAC,GACE,OAAO,CACT,CAGA,gBAAAC,GACE,OAAO,CACT,CAEA,YAAAC,GACE,QAASnQ,KAAKoQ,WAChB,CAEA,SAAAA,GACE,MAAMC,EAAU7O,SAAS8O,OAAOC,MAAM,iCACtC,OAAOF,GAAWA,EAAQ,EAC5B,CAEA,UAAAG,GACE,OAAO7O,aAAaI,QAAQ,gBAC9B,CAGA,gBAAA0O,GACE,IAAIC,EAAa1O,OAAO2O,eAAeC,UAAUC,KAEjD7O,OAAO2O,eAAeC,UAAUC,KAAO,SAAUC,GAW/C,OAVA9Q,KAAK8D,iBAAiB,OACpB,SAAUiN,GACR,GAAI/Q,KAAKgR,YAAYT,MAAM,mCAAoC,CAC7D,MAAMU,EAAMH,EAAKP,MAAM,mBAAmB,GAC1C5O,aAAauP,QAAQ,gBAAiBD,GACtCE,QAAQC,MAAM,wBAChB,CACF,GAGKV,EAAWW,MAAMrR,KAAMsR,UAChC,CACF,CAGA,mBAAOC,CAAaC,GAElB,MAAMC,EAAU,IAAI1B,EACdzM,EAAKmO,EAAQrB,YACba,EAAMQ,EAAQjB,aAEpB,IAAKlN,IAAO2N,EAGV,OAFAE,QAAQC,MAAM,yDACdzP,aAAaC,WAAW,iBACjB4P,EAAS,MAGlB,IAAIE,EAAM,IAAIf,eACd,MAAMgB,EAAS,iBAAiBrO,cAAe2N,IAS/C,OAPAS,EAAI5N,iBAAiB,OAAQ,SAAS8N,GAEpCJ,EAASpP,KAAKC,MAAMrC,KAAK6R,cAAqB,MAChD,GACAH,EAAII,KAAK,OAAQ,+CAA+C,GAChEJ,EAAIK,iBAAiB,eAAgB,qCAE9BL,EAAIb,KAAKc,EAClB,ECnEK,MAAMK,UAAgCC,EAE3C,MAAAC,CAAOC,GAEP,CAEA,WAAAC,GACE,MAAM/B,EAAU7O,SAAS8O,OAAOC,MAAM,mCACtC,OAAOF,GAAWA,EAAQ,EAC5B,CAGA,kBAAAgC,GACE,MAAM,IAAIjD,MACR,4DAEJ,CAEA,WAAAkD,GACE,OAAOtQ,OAAOmE,MAAMoM,KAAKC,OAAOC,WAAW,uBAAuBC,OACpE,CAGA,gBAAAC,GACE,QAASnR,SAASkF,eAAe,kBACnC,EC3BK,MAAMkM,EAEX,WAAAjT,GAAc,CAGd,gBAAAkT,GACE,MAAO,EACT,CAOA,UAAAC,CAAW/P,GACT,MAAM,IAAIqM,MAAM,oDAClB,CAKA,yBAAAhL,GAEA,CAEA,cAAAX,GACE,MAAO,qBACT,CAGA,oBAAAsP,GACE,OAAOvR,SAASkF,eAAe,kBACjC,CAEA,2BAAA9B,GACE,OAA+B,IAA3B5C,OAAOgR,gBACF,CAAC,EAAG,EAAG,GAAI,IACa,IAA3BhR,OAAOgR,gBACJ,CAAC,EAAG,EAAG,GAAI,IACa,IAA3BhR,OAAOgR,gBACJ,CAAC,EAAG,GAAI,GAAI,IAEZ,CAAC,EAAG,EAAG,GAAI,GAEtB,CAEA,uBAAA3N,GACE,MAAO,CAAC,OAAQ,eAClB,CAIA,cAAAK,CAAeuN,GACb,OAAOA,EAAgB7P,IAAI8P,IACzB,MAAMC,EAAiBD,GAASzR,uBAAuB,iBAAmByR,EAAQzR,uBAAuB,gBAAgB,GACzH,OAAO0R,GAAgBC,aAAa,cACnCrO,OAAOzB,KAAQA,EACpB,ECvDK,MAAM+P,UAAkClE,EAM7C,eAAAjH,CAAgBC,GACZ,MAAM,IAAIiH,MAAM,yDACpB,CAOA,QAAAhH,CAASD,GACPnG,OAAOC,SAASC,KAAOiG,CACzB,CAUA,cAAAkH,CAAeC,GACf,EC5BK,MAAMgE,UAAoCC,EAC/C,WAAA5T,CAAY6T,GAA6B,GACvC3K,MAAM2K,EACR,CAEA,eAAAC,GAWE,MATA,IADcjS,SAASC,uBAAuB,SACnCc,QAAQ0J,IACjB,GAAuE,GAAnEA,EAAKxK,uBAAuB,6BAA6BJ,OAAa,CACxE,MAAMqS,EAAelS,SAASkG,cAAcC,yBAC1C,gGAEFsE,EAAKzG,YAAYkO,GACjBzH,EAAKxK,uBAAuB,gBAAgB,GAAGuC,MAAQ,0BACzD,IAEKxC,SAASC,uBAAuB,8BACzC,CAEA,SAAAkS,CAAUC,GACR,OAAOA,EAAiB7P,cAAcA,cAActC,uBAAuB,gBAAgB,GAAG2R,aAAa,WAC7G,ECtBK,MAAMS,EAUF,CACLC,WAAY,IACZC,aAAc,IACdC,QAAS,6BCCf,IAAIC,EAAajS,OAAO2O,eAAeC,UAAUkB,KACjD9P,OAAO2O,eAAeC,UAAUkB,KAAO,SAAUoC,EAAQC,EAAKrD,GAC5D,GAAIqD,EAAI5D,MAAM6D,EAAIJ,SAAU,CAC1B,IAAItC,EAAMuC,EAAW5C,MAAMrR,KAAMsR,WAEjC,OADAtR,KAAK+R,iBAAiB,eAAgB,4BAC/BL,CACT,CACE,OAAOuC,EAAW5C,MAAMrR,KAAMsR,UAElC,EAEA,MAAM+C,EAAc,IAAItE,EAClBuE,EAAe,IAAItC,EAezB,GAdA,IAAIuC,EAAgBH,EAAIN,WAAYO,EAAaC,EAAcF,EAAIL,cAOnEM,EAAY5D,mBACZ,IC/BO,MAWL,WAAA9Q,CAAYsK,EAAeuK,EAAkB,KAAMC,EAAyBrG,GAT5ErO,EAAAC,KAAA,4BACAD,EAAAC,KAAA,oBACAD,EAAAC,KAAA,eACAD,EAAAC,KAAA,kBAOEA,KAAKkK,eAAiBD,EACtBjK,KAAK0U,iBAAmBD,EACxBzU,KAAK2U,0BAA2B,EAChC3U,KAAK4U,kBAAkBJ,EACzB,CAEA,iBAAAI,CAAkBJ,GAChBxU,KAAK6U,cAAc,KACjB7U,KAAK8U,qBAEJN,GACDxU,KAAK+U,sBAAsBP,EAE/B,CAEA,qBAAAO,CAAsBP,GACpB,MAAMQ,EAAgBhV,KAEtB,IAAIiV,EAAcD,EAAcE,uBAAkB,EAAWV,GAC9C,IAAIjU,iBAAiB,WAClC0U,EAAcD,EAAcE,kBAAkBD,EAAaT,EAC7D,GACS9T,QAAQc,SAAS2T,KAAM,CAAExU,YAAY,EAAOC,WAAW,EAAMC,SAAS,GACjF,CAEA,iBAAAqU,CAAkBD,EAAaT,GAC7B,GAAIvS,SAASC,OAAS+S,IACpBA,EAAchT,SAASC,KACpBD,SAASC,KAAKkT,SAASZ,IAAkB,CAC1C,MAAMa,EAAQrV,KAAKkK,eAAeuF,eAClCzN,OAAOmE,MAAMmP,eAAeD,EAC9B,CAEF,OAAOpT,SAASC,IAClB,CAMA,aAAA2S,CAAcrD,GACZ,GAAIxR,KAAKkK,eAAesF,aAAc,CACpC,MAAM6F,EAASrV,KAAKkK,eAAeuF,eAC7B8F,EAAQ5T,aAAaI,QAAQ,qBAC/BwT,GAEF5T,aAAaC,WAAW,qBACxB5B,KAAKwV,cAAcH,EAAOE,GAC1B/D,KAGAxR,KAAKyV,cAAcJ,EAAO7D,EAE9B,MACEA,GAEJ,CAOC,aAAAgE,CAAcH,EAAOE,GAChBA,GAEFvT,OAAOmE,MAAMuP,SAASC,oBAAoBJ,EAAO,OAAQF,EAE7D,CAOA,aAAAI,CAAcJ,EAAO7D,GACnBxP,OAAOmE,MAAMC,OAAOwP,QAAQP,GAAO9O,UAAUH,IAC3C,GAAIA,GAAUA,EAAOmP,OAASnP,EAAOyP,WAAa,EAAG,CAGnD,MAAMN,EAAQnP,EAAOmP,MAErBvT,OAAOmE,MAAMuP,SAASC,oBAAoBJ,EAAO,aACjDvV,KAAKwV,cAAcH,EAAOE,EAC5B,CACA/D,KAEJ,CAKA,gBAAAsE,CAAiBtE,GACfxR,KAAKkK,eAAewF,uBAAuB8B,EAC7C,CAOA,YAAAuE,CAAavE,GACXxP,OAAOmE,MAAMC,OAAO4P,SAASzP,UAAU6F,IAEhCpM,KAAK2U,0BAAkD,IAAtBvI,EAAW/K,OAK/CmQ,EAASpF,GAHTpM,KAAK2U,0BAA2B,GAMtC,CAKA,gBAAAG,GACE9U,KAAK+V,aAAa3J,IAEhB,IAAKpM,KAAKiW,YAAa,CACrB,MAAM5H,EAA0BrO,KAAKkK,eAAe0F,oBAIpD,OAHA5P,KAAKiW,YAAc,IAAIjW,KAAK0U,iBAAkB1U,KAAKkK,eAAgBmE,EAAwBjC,QAE3FpM,KAAK8V,iBAAiB9V,KAAK2P,6BAA6BlP,KAAKT,MAE/D,CACIA,KAAKiW,YAAYzH,2BAKrBxO,KAAKiW,YAAYtH,uBAAuBvC,IAE5C,CAMA,4BAAAuD,CAA6BxD,GAC3BnM,KAAKiW,YAAYpH,2BAA2B1C,EAC9C,GD3HgB,IEhCX,cAAuCoD,EAG5C,UAAAC,GACE,OAAO,CACT,CAGA,sBAAAE,CAAuBC,GACrB,OAAO,IACT,CAGA,iBAAAC,GAEE,MAAMsG,GADK1U,SAASkF,eAAe,iBAAmBlF,SAASkF,eAAe,mBACvDjF,uBAAuB,QAE9C,IAAI0U,EAAiB,GAYrB,OAXA7U,MAAMC,KAAK2U,GAAW3T,QAAQ6T,IAC5B,MAAMC,EAAeD,EAAK3U,uBAAuB,gBAAgB,GAC3D6U,EAAeD,EAAa5U,uBAAuB,cAAc,GACnE4U,GAAgBC,GAClBH,EAAe1I,KAAK,CAClBnK,GAAI+S,EAAajD,aAAa,YAC9B9I,SAAUI,SAAS4L,EAAaC,iBAK/BJ,CACT,CAKA,oBAAAlH,CAAqBuH,GACnBzG,EAAuBwB,aAAagE,IAClC,GAAIA,EAAO,CACT,MAIM5D,EAAS,iBAAiB4D,aAJjB,IAAIxF,GAAyBK,uBAC7B,IAAI4B,GAA0BI,sBAEhCoE,EAASpT,IAAIqT,GAAK,GAAGA,EAAEnT,MAAMmT,EAAEnM,iBAAiBoM,KAAK,OAGlE,IAAIhF,EAAM,IAAIf,eAId,OAHAe,EAAII,KAAK,OAAQ,kDAAkD,GACnEJ,EAAI5N,iBAAiB,OAAQ9D,KAAK2W,qBAClCjF,EAAIK,iBAAiB,eAAgB,qCAC9BL,EAAIb,KAAKc,EAClB,GAEJ,CAIA,iBAAAzC,CAAkB0H,GAChB,OAAOA,CACT,CAIA,iBAAAhL,CAAkBjL,EAAY2J,GAC5B,MAAO,CACLhH,GAAI3C,EAAW,UACf2J,WAEJ,CAIA,mBAAAqM,GACE,IAAIjF,EAAM,IAAIf,eACde,EAAII,KAAK,MAAO7P,SAASC,MAAM,GAC/BwP,EAAI5N,iBAAiB,OAAQ,KAC3B,MAAM+S,EAAOrV,SAASwB,cAAc,OACpC6T,EAAK5P,UAAYjH,KAAK6R,aAEtB,MAAMiF,EAAcD,EAAK1S,cAAc,cACjC4S,EAAmBvV,SAAS2T,KAAKhR,cAAc,cACrD4S,EAAiBnQ,WAAWoQ,aAAaF,EAAaC,GAEtD,MAAME,EAAcJ,EAAK1S,cAAc,oBACjC+S,EAAmB1V,SAAS2T,KAAKhR,cAAc,oBACrD+S,EAAiBtQ,WAAWoQ,aAAaC,EAAaC,KAExDxF,EAAIb,MACN,IFhDEyD,EAAa3B,mBAAoB,CACnC,MAAM9S,EAAc,IAAI+S,EAIxB,IAAIlT,EAFoBG,EAAYkT,uBAEAlT,GAAa,EACnD,CAMA,MAOMsX,EAAc3V,SAASkF,eAAe,YAAYvC,cAAc,MAChEyS,EAAQpV,SAASwB,cAAc,MAC/BoU,EAAY5V,SAASwB,cAAc,KACzCoU,EAAUpT,MAAQ,sCAClB4S,EAAMpR,YAAY4R,GAClBA,EAAUnQ,UAAY,ukKACtBkQ,EAAYrR,aAAa8Q,EAAMO,EAAYrS,SAAS,IAGpD8R,EAAM9S,iBAAiB,QAAS,WAC9B,MAAMuT,EAAU7V,SAASkF,eAAe,YAClC4Q,EAAQ9V,SAAS+V,YAAY,UACnCD,EAAME,UAAU,SAAS,GAAM,GAC/BH,EAAQI,cAAcH,GAGtB,MAAMI,EAAmBlW,SAASkF,eAAe,WACjDgR,EAAiBzQ,UAAY,cACX,IAAIuB,EAAU,IAAI6K,EAA6BrR,OAAOC,SAASC,KAAM,cAAe,IAC5FoG,mBAAmBoP,EAAiBC,WAChD,GAMI3V,OAAOC,SAASC,KAAKkT,SAAS,gBAChC,IAAIwC,EAAmB,IAAItE"}