PageSourceSearch

https://jomoclub.co.uk/cdn/shop/t/3/assets/cart-store.js?v=169171967427512002621717143923

js jomoclub.co.uk collected 2026-10-05 07:06:37 UTC 13,995 bytes, 2 lines download raw bytes

1const{produce,createStore}=window.theme.cart.functions,deDupeItemsInCart=cart=>({...cart,items:cart.items.map(item=>{let newItem;return item.line_level_discount_allocations&&item.line_level_discount_allocations.length>0?newItem={...item,key:`${item.key}${item.line_level_discount_allocations.reduce((discountsString,discount)=>`${discountsString}_discount-${discount.amount}`,"")}`}:newItem=item,newItem})}),fetchCart=async()=>{try{const cart=await(await fetch(`${window.Shopify.routes.root}cart.js`)).json();return deDupeItemsInCart(cart)}catch(e){throw new Error(`Could not update cart: "${e}"`)}},clearCart=async()=>{try{return await(await fetch(`${window.Shopify.routes.root}cart/clear.js`,{method:"POST"})).json()}catch(e){throw new Error(`Could not clear cart: "${e}"`)}},resetFreeShippingAnimation=()=>{window.theme.cart.store.getState().products.total_price===0&&localStorage.removeItem("freeShippingAnimationShown")},initiateStore=()=>{const initialCartDataJson=document.getElementById("cart-data"),initialCartData=initialCartDataJson?JSON.parse(initialCartDataJson.textContent):{},giftWrappingDataJson=document.getElementById("cart-gift-wrapping-data"),giftWrappingData={giftWrapping:{...giftWrappingDataJson?{...JSON.parse(giftWrappingDataJson.textContent)}:{productId:null,wrapIndividually:!1},statusBeingUpdated:!1,messageBeingUpdated:!1}};window.theme.cart.store=createStore((set,get)=>({...giftWrappingData,lineItemsBeingUpdated:[],latestAddedProduct:null,noteBeingUpdated:!1,ongoingUpdates:{items:{},note:null,giftWrappingMessage:null},products:deDupeItemsInCart(initialCartData),recommendations:{enabled:!1,intent:"related",items:{}},productVariantsBeingAdded:[],clear:async()=>{const products=await clearCart();set(produce(draft=>{draft.lineItemsBeingUpdated=[],draft.latestAddedProduct=null,draft.products=products,draft.recommendations={},draft.productVariantsBeingAdded=[]}))},add:async variants=>{if(!variants)throw new Error("Variant(s) must be specified");const items=(Array.isArray(variants)?variants:[variants]).map(item=>Object.keys(item).find(key=>key.includes("properties"))?Object.entries(item).reduce((newItem,[key,value])=>(key.includes("properties")&&value!==""?(newItem.properties||(newItem.properties={}),newItem.properties[key.replace("properties[","").replace("]","")]=value):newItem[key]=value,newItem),{}):item);set(produce(draft=>{draft.productVariantsBeingAdded=items.map(item=>item.id)}));const addedResponse=await(await fetch(`${window.Shopify.routes.root}cart/add.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({items})})).json(),products=await fetchCart(),prevItemsCount=get().products.item_count;if(set(produce(draft=>{draft.latestAddedProduct=addedResponse.items?addedResponse.items[0]:null,draft.products=products})),prevItemsCount!==products.item_count&&await get().updateGiftWrapping(),await get().updateRecommendations(),addedResponse.status)throw new Error(addedResponse.description)},change:async(key,quantity=0)=>{if(!key)throw new Error("Line item key must be specified");get().ongoingUpdates.items[key]&&(get().ongoingUpdates.items[key].abort(),set(produce(draft=>{draft.ongoingUpdates.items[key]=null})));const controller=new AbortController,signal=controller.signal;set(produce(draft=>{get().lineItemsBeingUpdated.includes(key)||draft.lineItemsBeingUpdated.push(key),draft.ongoingUpdates.items[key]=controller}));const line=get().products.items.findIndex(item=>item.key===key)+1,changedResponse=await(await fetch(`${window.Shopify.routes.root}cart/change.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({line,quantity}),signal})).json();let products;changedResponse.status===422?products=await fetchCart():products=changedResponse;const prevItemsCount=get().products.item_count;if(products={...products,items:products.items.filter(item=>item.quantity>0)},products=deDupeItemsInCart(products),set(produce(draft=>{draft.lineItemsBeingUpdated=draft.lineItemsBeingUpdated.filter(k=>k!==key),draft.products=products,draft.ongoingUpdates.items[key]=null})),prevItemsCount!==products.item_count&&await get().updateGiftWrapping(),await get().updateRecommendations(),changedResponse.status===422)throw new Error(changedResponse.description)},enableRecommendations:async(intent="related")=>{get().recommendations.enabled||(set(produce(draft=>{draft.recommendations.enabled=!0,draft.recommendations.intent=intent})),await get().updateRecommendations())},resetLatestAddedProduct:()=>{set(produce(draft=>{draft.latestAddedProduct=null}))},resetVariantsBeingAdded:(variantId="")=>{set(produce(draft=>{draft.productVariantsBeingAdded=variantId?draft.productVariantsBeingAdded.filter(id=>id!==variantId):[]}))},setGiftWrapping:async(enable=!0)=>{const giftWrappingProductId=get().giftWrapping.productId;if(!giftWrappingProductId)return;const cart=get().products,giftWrappingIndividual=get().giftWrapping.wrapIndividually;if(enable){set(produce(draft=>{draft.giftWrapping.statusBeingUpdated=!0}));const savedGiftWrappingProductId=get().products.attributes["_gift-wrapping-product-id"],products=await(await fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:{...savedGiftWrappingProductId!==giftWrappingProductId?{"_gift-wrapping-product-id":giftWrappingProductId}:{},"gift-wrapping":enable,"gift-wrapping-message":""},updates:{[giftWrappingProductId]:giftWrappingIndividual?cart.items.reduce((nonGiftWrappingQuantity,item)=>item.variant_id!==giftWrappingProductId?nonGiftWrappingQuantity+item.quantity:nonGiftWrappingQuantity,0):1}})})).json();set(produce(draft=>{draft.giftWrapping.statusBeingUpdated=!1,draft.products=deDupeItems
1InCart(products)}))}else{let signal=null,key=null;const giftWrappingItem=get().products.items.find(item=>item.variant_id===giftWrappingProductId);if(set(produce(draft=>{draft.giftWrapping.statusBeingUpdated=!0})),giftWrappingItem){key=giftWrappingItem.key,get().ongoingUpdates.items[key]&&(get().ongoingUpdates.items[key].abort(),set(produce(draft=>{draft.ongoingUpdates.items[key]=null})));const controller=new AbortController;signal=controller.signal,set(produce(draft=>{get().lineItemsBeingUpdated.includes(key)||draft.lineItemsBeingUpdated.push(key),draft.ongoingUpdates.items[key]=controller}))}const products=await(await fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:{"_gift-wrapping-product-id":null,"gift-wrapping":enable,"gift-wrapping-message":""},updates:{[giftWrappingProductId]:0}}),signal})).json();set(produce(draft=>{key&&(draft.lineItemsBeingUpdated=draft.lineItemsBeingUpdated.filter(k=>k!==key)),draft.giftWrapping.statusBeingUpdated=!1,draft.products=deDupeItemsInCart(products)}))}},syncGiftWrapping:async()=>{const giftWrappingProductId=get().giftWrapping.productId,savedGiftWrappingProductId=get().products.attributes["_gift-wrapping-product-id"];if(savedGiftWrappingProductId&&savedGiftWrappingProductId!==giftWrappingProductId){const savedGiftWrappingProduct=get().products.items.find(item=>item.id===savedGiftWrappingProductId);if(savedGiftWrappingProduct){get().ongoingUpdates.items[savedGiftWrappingProduct.key]&&(get().ongoingUpdates.items[savedGiftWrappingProduct.key].abort(),set(produce(draft=>{draft.ongoingUpdates.items[savedGiftWrappingProduct.key]=null})));const controller=new AbortController,signal=controller.signal;set(produce(draft=>{get().lineItemsBeingUpdated.includes(savedGiftWrappingProduct.key)||draft.lineItemsBeingUpdated.push(savedGiftWrappingProduct.key),draft.ongoingUpdates.items[savedGiftWrappingProduct.key]=controller}));const products=await(await fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:{"_gift-wrapping-product-id":null},updates:{[savedGiftWrappingProductId]:0}}),signal})).json();set(produce(draft=>{draft.lineItemsBeingUpdated=draft.lineItemsBeingUpdated.filter(k=>k!==savedGiftWrappingProduct.key),draft.giftWrapping.statusBeingUpdated=!1,draft.products=deDupeItemsInCart(products)}))}}if(!giftWrappingProductId)return;const giftWrappingEnabled=!!get().products.attributes["gift-wrapping"],giftWrappingIndividual=get().giftWrapping.wrapIndividually,giftWrappingItem=get().products.items.find(item=>item.variant_id===giftWrappingProductId);!giftWrappingEnabled&&giftWrappingItem&&await get().setGiftWrapping(!1),giftWrappingEnabled&&!giftWrappingItem&&await get().setGiftWrapping(!0),giftWrappingEnabled&&giftWrappingItem&&giftWrappingIndividual&&giftWrappingItem.quantity===1&&await get().updateGiftWrapping(),giftWrappingEnabled&&giftWrappingItem&&!giftWrappingIndividual&&giftWrappingItem.quantity>1&&await get().updateGiftWrapping()},updateGiftWrapping:async()=>{const giftWrappingProductId=get().giftWrapping.productId;if(!giftWrappingProductId)return;const giftWrappingIndividual=get().giftWrapping.wrapIndividually,giftWrappingItem=get().products.items.find(item=>item.variant_id===giftWrappingProductId);if(!giftWrappingItem||get().products.items_count>1&&!giftWrappingIndividual&&giftWrappingItem)return;const key=giftWrappingItem.key;get().ongoingUpdates.items[key]&&(get().ongoingUpdates.items[key].abort(),set(produce(draft=>{draft.ongoingUpdates.items[key]=null})));const controller=new AbortController,signal=controller.signal;set(produce(draft=>{get().lineItemsBeingUpdated.includes(key)||draft.lineItemsBeingUpdated.push(key),draft.ongoingUpdates.items[key]=controller}));let giftWrappingQuantity=giftWrappingIndividual?get().products.items.reduce((nonGiftWrappingQuantity,item)=>item.variant_id!==giftWrappingProductId?nonGiftWrappingQuantity+item.quantity:nonGiftWrappingQuantity,0):1;giftWrappingItem&&get().products.items.filter(i=>i.id!==giftWrappingProductId).length===0&&(giftWrappingQuantity=0);const giftWrappingAttributeUpdate=giftWrappingQuantity===0?{attributes:{"gift-wrapping":!1,"gift-wrapping-message":""}}:{},cart=await(await fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...giftWrappingAttributeUpdate,updates:{[giftWrappingProductId]:giftWrappingQuantity}}),signal})).json();set(produce(draft=>{draft.lineItemsBeingUpdated=draft.lineItemsBeingUpdated.filter(k=>
1k!==key),draft.products=deDupeItemsInCart(cart)}))},updateGiftWrappingMessage:async message=>{get().giftWrapping.messageBeingUpdated&&get().ongoingUpdates.giftWrappingMessage&&(get().ongoingUpdates.giftWrappingMessage.abort(),set(produce(draft=>{draft.ongoingUpdates.giftWrappingMessage=null,draft.giftWrapping.messageBeingUpdated=!1})));const controller=new AbortController,signal=controller.signal;set(produce(draft=>{draft.ongoingUpdates.giftWrappingMessage=controller,draft.giftWrapping.messageBeingUpdated=!0}));const products=await(await fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:{"gift-wrapping-message":message}}),signal})).json();set(produce(draft=>{draft.ongoingUpdates.giftWrappingMessage=null,draft.giftWrapping.messageBeingUpdated=!1,draft.products=deDupeItemsInCart(products)}))},updateNote:async note=>{get().noteBeingUpdated&&get().ongoingUpdates.note&&(get().ongoingUpdates.note.abort(),set(produce(draft=>{draft.ongoingUpdates.note=null,draft.noteBeingUpdated=!1})));const controller=new AbortController,signal=controller.signal;set(produce(draft=>{draft.ongoingUpdates.note=controller,draft.noteBeingUpdated=!0}));const products=await(await fetch(`${window.Shopify.routes.root}cart/update.js`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({note}),signal})).json();set(produce(draft=>{draft.ongoingUpdates.note=null,draft.noteBeingUpdated=!1,draft.products=deDupeItemsInCart(products)}))},updateRecommendations:async()=>{if(!get().recommendations.enabled)return;const weightDistribution="equal",intent=get().recommendations.intent,newRecommendations={},existingRecommendations=get().recommendations.items,existingRecommendationsIds=Object.keys(existingRecommendations),productIds=get().products.items.reduce((ids,item)=>(!item.gift_card&&!ids.includes(item.product_id.toString())&&ids.push(item.product_id.toString()),ids),[]),remainingProductIds=existingRecommendationsIds.filter(productId=>productIds.includes(productId)),remainingRecommendations=remainingProductIds.reduce((recommendations,productId)=>({...recommendations,[productId]:existingRecommendations[productId]}),{}),newProductIds=productIds.filter(productId=>!existingRecommendationsIds.includes(productId));await Promise.all([...remainingProductIds.length<existingRecommendationsIds.length?remainingProductIds:[],...newProductIds].map(async productId=>{const recommendations=await(await fetch(`${window.Shopify.routes.root}recommendations/products.json?product_id=${productId}&intent=${intent}`)).json();remainingProductIds.includes(productId)?remainingRecommendations[productId]=recommendations:newRecommendations[productId]=recommendations}));const finalRecommendations={...remainingRecommendations,...newRecommendations},calculateWeight=productId=>get().products.items.filter(item=>item.product_id.toString()===productId).reduce((total,item)=>total+item.line_price,0)/get().products.total_price;set(produce(draft=>{draft.recommendations.items=Object.keys(finalRecommendations).reduce((recommendations,productId)=>(recommendations[productId]={weight:weightDistribution==="proportional"?calculateWeight(productId):1/get().products.items.reduce((items,item)=>(items.includes(item.id)||items.push(item.id),items),[]).length,products:finalRecommendations[productId].products},recommendations),{})}))}}))};initiateStore(),resetFreeShippingAnimation(),await window.theme.cart.store.getState().syncGiftWrapping();
2//# sourceMappingURL=/cdn/shop/t/3/assets/cart-store.js.map?v=169171967427512002621717143923

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