@dropins/storefront-cart 3.0.0 → 3.1.0-beta1

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.
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as r,jsxs as _,Fragment as F}from"@dropins/tools/preact-jsx-runtime.js";import*as X from"@dropins/tools/preact-compat.js";import{forwardRef as re,useState as $,useEffect as J,useCallback as Bt,useImperativeHandle as ie}from"@dropins/tools/preact-compat.js";import{classes as L,VComponent as K,Slot as m}from"@dropins/tools/lib.js";import{E as ae}from"./EmptyCart2.js";/* empty css */import{Divider as $t,Skeleton as ce,SkeletonRow as oe,InLineAlert as Gt,CartList as Y,Icon as Z,Button as M,Accordion as se,AccordionSection as ue,CartItem as de,Price as z,Incrementer as le,Image as me}from"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";import{g as Xt}from"./persisted-data.js";import{events as Rt}from"@dropins/tools/event-bus.js";import{s as ge}from"./resetCart.js";import{a as fe}from"./createGuestCart.js";import{u as qt}from"./updateProductsFromCart.js";import{S as Tt,a as he,b as ve}from"./WarningWithCircle.js";import{S as ye}from"./ChevronDown.js";import{useText as pe}from"@dropins/tools/i18n.js";const Ce=I=>X.createElement("svg",{id:"Icon_Chevron_right_Base","data-name":"Icon \\u2013 Chevron right \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...I},X.createElement("g",{id:"Large"},X.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),X.createElement("g",{id:"Chevron_right_icon","data-name":"Chevron right icon"},X.createElement("path",{vectorEffect:"non-scaling-stroke",id:"chevron",d:"M199.75,367.5l4.255,-4.255-4.255,-4.255",transform:"translate(-189.25 -351.0)",fill:"none",stroke:"currentColor"})))),Ut=({className:I,children:H,heading:w,footer:A,emptyCart:G,products:h,outOfStockMessage:y,variant:R="primary",loading:g=!0,...i})=>r("div",{...i,className:L(["cart-cart-summary-list",I,`cart-cart-summary-list__background--${R}`]),children:g?r(Ie,{}):_(F,{children:[(w||y)&&_("div",{"data-testid":"cart-summary-list-heading-wrapper",className:L(["cart-cart-summary-list__heading",["cart-cart-summary-list__heading--full-width",!h]]),children:[w&&_(F,{children:[r(K,{node:w,className:"cart-cart-summary-list__heading-text"}),r($t,{variant:"primary",className:L(["cart-cart-summary-list__heading-divider"])})]}),y&&r(K,{node:y,className:"cart-cart-summary-list__out-of-stock-message"})]}),r("div",{className:L(["cart-cart-summary-list__content",["cart-cart-summary-list__content--empty",!h]]),children:h||r(K,{node:G,className:"cart-cart-summary-list__empty-cart"})}),A&&_(F,{children:[r($t,{variant:"primary",className:L(["cart-cart-summary-list__footer-divider"])}),r(K,{node:A,className:"cart-cart-summary-list__footer-text"})]})]})}),Ie=()=>r(ce,{"data-testid":"cart-summary-list-skeleton",className:"cart-cart-summary-list__skeleton",rowGap:"medium",children:r(oe,{variant:"row",size:"xlarge",fullWidth:!0,lines:3,multilineGap:"small"})}),P=I=>new DOMParser().parseFromString(I,"text/html").body.textContent||"",ke=re(({initialData:I=null,hideHeading:H,hideFooter:w,routeProduct:A,routeEmptyCartCTA:G,routeCart:h,onItemUpdate:y,onItemRemove:R,maxItems:g,slots:i,attributesToHide:d=[],enableRemoveItem:b,enableUpdateItemQuantity:q,onItemsErrorsChange:tt,accordion:zt=!1,variant:et="primary",isLoading:Ft,showMaxItems:nt,showDiscount:rt,showSavings:it,quantityType:at,dropdownOptions:ct,undo:Q=!1,__testRecentlyRemovedItems:ot,...st},Wt)=>{var bt;const[T,jt]=$(!I),[a,Dt]=$(I),[f,Vt]=$(new Set),[W,ut]=$(new Map),[x,O]=$(ot||[]);J(()=>{},[ot,x]);const l=(bt=ge.config)==null?void 0:bt.shoppingCartDisplaySetting,[E,Jt]=$(nt?!0:!g&&!nt),c=pe({file:"Cart.CartItem.file",files:"Cart.CartItem.files",heading:"Cart.Cart.heading",message:"Cart.CartItem.message",recipient:"Cart.CartItem.recipient",regularPrice:"Cart.CartItem.regularPrice",discountedPrice:"Cart.CartItem.discountedPrice",sender:"Cart.CartItem.sender",lowInventory:"Cart.CartItem.lowInventory",insufficientQuantity:"Cart.CartItem.insufficientQuantity",insufficientQuantityGeneral:"Cart.CartItem.insufficientQuantityGeneral",outOfStockHeading:"Cart.OutOfStockMessage.heading",outOfStockDescription:"Cart.OutOfStockMessage.message",outOfStockAlert:"Cart.OutOfStockMessage.alert",removeAction:"Cart.OutOfStockMessage.action",notAvailableMessage:"Cart.CartItem.notAvailableMessage",viewMore:"Cart.Cart.viewMore",viewAll:"Cart.Cart.viewAll",discountPercent:"Cart.CartItem.discountPercentage",savingsAmount:"Cart.CartItem.savingsAmount",itemBeingRemoved:"Cart.CartItem.itemBeingRemoved",itemRemoved:"Cart.CartItem.itemRemoved",itemRemovedDescription:"Cart.CartItem.itemRemovedDescription",undoAction:"Cart.CartItem.undoAction",dismissAction:"Cart.CartItem.dismissAction",remove:"Dropin.CartItem.remove.label",removeDefault:"Dropin.CartItem.removeDefault.label",quantity:"Dropin.CartItem.quantity.label"}),B=(t,e)=>{Vt(n=>(e?n.add(t):n.delete(t),new Set(n)))},j=(t,e)=>{ut(n=>(e?n.set(t,e):n.delete(t),new Map(n)))};function Kt(t){const e=Xt(),n=e==null?void 0:e.items.find(o=>o.uid===t);n&&O(o=>{const s=e.items.findIndex(u=>u.uid===t);return s!==-1&&!o.some(u=>u.item.uid===t)?(Rt.emit("cart/product/removed",{item:n,index:s}),[...o,{item:n,index:s,error:void 0,beingRemoved:!0}]):o})}const N=(t,e)=>{B(t.uid,!0),ut(new Map),b&&e===0?(Kt(t.uid),qt([{uid:t.uid,quantity:e}]).then(()=>{R==null||R({item:t})}).finally(()=>{B(t.uid,!1),O(n=>n.map(o=>o.item.uid===t.uid?{...o,beingRemoved:!1}:o))}).catch(n=>{console.warn(n)})):q&&qt([{uid:t.uid,quantity:e}]).then(()=>{y==null||y({item:t})}).finally(()=>{B(t.uid,!1)}).catch(n=>{j(t.uid,n.message)})},dt=t=>{O(e=>e.filter(n=>n.item.uid!==t))},Yt=Bt(()=>{Jt(t=>!t)},[]);J(()=>{const t=Rt.on("cart/data",e=>{Dt(e),jt(!!Ft)},{eager:!0});return()=>{t==null||t.off()}},[]),J(()=>{Q||O([])},[Q]),J(()=>{tt&&tt(W)},[W,tt]);const lt=(t,e)=>{if(d.includes("image"))return;const n={loading:e<4?"eager":"lazy",src:t.image.src,alt:t.image.alt,width:"300",height:"300",params:{width:300}},o=r(me,{"data-testid":"cart-list-item-image",...n});return r(m,{name:"Thumbnail",slot:i==null?void 0:i.Thumbnail,context:{item:t,defaultImageProps:n},children:A?r("a",{href:A(t),children:o}):o})},mt=t=>{if(!d.includes("name"))return r("span",{"data-testid":"cart-list-item-title",children:A?r("a",{href:A(t),children:P(t.name)}):P(t.name)})},gt=t=>{if(d.includes("configurations"))return;const e={...t.bundleOptions,...t.selectedOptions,...t.customizableOptions,...t.recipient?{[c.recipient]:t.recipient}:null,...t.recipientEmail&&t.recipient?{[c.recipient]:`${t.recipient} (${t.recipientEmail})`}:null,...t.sender?{[c.sender]:t.sender}:null,...t.senderEmail&&t.sender?{[c.sender]:`${t.sender} (${t.senderEmail})`}:{},...t.message?{[c.message]:t.message}:null,...t.links&&t.links.count?t.links.count>1?{[c.files.replace("{count}",t.links.count.toString())]:t.links.result}:{[c.file.replace("{count}",t.links.count.toString())]:t.links.result}:null};if(Object.keys(e).length!==0)return e},ft=t=>{var e,n,o,s;return(l==null?void 0:l.price)==="INCLUDING_TAX"?t.discounted?{amount:t.regularPrice.value,currency:t.regularPrice.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:(e=t.taxedPrice)==null?void 0:e.value,currency:(n=t.taxedPrice)==null?void 0:n.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:(o=t.regularPrice)==null?void 0:o.value,currency:(s=t.regularPrice)==null?void 0:s.currency,style:{font:"inherit"},"data-testid":"regular-item-price"}},ht=t=>{var e,n;return{amount:(e=t.savingsAmount)==null?void 0:e.value,currency:(n=t.savingsAmount)==null?void 0:n.currency,style:{font:"inherit"},"data-testid":"item-savings-amount"}},vt=t=>(l==null?void 0:l.price)==="INCLUDING_EXCLUDING_TAX"?r(z,{amount:t.rowTotal.value,currency:t.rowTotal.currency,"data-testid":"excluding-tax-total","aria-label":c.regularPrice}):void 0,yt=t=>{var o,s,u,v,C,k,S,U,Qt,Et;const e={"aria-label":c.regularPrice},n=t.discounted?{}:null;return["INCLUDING_TAX","INCLUDING_EXCLUDING_TAX"].includes(l==null?void 0:l.price)?(e.amount=(o=t.rowTotalIncludingTax)==null?void 0:o.value,e.currency=(s=t.rowTotalIncludingTax)==null?void 0:s.currency,e.variant=t.discounted?"strikethrough":"default",e["data-testid"]="including-tax-item-total",n&&(e.amount=(u=t.total)==null?void 0:u.value,e.currency=(v=t.total)==null?void 0:v.currency,n.amount=(C=t.rowTotalIncludingTax)==null?void 0:C.value,n.currency=(k=t.rowTotalIncludingTax)==null?void 0:k.currency,n.sale=!0,n["aria-label"]=c.discountedPrice,n["data-testid"]="discount-total")):(e.amount=(S=t.total)==null?void 0:S.value,e.currency=(U=t.total)==null?void 0:U.currency,e.variant=t.discounted?"strikethrough":"default",e["data-testid"]="regular-item-total",n&&(n.amount=(Qt=t.discountedTotal)==null?void 0:Qt.value,n.currency=(Et=t.discountedTotal)==null?void 0:Et.currency,n.sale=!0,n["aria-label"]=c.regularPrice,n["data-testid"]="discount-total")),{totalProps:e,discountProps:n}},pt=t=>{var C,k,S;if(d.includes("warning"))return;const e=W.get(t.uid),n=(C=W.get(t.uid))==null?void 0:C.includes("The requested qty is not available"),o=f.has(t.uid),s=t.insufficientQuantity&&t.stockLevel?t.stockLevel==="noNumber"?c.insufficientQuantityGeneral:c.insufficientQuantity.replace("{inventory}",(k=t.stockLevel)==null?void 0:k.toString()).replace("{count}",t.quantity.toString()):"",u=t.lowInventory&&t.onlyXLeftInStock&&c.lowInventory.replace("{count}",(S=t.onlyXLeftInStock)==null?void 0:S.toString()),v=!t.outOfStock&&e&&n?c.notAvailableMessage:e;return!o&&(e||t.insufficientQuantity||t.lowInventory)?_("span",{"data-testid":"item-warning",children:[r(Z,{source:he,size:"16"}),v||s||u]}):void 0},Ct=t=>d!=null&&d.includes("alert")?void 0:!f.has(t.uid)&&t.outOfStock?_("span",{"data-testid":"item-alert",children:[r(Z,{source:Tt,size:"16"}),c.outOfStockAlert]}):void 0,It=t=>r(m,{name:"ProductAttributes",slot:i==null?void 0:i.ProductAttributes,context:{item:t}}),kt=t=>{if(!d.includes("sku"))return r("span",{"data-testid":"cart-list-item-sku",children:t.sku})},St=t=>r(m,{name:"Footer",slot:i==null?void 0:i.Footer,context:{item:t,handleItemsLoading:B,handleItemsError:j,onItemUpdate:y}}),Zt=t=>{var e;if(b)return r(m,{name:"ItemRemoveAction",slot:i==null?void 0:i.ItemRemoveAction,context:{item:t,enableRemoveItem:b,handleItemQuantityUpdate:N,handleItemsError:j,handleItemsLoading:B,onItemUpdate:y,itemsLoading:f},children:r(M,{"data-testid":"cart-item-remove-button",className:L(["dropin-cart-item__remove"]),variant:"tertiary",onClick:()=>N(t,0),disabled:f.has(t.uid),icon:r(Z,{"data-testid":"cart-item-remove-icon",source:ve,size:"24",stroke:"2",viewBox:"0 0 24 24","aria-label":((e=c.remove)==null?void 0:e.replace("{product}",P(t.name)))||c.removeDefault})})})},Mt=t=>{if(!d.includes("quantity")&&q)return r(m,{name:"ItemQuantity",slot:i==null?void 0:i.ItemQuantity,context:{item:t,enableUpdateItemQuantity:q,handleItemQuantityUpdate:N,itemsLoading:f,handleItemsError:j,handleItemsLoading:B,onItemUpdate:y},children:r(le,{value:t.quantity,min:1,onValue:e=>N(t,Number(e)),name:"quantity",disabled:f.has(t.uid),"aria-label":c.quantity})})},_t=t=>a!=null&&a.totalQuantity?a.items.filter(t).map((e,n)=>{var v;const{totalProps:o,discountProps:s}=yt(e),u=r(de,{updating:f==null?void 0:f.has(e.uid),loading:T,"data-testid":`cart-list-item-entry-${e.uid}`,image:lt(e,n),title:r(m,{name:"ItemTitle",slot:i==null?void 0:i.ItemTitle,context:{item:e},children:mt(e)}),sku:d.includes("sku")?void 0:r(m,{name:"ItemSku",slot:i==null?void 0:i.ItemSku,context:{item:e},children:kt(e)}),price:d.includes("price")?void 0:r(m,{name:"ItemPrice",slot:i==null?void 0:i.ItemPrice,context:{item:e},slotTag:"span",children:r(z,{...ft(e)})}),quantity:d.includes("quantity")?void 0:e.quantity,quantityContent:Mt(e),total:_(F,{children:[d.includes("total")?void 0:r(m,{name:"ItemTotal",slot:i==null?void 0:i.ItemTotal,context:{item:e},children:r(z,{...o})}),d.includes("totalDiscount")?void 0:s&&r(m,{name:"ItemTotal",slot:i==null?void 0:i.ItemTotal,context:{item:e},children:r(z,{...s})})]}),attributes:It(e),configurations:gt(e),totalExcludingTax:d.includes("totalExcludingTax")?void 0:vt(e),taxIncluded:(l==null?void 0:l.price)==="INCLUDING_TAX",taxExcluded:!d.includes("totalExcludingTax")&&(l==null?void 0:l.price)==="INCLUDING_EXCLUDING_TAX",warning:pt(e),alert:Ct(e),quantityType:at,dropdownOptions:ct,onQuantity:q&&!f.has(e.uid)?C=>{N(e,C)}:void 0,onRemove:b&&!f.has(e.uid)?()=>N(e,0):void 0,discount:rt&&e.discounted&&e.discountPercentage?r("div",{"data-testid":"item-discount-percent",children:c.discountPercent.replace("{discount}",((v=e.discountPercentage)==null?void 0:v.toString())??"")}):void 0,savings:it&&e.discounted&&e.savingsAmount?_("div",{children:[r("span",{children:r(z,{...ht(e)})})," ",c.savingsAmount]}):void 0,footer:St(e),removeContent:Zt(e)},e.uid);return r(m,{name:"CartItem",slot:i==null?void 0:i.CartItem,context:{item:e,index:n,enableUpdateItemQuantity:q,enableRemoveItem:b,itemsLoading:f,loading:T,attributesToHide:d,cartTaxesConfig:l,quantityType:at,dropdownOptions:ct,showDiscount:rt,showSavings:it,dictionary:c,getImage:lt,getTitle:mt,getSku:kt,getPriceProps:ft,getTotalPriceProps:yt,getProductAttributes:It,getConfiguration:gt,getTotalExcludingTax:vt,getWarning:pt,getAlert:Ct,getFooter:St,getSavingsAmount:ht},children:u},e.uid)}):null,wt=r(m,{name:"Heading",slot:i==null?void 0:i.Heading,context:{count:a==null?void 0:a.totalQuantity},children:r("div",{"data-testid":"default-cart-heading",children:c.heading.replace("({count})",a!=null&&a.totalQuantity?`(${a==null?void 0:a.totalQuantity.toString()})`:"")})}),Ht=wt.props.children.props.children,te=()=>{const t=a==null?void 0:a.items.filter(e=>e.outOfStock);t==null||t.forEach(e=>{N(e,0)})},ee=_t(t=>t.outOfStock||t.insufficientQuantity||!1),At=a!=null&&a.hasOutOfStockItems?r(Gt,{"data-testid":"cart-out-of-stock-message",icon:r(Z,{source:Tt,size:"16"}),itemList:r(Y,{"data-testid":"out-of-stock-cart-items",children:ee}),type:"warning",heading:c.outOfStockHeading,description:c.outOfStockDescription,variant:"primary",actionButtonPosition:"bottom",additionalActions:a!=null&&a.hasFullyOutOfStockItems&&b?[{label:c.removeAction,onClick:te}]:void 0}):void 0,p=_t(t=>!t.outOfStock&&!t.insufficientQuantity),xt=E?Math.max(g||5,5):Math.min((a==null?void 0:a.totalQuantity)||5,5),Ot=(a==null?void 0:a.totalQuantity)>xt,ne=Ot&&!E&&xt!=g,D=a!=null&&a.totalQuantity&&p?r(m,{name:"Footer",slot:i==null?void 0:i.CartSummaryFooter,context:{displayMaxItems:E,routeCart:h},"data-testid":"cart-cart-summary-footer-slot",className:"cart-cart-summary-footer",children:Ot?ne?r(M,{className:"cart-cart-summary-list-footer__action",onClick:Yt,"data-testid":"view-more-items-button",variant:"tertiary",children:c.viewMore}):h&&r(M,{className:"cart-cart-summary-list-footer__action",href:h(),variant:"tertiary","data-testid":"view-cart-or-less-items-button",children:c.viewAll}):h&&r(M,{className:"cart-cart-summary-list-footer__action",href:h(),variant:"tertiary","data-testid":"view-cart-button",children:c.viewAll})}):null,Nt=()=>{if(!(a!=null&&a.items))return null;const t=[],e=a.items,n=i==null?void 0:i.UndoBanner,o=E?Math.max(g||(a==null?void 0:a.totalQuantity),5):Math.min(g??5,5);for(let s=0;s<=o;s++)Q&&x.filter(u=>u.index===s).forEach(({item:u,error:v,beingRemoved:C})=>{var S,U;const k=r(Gt,{type:v?"error":"info",heading:C?(S=c.itemBeingRemoved)==null?void 0:S.replace("{product}",P(u.name)):(U=c.itemRemoved)==null?void 0:U.replace("{product}",P(u.name)),description:v||c.itemRemovedDescription,variant:"primary",actionButtonPosition:"bottom",additionalActions:C?[]:[{label:c.undoAction,onClick:()=>V(u.uid),"aria-label":`${c.undoAction} remove ${P(u.name)}`},{label:c.dismissAction,onClick:()=>dt(u.uid),"aria-label":`${c.dismissAction} undo for ${P(u.name)}`}]},`undo-banner-${u.uid}`);t.push(n?r(m,{name:"UndoBanner",slot:n,context:{item:u,loading:T,error:v,onUndo:()=>V(u.uid),onDismiss:()=>dt(u.uid)},children:k},`undo-banner-${u.uid}`):k)}),s<o&&s<e.length&&t.push((p==null?void 0:p[s])||null);return r(Y,{"data-testid":"cart-list",children:t})},V=Bt(async t=>{O(n=>n.map(o=>o.item.uid===t?{...o,loading:!0,error:void 0}:o));const e=x.find(n=>n.item.uid===t);if(e)try{await fe([{sku:e.item.sku,parentSku:e.item.topLevelSku,quantity:e.item.quantity,optionsUIDs:e.item.bundleOptionsUIDs||(e.item.selectedOptionsUIDs?Object.values(e.item.selectedOptionsUIDs):void 0),enteredOptions:e.item.customizableOptions?Object.entries(e.item.customizableOptions).map(([n,o])=>({uid:n,value:o})):void 0}]),O(n=>n.filter(o=>o.item.uid!==t))}catch(n){O(o=>o.map(s=>s.item.uid===t?{...s,error:(n==null?void 0:n.message)||"Failed to restore item."}:s))}},[x]);ie(Wt,()=>({handleUndo:V}),[V]);const Pt=r(F,{children:Q&&x.length>0?Nt():r(m,{name:"EmptyCart",slot:i==null?void 0:i.EmptyCart,context:{},children:r(ae,{"data-testid":"empty-cart",ctaLinkURL:G==null?void 0:G()})})}),Lt=a!=null&&a.totalQuantity||Q&&x.length>0?Q?x.length>0?Nt():r(Y,{"data-testid":"cart-list",children:p==null?void 0:p.slice(0,E?Math.max(g||(a==null?void 0:a.totalQuantity),5):Math.min(g??5,5))}):r(Y,{"data-testid":"cart-list",children:p==null?void 0:p.slice(0,E?Math.max(g||(a==null?void 0:a.totalQuantity),5):Math.min(g??5,5))}):null;return zt?r(se,{"data-testid":"cart-summary-list-accordion",className:L(["cart-cart-summary-list-accordion",`cart-cart-summary-list__background--${et}`]),iconOpen:Ce,iconClose:ye,children:r(ue,{title:Ht,"data-testid":"cart-summary-list-accordion__section",open:!0,renderContentWhenClosed:!0,children:r(Ut,{...st,"aria-expanded":!0,"aria-label":"TEST",className:"cart-cart-summary-list-accordion__list",loading:T,footer:w?void 0:D||(h?D:void 0),emptyCart:Pt,products:Lt,outOfStockMessage:At,variant:et})})}):r(Ut,{...st,heading:H?void 0:wt,footer:w?void 0:D||(h?D:void 0),loading:T,emptyCart:Pt,products:Lt,outOfStockMessage:At,variant:et})});ke.getInitialData=async function(){return Xt()};export{ke as C};
3
+ import{jsx as r,jsxs as w,Fragment as z}from"@dropins/tools/preact-jsx-runtime.js";import*as U from"@dropins/tools/preact-compat.js";import{forwardRef as ae,useState as T,useEffect as J,useCallback as Tt,useImperativeHandle as ie}from"@dropins/tools/preact-compat.js";import{classes as L,VComponent as K,Slot as m}from"@dropins/tools/lib.js";import{E as ce}from"./EmptyCart2.js";/* empty css */import{Divider as Bt,Skeleton as oe,SkeletonRow as se,InLineAlert as $t,CartList as Y,Icon as Z,Button as M,Accordion as ue,AccordionSection as de,CartItem as le,Price as X,Incrementer as me,Image as ge}from"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";import{g as Xt}from"./persisted-data.js";import{events as Gt}from"@dropins/tools/event-bus.js";import{s as fe}from"./resetCart.js";import{a as he}from"./createGuestCart.js";import{u as qt}from"./updateProductsFromCart.js";import{S as Ft,a as ve,b as ye}from"./WarningWithCircle.js";import{S as pe}from"./ChevronDown.js";import{useText as Ce}from"@dropins/tools/i18n.js";const Ie=I=>U.createElement("svg",{id:"Icon_Chevron_right_Base","data-name":"Icon \\u2013 Chevron right \\u2013 Base",xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",...I},U.createElement("g",{id:"Large"},U.createElement("rect",{id:"Placement_area","data-name":"Placement area",width:24,height:24,fill:"#fff",opacity:0}),U.createElement("g",{id:"Chevron_right_icon","data-name":"Chevron right icon"},U.createElement("path",{vectorEffect:"non-scaling-stroke",id:"chevron",d:"M199.75,367.5l4.255,-4.255-4.255,-4.255",transform:"translate(-189.25 -351.0)",fill:"none",stroke:"currentColor"})))),Ut=({className:I,children:H,heading:_,footer:x,emptyCart:B,products:h,outOfStockMessage:y,variant:$="primary",loading:g=!0,...a})=>r("div",{...a,className:L(["cart-cart-summary-list",I,`cart-cart-summary-list__background--${$}`]),children:g?r(ke,{}):w(z,{children:[(_||y)&&w("div",{"data-testid":"cart-summary-list-heading-wrapper",className:L(["cart-cart-summary-list__heading",["cart-cart-summary-list__heading--full-width",!h]]),children:[_&&w(z,{children:[r(K,{node:_,className:"cart-cart-summary-list__heading-text"}),r(Bt,{variant:"primary",className:L(["cart-cart-summary-list__heading-divider"])})]}),y&&r(K,{node:y,className:"cart-cart-summary-list__out-of-stock-message"})]}),r("div",{className:L(["cart-cart-summary-list__content",["cart-cart-summary-list__content--empty",!h]]),children:h||r(K,{node:B,className:"cart-cart-summary-list__empty-cart"})}),x&&w(z,{children:[r(Bt,{variant:"primary",className:L(["cart-cart-summary-list__footer-divider"])}),r(K,{node:x,className:"cart-cart-summary-list__footer-text"})]})]})}),ke=()=>r(oe,{"data-testid":"cart-summary-list-skeleton",className:"cart-cart-summary-list__skeleton",rowGap:"medium",children:r(se,{variant:"row",size:"xlarge",fullWidth:!0,lines:3,multilineGap:"small"})}),P=I=>new DOMParser().parseFromString(I,"text/html").body.textContent||"",Se=ae(({initialData:I=null,hideHeading:H,hideFooter:_,routeProduct:x,routeEmptyCartCTA:B,routeCart:h,onItemUpdate:y,onItemRemove:$,maxItems:g,slots:a,attributesToHide:d=[],enableRemoveItem:b,enableUpdateItemQuantity:G,onItemsErrorsChange:tt,accordion:zt=!1,variant:et="primary",isLoading:Wt,showMaxItems:nt,showDiscount:rt,showSavings:at,quantityType:it,dropdownOptions:ct,undo:Q=!1,__testRecentlyRemovedItems:ot,...st},jt)=>{var Qt;const[q,Dt]=T(!I),[i,Vt]=T(I),[f,Jt]=T(new Set),[W,ut]=T(new Map),[A,O]=T(ot||[]);J(()=>{},[ot,A]);const l=(Qt=fe.config)==null?void 0:Qt.shoppingCartDisplaySetting,[E,Kt]=T(nt?!0:!g&&!nt),c=Ce({file:"Cart.CartItem.file",files:"Cart.CartItem.files",heading:"Cart.Cart.heading",message:"Cart.CartItem.message",recipient:"Cart.CartItem.recipient",regularPrice:"Cart.CartItem.regularPrice",discountedPrice:"Cart.CartItem.discountedPrice",sender:"Cart.CartItem.sender",lowInventory:"Cart.CartItem.lowInventory",insufficientQuantity:"Cart.CartItem.insufficientQuantity",insufficientQuantityGeneral:"Cart.CartItem.insufficientQuantityGeneral",outOfStockHeading:"Cart.OutOfStockMessage.heading",outOfStockDescription:"Cart.OutOfStockMessage.message",outOfStockAlert:"Cart.OutOfStockMessage.alert",removeAction:"Cart.OutOfStockMessage.action",notAvailableMessage:"Cart.CartItem.notAvailableMessage",viewMore:"Cart.Cart.viewMore",viewAll:"Cart.Cart.viewAll",discountPercent:"Cart.CartItem.discountPercentage",savingsAmount:"Cart.CartItem.savingsAmount",itemBeingRemoved:"Cart.CartItem.itemBeingRemoved",itemRemoved:"Cart.CartItem.itemRemoved",itemRemovedDescription:"Cart.CartItem.itemRemovedDescription",undoAction:"Cart.CartItem.undoAction",dismissAction:"Cart.CartItem.dismissAction",remove:"Dropin.CartItem.remove.label",removeDefault:"Dropin.CartItem.removeDefault.label",quantity:"Dropin.CartItem.quantity.label"}),R=(t,e)=>{Jt(n=>(e?n.add(t):n.delete(t),new Set(n)))},j=(t,e)=>{ut(n=>(e?n.set(t,e):n.delete(t),new Map(n)))};function Yt(t){const e=Xt(),n=e==null?void 0:e.items.find(o=>o.uid===t);n&&O(o=>{const s=e.items.findIndex(u=>u.uid===t);return s!==-1&&!o.some(u=>u.item.uid===t)?(Gt.emit("cart/product/removed",{item:n,index:s}),[...o,{item:n,index:s,error:void 0,beingRemoved:!0}]):o})}const N=(t,e)=>{R(t.uid,!0),ut(new Map),b&&e===0?(Yt(t.uid),qt([{uid:t.uid,quantity:e}]).then(()=>{$==null||$({item:t})}).finally(()=>{R(t.uid,!1),O(n=>n.map(o=>o.item.uid===t.uid?{...o,beingRemoved:!1}:o))}).catch(n=>{console.warn(n)})):G&&qt([{uid:t.uid,quantity:e}]).then(()=>{y==null||y({item:t})}).finally(()=>{R(t.uid,!1)}).catch(n=>{j(t.uid,n.message)})},dt=t=>{O(e=>e.filter(n=>n.item.uid!==t))},Zt=Tt(()=>{Kt(t=>!t)},[]);J(()=>{const t=Gt.on("cart/data",e=>{Vt(e),Dt(!!Wt)},{eager:!0});return()=>{t==null||t.off()}},[]),J(()=>{Q||O([])},[Q]),J(()=>{tt&&tt(W)},[W,tt]);const lt=(t,e)=>{if(d.includes("image"))return;const n={loading:e<4?"eager":"lazy",src:t.image.src,alt:t.image.alt,width:"300",height:"300",params:{width:300}},o=r(ge,{"data-testid":"cart-list-item-image",...n});return r(m,{name:"Thumbnail",slot:a==null?void 0:a.Thumbnail,context:{item:t,defaultImageProps:n},children:x?r("a",{href:x(t),children:o}):o})},mt=t=>{if(!d.includes("name"))return r("span",{"data-testid":"cart-list-item-title",children:x?r("a",{href:x(t),children:P(t.name)}):P(t.name)})},gt=t=>{if(d.includes("configurations"))return;const e={...t.bundleOptions,...t.selectedOptions,...t.customizableOptions,...t.recipient?{[c.recipient]:t.recipient}:null,...t.recipientEmail&&t.recipient?{[c.recipient]:`${t.recipient} (${t.recipientEmail})`}:null,...t.sender?{[c.sender]:t.sender}:null,...t.senderEmail&&t.sender?{[c.sender]:`${t.sender} (${t.senderEmail})`}:{},...t.message?{[c.message]:t.message}:null,...t.links&&t.links.count?t.links.count>1?{[c.files.replace("{count}",t.links.count.toString())]:t.links.result}:{[c.file.replace("{count}",t.links.count.toString())]:t.links.result}:null};if(Object.keys(e).length!==0)return e},ft=t=>{var e,n,o,s;return(l==null?void 0:l.price)==="INCLUDING_TAX"?t.discounted?{amount:t.regularPrice.value,currency:t.regularPrice.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:(e=t.taxedPrice)==null?void 0:e.value,currency:(n=t.taxedPrice)==null?void 0:n.currency,style:{font:"inherit"},"data-testid":"including-tax-item-price"}:{amount:(o=t.regularPrice)==null?void 0:o.value,currency:(s=t.regularPrice)==null?void 0:s.currency,style:{font:"inherit"},"data-testid":"regular-item-price"}},ht=t=>{var e,n;return{amount:(e=t.savingsAmount)==null?void 0:e.value,currency:(n=t.savingsAmount)==null?void 0:n.currency,style:{font:"inherit"},"data-testid":"item-savings-amount"}},vt=t=>(l==null?void 0:l.price)==="INCLUDING_EXCLUDING_TAX"?r(X,{amount:t.rowTotal.value,currency:t.rowTotal.currency,"data-testid":"excluding-tax-total","aria-label":c.regularPrice}):void 0,yt=t=>{var o,s,u,v,C,k,S,F,Et,Rt;const e={"aria-label":c.regularPrice},n=t.discounted?{}:null;return["INCLUDING_TAX","INCLUDING_EXCLUDING_TAX"].includes(l==null?void 0:l.price)?(e.amount=(o=t.rowTotalIncludingTax)==null?void 0:o.value,e.currency=(s=t.rowTotalIncludingTax)==null?void 0:s.currency,e.variant=t.discounted?"strikethrough":"default",e["data-testid"]="including-tax-item-total",n&&(e.amount=(u=t.total)==null?void 0:u.value,e.currency=(v=t.total)==null?void 0:v.currency,n.amount=(C=t.rowTotalIncludingTax)==null?void 0:C.value,n.currency=(k=t.rowTotalIncludingTax)==null?void 0:k.currency,n.sale=!0,n["aria-label"]=c.discountedPrice,n["data-testid"]="discount-total")):(e.amount=(S=t.total)==null?void 0:S.value,e.currency=(F=t.total)==null?void 0:F.currency,e.variant=t.discounted?"strikethrough":"default",e["data-testid"]="regular-item-total",n&&(n.amount=(Et=t.discountedTotal)==null?void 0:Et.value,n.currency=(Rt=t.discountedTotal)==null?void 0:Rt.currency,n.sale=!0,n["aria-label"]=c.regularPrice,n["data-testid"]="discount-total")),{totalProps:e,discountProps:n}},pt=t=>{var C,k,S;if(d.includes("warning"))return;const e=W.get(t.uid),n=(C=W.get(t.uid))==null?void 0:C.includes("The requested qty is not available"),o=f.has(t.uid),s=t.insufficientQuantity&&t.stockLevel?t.stockLevel==="noNumber"?c.insufficientQuantityGeneral:c.insufficientQuantity.replace("{inventory}",(k=t.stockLevel)==null?void 0:k.toString()).replace("{count}",t.quantity.toString()):"",u=t.lowInventory&&t.onlyXLeftInStock&&c.lowInventory.replace("{count}",(S=t.onlyXLeftInStock)==null?void 0:S.toString()),v=!t.outOfStock&&e&&n?c.notAvailableMessage:e;return!o&&(e||t.insufficientQuantity||t.lowInventory)?w("span",{"data-testid":"item-warning",children:[r(Z,{source:ve,size:"16"}),v||s||u]}):void 0},Ct=t=>d!=null&&d.includes("alert")?void 0:!f.has(t.uid)&&t.outOfStock?w("span",{"data-testid":"item-alert",children:[r(Z,{source:Ft,size:"16"}),c.outOfStockAlert]}):void 0,It=t=>r(m,{name:"ProductAttributes",slot:a==null?void 0:a.ProductAttributes,context:{item:t}}),kt=t=>{if(!d.includes("sku"))return r("span",{"data-testid":"cart-list-item-sku",children:t.sku})},St=t=>r(m,{name:"Footer",slot:a==null?void 0:a.Footer,context:{item:t,handleItemsLoading:R,handleItemsError:j,onItemUpdate:y}}),wt=t=>r(m,{name:"RowTotalFooter",slot:a==null?void 0:a.RowTotalFooter,context:{item:t}}),Mt=t=>{var e;if(b)return r(m,{name:"ItemRemoveAction",slot:a==null?void 0:a.ItemRemoveAction,context:{item:t,enableRemoveItem:b,handleItemQuantityUpdate:N,handleItemsError:j,handleItemsLoading:R,onItemUpdate:y,itemsLoading:f},children:r(M,{"data-testid":"cart-item-remove-button",className:L(["dropin-cart-item__remove"]),variant:"tertiary",onClick:()=>N(t,0),disabled:f.has(t.uid),icon:r(Z,{"data-testid":"cart-item-remove-icon",source:ye,size:"24",stroke:"2",viewBox:"0 0 24 24","aria-label":((e=c.remove)==null?void 0:e.replace("{product}",P(t.name)))||c.removeDefault})})})},Ht=t=>{if(!d.includes("quantity")&&G)return r(m,{name:"ItemQuantity",slot:a==null?void 0:a.ItemQuantity,context:{item:t,enableUpdateItemQuantity:G,handleItemQuantityUpdate:N,itemsLoading:f,handleItemsError:j,handleItemsLoading:R,onItemUpdate:y},children:r(me,{value:t.quantity,min:1,onValue:e=>N(t,Number(e)),name:"quantity",disabled:f.has(t.uid),"aria-label":c.quantity})})},_t=t=>i!=null&&i.totalQuantity?i.items.filter(t).map((e,n)=>{var v;const{totalProps:o,discountProps:s}=yt(e),u=r(le,{updating:f==null?void 0:f.has(e.uid),loading:q,"data-testid":`cart-list-item-entry-${e.uid}`,image:lt(e,n),title:r(m,{name:"ItemTitle",slot:a==null?void 0:a.ItemTitle,context:{item:e},children:mt(e)}),sku:d.includes("sku")?void 0:r(m,{name:"ItemSku",slot:a==null?void 0:a.ItemSku,context:{item:e},children:kt(e)}),price:d.includes("price")?void 0:r(m,{name:"ItemPrice",slot:a==null?void 0:a.ItemPrice,context:{item:e},slotTag:"span",children:r(X,{...ft(e)})}),quantity:d.includes("quantity")?void 0:e.quantity,quantityContent:Ht(e),total:w(z,{children:[d.includes("total")?void 0:r(m,{name:"ItemTotal",slot:a==null?void 0:a.ItemTotal,context:{item:e},children:r(X,{...o})}),d.includes("totalDiscount")?void 0:s&&r(m,{name:"ItemTotal",slot:a==null?void 0:a.ItemTotal,context:{item:e},children:r(X,{...s})})]}),attributes:It(e),configurations:gt(e),totalExcludingTax:d.includes("totalExcludingTax")?void 0:vt(e),taxIncluded:(l==null?void 0:l.price)==="INCLUDING_TAX",taxExcluded:!d.includes("totalExcludingTax")&&(l==null?void 0:l.price)==="INCLUDING_EXCLUDING_TAX",warning:pt(e),alert:Ct(e),quantityType:it,dropdownOptions:ct,onQuantity:G&&!f.has(e.uid)?C=>{N(e,C)}:void 0,onRemove:b&&!f.has(e.uid)?()=>N(e,0):void 0,discount:rt&&e.discounted&&e.discountPercentage?r("div",{"data-testid":"item-discount-percent",children:c.discountPercent.replace("{discount}",((v=e.discountPercentage)==null?void 0:v.toString())??"")}):void 0,savings:at&&e.discounted&&e.savingsAmount?w("div",{children:[r("span",{children:r(X,{...ht(e)})})," ",c.savingsAmount]}):void 0,rowTotalFooter:wt(e),footer:St(e),removeContent:Mt(e)},e.uid);return r(m,{name:"CartItem",slot:a==null?void 0:a.CartItem,context:{item:e,index:n,enableUpdateItemQuantity:G,enableRemoveItem:b,itemsLoading:f,loading:q,attributesToHide:d,cartTaxesConfig:l,quantityType:it,dropdownOptions:ct,showDiscount:rt,showSavings:at,dictionary:c,getImage:lt,getTitle:mt,getSku:kt,getPriceProps:ft,getTotalPriceProps:yt,getProductAttributes:It,getConfiguration:gt,getTotalExcludingTax:vt,getWarning:pt,getAlert:Ct,getRowTotalFooter:wt,getFooter:St,getSavingsAmount:ht},children:u},e.uid)}):null,xt=r(m,{name:"Heading",slot:a==null?void 0:a.Heading,context:{count:i==null?void 0:i.totalQuantity},children:r("div",{"data-testid":"default-cart-heading",children:c.heading.replace("({count})",i!=null&&i.totalQuantity?`(${i==null?void 0:i.totalQuantity.toString()})`:"")})}),te=xt.props.children.props.children,ee=()=>{const t=i==null?void 0:i.items.filter(e=>e.outOfStock);t==null||t.forEach(e=>{N(e,0)})},ne=_t(t=>t.outOfStock||t.insufficientQuantity||!1),At=i!=null&&i.hasOutOfStockItems?r($t,{"data-testid":"cart-out-of-stock-message",icon:r(Z,{source:Ft,size:"16"}),itemList:r(Y,{"data-testid":"out-of-stock-cart-items",children:ne}),type:"warning",heading:c.outOfStockHeading,description:c.outOfStockDescription,variant:"primary",actionButtonPosition:"bottom",additionalActions:i!=null&&i.hasFullyOutOfStockItems&&b?[{label:c.removeAction,onClick:ee}]:void 0}):void 0,p=_t(t=>!t.outOfStock&&!t.insufficientQuantity),Ot=E?Math.max(g||5,5):Math.min((i==null?void 0:i.totalQuantity)||5,5),Nt=(i==null?void 0:i.totalQuantity)>Ot,re=Nt&&!E&&Ot!=g,D=i!=null&&i.totalQuantity&&p?r(m,{name:"Footer",slot:a==null?void 0:a.CartSummaryFooter,context:{displayMaxItems:E,routeCart:h},"data-testid":"cart-cart-summary-footer-slot",className:"cart-cart-summary-footer",children:Nt?re?r(M,{className:"cart-cart-summary-list-footer__action",onClick:Zt,"data-testid":"view-more-items-button",variant:"tertiary",children:c.viewMore}):h&&r(M,{className:"cart-cart-summary-list-footer__action",href:h(),variant:"tertiary","data-testid":"view-cart-or-less-items-button",children:c.viewAll}):h&&r(M,{className:"cart-cart-summary-list-footer__action",href:h(),variant:"tertiary","data-testid":"view-cart-button",children:c.viewAll})}):null,Pt=()=>{if(!(i!=null&&i.items))return null;const t=[],e=i.items,n=a==null?void 0:a.UndoBanner,o=E?Math.max(g||(i==null?void 0:i.totalQuantity),5):Math.min(g??5,5);for(let s=0;s<=o;s++)Q&&A.filter(u=>u.index===s).forEach(({item:u,error:v,beingRemoved:C})=>{var S,F;const k=r($t,{type:v?"error":"info",heading:C?(S=c.itemBeingRemoved)==null?void 0:S.replace("{product}",P(u.name)):(F=c.itemRemoved)==null?void 0:F.replace("{product}",P(u.name)),description:v||c.itemRemovedDescription,variant:"primary",actionButtonPosition:"bottom",additionalActions:C?[]:[{label:c.undoAction,onClick:()=>V(u.uid),"aria-label":`${c.undoAction} remove ${P(u.name)}`},{label:c.dismissAction,onClick:()=>dt(u.uid),"aria-label":`${c.dismissAction} undo for ${P(u.name)}`}]},`undo-banner-${u.uid}`);t.push(n?r(m,{name:"UndoBanner",slot:n,context:{item:u,loading:q,error:v,onUndo:()=>V(u.uid),onDismiss:()=>dt(u.uid)},children:k},`undo-banner-${u.uid}`):k)}),s<o&&s<e.length&&t.push((p==null?void 0:p[s])||null);return r(Y,{"data-testid":"cart-list",children:t})},V=Tt(async t=>{O(n=>n.map(o=>o.item.uid===t?{...o,loading:!0,error:void 0}:o));const e=A.find(n=>n.item.uid===t);if(e)try{await he([{sku:e.item.sku,parentSku:e.item.topLevelSku,quantity:e.item.quantity,optionsUIDs:e.item.bundleOptionsUIDs||(e.item.selectedOptionsUIDs?Object.values(e.item.selectedOptionsUIDs):void 0),enteredOptions:e.item.customizableOptions?Object.entries(e.item.customizableOptions).map(([n,o])=>({uid:n,value:o})):void 0}]),O(n=>n.filter(o=>o.item.uid!==t))}catch(n){O(o=>o.map(s=>s.item.uid===t?{...s,error:(n==null?void 0:n.message)||"Failed to restore item."}:s))}},[A]);ie(jt,()=>({handleUndo:V}),[V]);const Lt=r(z,{children:Q&&A.length>0?Pt():r(m,{name:"EmptyCart",slot:a==null?void 0:a.EmptyCart,context:{},children:r(ce,{"data-testid":"empty-cart",ctaLinkURL:B==null?void 0:B()})})}),bt=i!=null&&i.totalQuantity||Q&&A.length>0?Q?A.length>0?Pt():r(Y,{"data-testid":"cart-list",children:p==null?void 0:p.slice(0,E?Math.max(g||(i==null?void 0:i.totalQuantity),5):Math.min(g??5,5))}):r(Y,{"data-testid":"cart-list",children:p==null?void 0:p.slice(0,E?Math.max(g||(i==null?void 0:i.totalQuantity),5):Math.min(g??5,5))}):null;return zt?r(ue,{"data-testid":"cart-summary-list-accordion",className:L(["cart-cart-summary-list-accordion",`cart-cart-summary-list__background--${et}`]),iconOpen:Ie,iconClose:pe,children:r(de,{title:te,"data-testid":"cart-summary-list-accordion__section",open:!0,renderContentWhenClosed:!0,children:r(Ut,{...st,"aria-expanded":!0,"aria-label":"TEST",className:"cart-cart-summary-list-accordion__list",loading:q,footer:_?void 0:D||(h?D:void 0),emptyCart:Lt,products:bt,outOfStockMessage:At,variant:et})})}):r(Ut,{...st,heading:H?void 0:xt,footer:_?void 0:D||(h?D:void 0),loading:q,emptyCart:Lt,products:bt,outOfStockMessage:At,variant:et})});Se.getInitialData=async function(){return Xt()};export{Se as C};
4
4
  //# sourceMappingURL=CartSummaryList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CartSummaryList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/ChevronRight.svg","/@dropins/storefront-cart/src/components/CartSummaryList/CartSummaryList.tsx","/@dropins/storefront-cart/src/lib/decodeHTMLEntities.ts","/@dropins/storefront-cart/src/containers/CartSummaryList/CartSummaryList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Chevron_right_Base\", \"data-name\": \"Icon \\\\u2013 Chevron right \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Chevron_right_icon\", \"data-name\": \"Chevron right icon\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", id: \"chevron\", d: \"M199.75,367.5l4.255,-4.255-4.255,-4.255\", transform: \"translate(-189.25 -351.0)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgChevronRight;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { Divider, Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\n\nimport '@/cart/components/CartSummaryList/CartSummaryList.css';\nexport interface CartSummaryListProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n heading?: VNode | null;\n footer?: VNode | null;\n emptyCart: VNode;\n products?: VNode | null;\n outOfStockMessage?: VNode | null;\n loading?: boolean;\n variant?: 'primary' | 'secondary';\n}\n\nexport const CartSummaryList: FunctionComponent<CartSummaryListProps> = ({\n className,\n children,\n heading,\n footer,\n emptyCart,\n products,\n outOfStockMessage,\n variant = 'primary',\n loading = true,\n ...props\n}) => {\n return (\n <div\n {...props}\n className={classes([\n 'cart-cart-summary-list',\n className,\n `cart-cart-summary-list__background--${variant}`,\n ])}\n >\n {loading ? (\n <CartSummaryListSkeleton />\n ) : (\n <>\n {(heading || outOfStockMessage) && (\n <div\n data-testid=\"cart-summary-list-heading-wrapper\"\n className={classes([\n 'cart-cart-summary-list__heading',\n ['cart-cart-summary-list__heading--full-width', !products],\n ])}\n >\n {heading && (\n <>\n <VComponent\n node={heading}\n className=\"cart-cart-summary-list__heading-text\"\n />\n <Divider\n variant=\"primary\"\n className={classes([\n 'cart-cart-summary-list__heading-divider',\n ])}\n />\n </>\n )}\n\n {outOfStockMessage && (\n <VComponent\n node={outOfStockMessage}\n className=\"cart-cart-summary-list__out-of-stock-message\"\n />\n )}\n </div>\n )}\n <div\n className={classes([\n 'cart-cart-summary-list__content',\n ['cart-cart-summary-list__content--empty', !products],\n ])}\n >\n {products || (\n <VComponent\n node={emptyCart}\n className=\"cart-cart-summary-list__empty-cart\"\n />\n )}\n </div>\n\n {footer && (\n <>\n <Divider\n variant=\"primary\"\n className={classes(['cart-cart-summary-list__footer-divider'])}\n />\n <VComponent\n node={footer}\n className=\"cart-cart-summary-list__footer-text\"\n />\n </>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst CartSummaryListSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n data-testid=\"cart-summary-list-skeleton\"\n className=\"cart-cart-summary-list__skeleton\"\n rowGap=\"medium\"\n >\n <SkeletonRow\n variant=\"row\"\n size=\"xlarge\"\n fullWidth={true}\n lines={3}\n multilineGap=\"small\"\n />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * Decodes HTML entities in a string (e.g., &quot; -> \", &amp; -> &)\n * Uses DOMParser to safely decode entities and extract text content.\n * Note: This will also strip any HTML tags from the decoded result.\n * @param text - The text containing HTML entities to decode\n * @returns The decoded text with HTML entities converted to their characters\n */\nexport const decodeHTMLEntities = (text: string): string => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(text, 'text/html');\n return doc.body.textContent || '';\n};\n\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n useImperativeHandle,\n forwardRef,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps, classes } from '@adobe-commerce/elsie/lib';\n\nimport {\n CartSummaryList as CartSummaryListComponent,\n EmptyCart,\n} from '@/cart/components';\n\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { decodeHTMLEntities } from '@/cart/lib/decodeHTMLEntities';\nimport { CartModel } from '@/cart/data/models/cart-model';\nimport {\n Accordion,\n AccordionSection,\n Button,\n CartItem,\n CartList,\n Icon,\n Image,\n ImageProps,\n InLineAlert,\n Price,\n PriceProps,\n Incrementer,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { VNode } from 'preact';\nimport { events, Cart } from '@adobe-commerce/event-bus';\nimport { state } from '@/cart/lib/state';\nimport {\n ChevronDown,\n ChevronRight,\n OrderError,\n WarningWithCircle,\n Trash,\n} from '@adobe-commerce/elsie/icons';\nimport { updateProductsFromCart } from '@/cart/api';\nimport { addProductsToCart } from '@/cart/api/addProductsToCart/addProductsToCart';\n\nexport interface CartSummaryListProps extends HTMLAttributes<HTMLDivElement> {\n hideHeading?: boolean;\n hideFooter?: boolean;\n routeProduct?: (item: CartModel['items'][0]) => string;\n routeEmptyCartCTA?: () => string;\n routeCart?: () => string;\n onItemUpdate?: ({ item }: { item: CartModel['items'][0] }) => void;\n onItemRemove?: ({ item }: { item: CartModel['items'][0] }) => void;\n maxItems?: number; // Maximum number of items to display\n showMaxItems?: boolean;\n attributesToHide?: SwitchableAttributes[]; // Product attributes to hide\n slots?: {\n Heading?: SlotProps;\n EmptyCart?: SlotProps;\n Footer?: SlotProps;\n Thumbnail?: SlotProps<{\n item: CartModel['items'][number];\n defaultImageProps: ImageProps;\n }>;\n ProductAttributes?: SlotProps;\n CartSummaryFooter?: SlotProps;\n CartItem?: SlotProps;\n UndoBanner?: SlotProps<{\n item: CartModel['items'][0];\n loading: boolean;\n error?: string;\n onUndo: () => void;\n onDismiss: () => void;\n }>;\n ItemTitle?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemPrice?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemQuantity?: SlotProps<{\n item: CartModel['items'][number];\n enableUpdateItemQuantity: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n itemsLoading: Set<string>;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n }>;\n ItemTotal?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemSku?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemRemoveAction?: SlotProps<{\n item: CartModel['items'][number];\n enableRemoveItem: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n itemsLoading: Set<string>;\n }>;\n };\n enableRemoveItem?: boolean;\n enableUpdateItemQuantity?: boolean;\n onItemsErrorsChange?: (errors: Map<string, string>) => void;\n accordion?: boolean;\n variant?: 'primary' | 'secondary';\n isLoading?: boolean;\n showDiscount?: boolean;\n showSavings?: boolean;\n quantityType?: 'stepper' | 'dropdown';\n dropdownOptions?: { value: string; text: string }[];\n undo?: boolean;\n /**\n * TEST ONLY: Allows test to inject recentlyRemovedItems for coverage\n */\n __testRecentlyRemovedItems?: Array<{\n item: CartModel['items'][0];\n index: number;\n loading: boolean;\n error?: string;\n beingRemoved?: boolean;\n }>;\n}\n\n// Attributes that can be hidden or shown\nexport type SwitchableAttributes =\n | 'name'\n | 'image'\n | 'configurations'\n | 'warning'\n | 'alert'\n | 'sku'\n | 'price'\n | 'quantity'\n | 'total'\n | 'totalDiscount'\n | 'totalExcludingTax';\n\n// Ref interface for exposing functions to tests\nexport interface CartSummaryListRef {\n handleUndo: (uid: string) => Promise<void>;\n}\n\nexport const CartSummaryList: Container<\n CartSummaryListProps,\n CartModel | null\n> = forwardRef<\n CartSummaryListRef,\n CartSummaryListProps & { initialData?: CartModel | null }\n>(\n (\n {\n initialData = null,\n hideHeading,\n hideFooter,\n routeProduct,\n routeEmptyCartCTA,\n routeCart,\n onItemUpdate,\n onItemRemove,\n maxItems, //if maxItems is not provided, default to show all items\n slots,\n attributesToHide = [],\n enableRemoveItem,\n enableUpdateItemQuantity,\n onItemsErrorsChange,\n accordion = false,\n variant = 'primary',\n isLoading,\n showMaxItems,\n showDiscount,\n showSavings,\n quantityType,\n dropdownOptions,\n undo = false,\n __testRecentlyRemovedItems,\n ...props\n },\n ref\n ) => {\n const [loading, setLoading] = useState(!initialData);\n\n const [cartModelData, setCartModelData] = useState<CartModel | null>(\n initialData\n );\n const [itemsLoading, setItemLoading] = useState<Set<string>>(new Set());\n\n const [itemsErrors, setItemErrors] = useState<Map<string, string>>(\n new Map()\n );\n\n const [recentlyRemovedItems, setRecentlyRemovedItems] = useState<\n {\n item: CartModel['items'][0];\n index: number;\n loading: boolean;\n error?: string;\n beingRemoved?: boolean;\n }[]\n >(__testRecentlyRemovedItems || []);\n\n // TEST ONLY: allow test to update recentlyRemovedItems after mount\n useEffect(() => {\n if (\n process.env.NODE_ENV === 'test' &&\n __testRecentlyRemovedItems &&\n recentlyRemovedItems !== __testRecentlyRemovedItems\n ) {\n setRecentlyRemovedItems(__testRecentlyRemovedItems);\n }\n }, [__testRecentlyRemovedItems, recentlyRemovedItems]);\n\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n\n const [displayMaxItems, setDisplayMaxItems] = useState<boolean>(\n showMaxItems ? true : !maxItems && !showMaxItems\n );\n\n const dictionary = useText({\n file: 'Cart.CartItem.file',\n files: 'Cart.CartItem.files',\n heading: 'Cart.Cart.heading',\n message: 'Cart.CartItem.message',\n recipient: 'Cart.CartItem.recipient',\n regularPrice: 'Cart.CartItem.regularPrice',\n discountedPrice: 'Cart.CartItem.discountedPrice',\n sender: 'Cart.CartItem.sender',\n lowInventory: 'Cart.CartItem.lowInventory',\n insufficientQuantity: 'Cart.CartItem.insufficientQuantity',\n insufficientQuantityGeneral: 'Cart.CartItem.insufficientQuantityGeneral',\n outOfStockHeading: 'Cart.OutOfStockMessage.heading',\n outOfStockDescription: 'Cart.OutOfStockMessage.message',\n outOfStockAlert: 'Cart.OutOfStockMessage.alert',\n removeAction: 'Cart.OutOfStockMessage.action',\n notAvailableMessage: 'Cart.CartItem.notAvailableMessage',\n viewMore: 'Cart.Cart.viewMore',\n viewAll: 'Cart.Cart.viewAll',\n discountPercent: 'Cart.CartItem.discountPercentage',\n savingsAmount: 'Cart.CartItem.savingsAmount',\n itemBeingRemoved: 'Cart.CartItem.itemBeingRemoved',\n itemRemoved: 'Cart.CartItem.itemRemoved',\n itemRemovedDescription: 'Cart.CartItem.itemRemovedDescription',\n undoAction: 'Cart.CartItem.undoAction',\n dismissAction: 'Cart.CartItem.dismissAction',\n remove: 'Dropin.CartItem.remove.label',\n removeDefault: 'Dropin.CartItem.removeDefault.label',\n quantity: 'Dropin.CartItem.quantity.label',\n });\n\n const handleItemsLoading = (uid: string, state: boolean) => {\n setItemLoading((prev) => {\n state ? prev.add(uid) : prev.delete(uid);\n return new Set(prev);\n });\n };\n\n const handleItemsError = (uid: string, message?: string) => {\n setItemErrors((prev) => {\n message ? prev.set(uid, message) : prev.delete(uid);\n return new Map(prev);\n });\n };\n\n // Helper to add to recently removed items for undo\n function addToRecentlyRemovedItems(uid: string) {\n const cart = getPersistedCartData();\n const item = cart?.items.find((i) => i.uid === uid);\n if (item) {\n setRecentlyRemovedItems((prev) => {\n const index = cart.items.findIndex((i) => i.uid === uid);\n if (index !== -1 && !prev.some((r) => r.item.uid === uid)) {\n // Emit the event for analytics or listeners\n events.emit('cart/product/removed', { item, index });\n return [\n ...prev,\n { item, index, error: undefined, beingRemoved: true },\n ];\n }\n return prev;\n });\n }\n }\n\n const handleItemQuantityUpdate = (\n item: CartModel['items'][0],\n quantity: number\n ) => {\n // initial values\n handleItemsLoading(item.uid, true);\n\n // Reset temporary error messages\n setItemErrors(new Map());\n\n if (enableRemoveItem && quantity === 0) {\n // Add to recently removed items for undo\n addToRecentlyRemovedItems(item.uid);\n // use callback for removing (original logic)\n updateProductsFromCart([{ uid: item.uid, quantity }])\n .then(() => {\n onItemRemove?.({ item });\n })\n .finally(() => {\n handleItemsLoading(item.uid, false);\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === item.uid ? { ...r, beingRemoved: false } : r\n )\n );\n })\n .catch((error: any) => {\n console.warn(error);\n });\n }\n // use callback for updating\n else {\n enableUpdateItemQuantity &&\n updateProductsFromCart([{ uid: item.uid, quantity }])\n .then(() => {\n onItemUpdate?.({ item });\n })\n .finally(() => {\n handleItemsLoading(item.uid, false);\n })\n .catch((error: Error) => {\n handleItemsError(item.uid, error.message);\n });\n }\n };\n\n const handleDismiss = (uid: string) => {\n setRecentlyRemovedItems((prev) => prev.filter((r) => r.item.uid !== uid));\n };\n\n // Display max items\n const handleMaxItemsView = useCallback(() => {\n setDisplayMaxItems((prev) => !prev);\n }, []);\n\n useEffect(() => {\n const cartDataEvent = events.on(\n 'cart/data',\n (payload: Cart | null) => {\n setCartModelData(payload as CartModel);\n setLoading(!!isLoading);\n },\n { eager: true }\n );\n\n return () => {\n cartDataEvent?.off();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Clear recently removed items when undo is disabled\n useEffect(() => {\n if (!undo) {\n setRecentlyRemovedItems([]);\n }\n }, [undo]);\n\n // Call onItemsErrorsChange whenever itemsErrors changes\n useEffect(() => {\n if (onItemsErrorsChange) {\n onItemsErrorsChange(itemsErrors);\n }\n }, [itemsErrors, onItemsErrorsChange]);\n\n // Helper functions\n const getImage = (item: CartModel['items'][0], index: number) => {\n if (attributesToHide.includes('image')) {\n return undefined;\n }\n\n const defaultImageProps: ImageProps = {\n loading: index < 4 ? 'eager' : 'lazy',\n src: item.image.src,\n alt: item.image.alt,\n width: '300',\n height: '300',\n params: { width: 300 },\n };\n\n const imageComponent = (\n <Image data-testid=\"cart-list-item-image\" {...defaultImageProps} />\n );\n return (\n <Slot\n name=\"Thumbnail\"\n slot={slots?.Thumbnail}\n context={{\n item,\n defaultImageProps,\n }}\n >\n {routeProduct ? (\n <a href={routeProduct(item)}>{imageComponent}</a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const getTitle = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('name')) {\n return undefined;\n }\n\n return (\n <span data-testid=\"cart-list-item-title\">\n {routeProduct ? (\n <a href={routeProduct(item)}>{decodeHTMLEntities(item.name)}</a>\n ) : (\n decodeHTMLEntities(item.name)\n )}\n </span>\n );\n };\n\n const getConfiguration = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('configurations')) {\n return undefined;\n }\n\n const configuration = {\n ...item.bundleOptions,\n ...item.selectedOptions,\n ...item.customizableOptions,\n ...(item.recipient ? { [dictionary.recipient]: item.recipient } : null),\n ...(item.recipientEmail && item.recipient\n ? {\n [dictionary.recipient]: `${item.recipient} (${item.recipientEmail})`,\n }\n : null),\n ...(item.sender ? { [dictionary.sender]: item.sender } : null),\n ...(item.senderEmail && item.sender\n ? {\n [dictionary.sender]: `${item.sender} (${item.senderEmail})`,\n }\n : {}),\n ...(item.message ? { [dictionary.message]: item.message } : null),\n ...(item.links && item.links.count\n ? item.links.count > 1\n ? {\n [dictionary.files.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : {\n [dictionary.file.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : null),\n };\n\n if (Object.keys(configuration).length === 0) {\n return undefined;\n }\n\n return configuration;\n };\n\n const getPriceProps = (item: CartModel['items'][0]) => {\n return cartTaxesConfig?.price === 'INCLUDING_TAX'\n ? item.discounted\n ? {\n amount: item.regularPrice.value,\n currency: item.regularPrice.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.taxedPrice?.value,\n currency: item.taxedPrice?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.regularPrice?.value,\n currency: item.regularPrice?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'regular-item-price',\n };\n };\n\n const getSavingsAmount = (item: CartModel['items'][0]) => {\n return {\n amount: item.savingsAmount?.value,\n currency: item.savingsAmount?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'item-savings-amount',\n };\n };\n\n const getTotalExcludingTax = (item: CartModel['items'][0]) => {\n return cartTaxesConfig?.price === 'INCLUDING_EXCLUDING_TAX' ? (\n <Price\n amount={item.rowTotal.value}\n currency={item.rowTotal.currency}\n data-testid=\"excluding-tax-total\"\n aria-label={dictionary.regularPrice}\n />\n ) : undefined;\n };\n\n const getTotalPriceProps = (item: CartModel['items'][0]) => {\n const totalProps: PriceProps = {\n 'aria-label': dictionary.regularPrice,\n };\n const discountProps: PriceProps | null = item.discounted ? {} : null;\n\n if (\n ['INCLUDING_TAX', 'INCLUDING_EXCLUDING_TAX'].includes(\n cartTaxesConfig?.price as string\n )\n ) {\n totalProps['amount'] = item.rowTotalIncludingTax?.value;\n totalProps['currency'] = item.rowTotalIncludingTax?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore\n totalProps['data-testid'] = 'including-tax-item-total';\n\n if (discountProps) {\n totalProps['amount'] = item.total?.value;\n totalProps['currency'] = item.total?.currency;\n\n discountProps['amount'] = item.rowTotalIncludingTax?.value;\n discountProps['currency'] = item.rowTotalIncludingTax?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = dictionary.discountedPrice;\n // @ts-ignore\n discountProps['data-testid'] = 'discount-total';\n }\n } else {\n totalProps['amount'] = item.total?.value;\n totalProps['currency'] = item.total?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore\n totalProps['data-testid'] = 'regular-item-total';\n\n if (discountProps) {\n discountProps['amount'] = item.discountedTotal?.value;\n discountProps['currency'] = item.discountedTotal?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = dictionary.regularPrice;\n // @ts-ignore\n discountProps['data-testid'] = 'discount-total';\n }\n }\n\n return {\n totalProps,\n discountProps,\n };\n };\n\n const getWarning = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('warning')) {\n return undefined;\n }\n\n const error = itemsErrors.get(item.uid);\n const quantityError = itemsErrors\n .get(item.uid)\n ?.includes('The requested qty is not available');\n const itemIsLoading = itemsLoading.has(item.uid);\n\n const insufficientQuantityText =\n item.insufficientQuantity && item.stockLevel\n ? item.stockLevel === 'noNumber'\n ? dictionary.insufficientQuantityGeneral\n : dictionary.insufficientQuantity\n .replace('{inventory}', item.stockLevel?.toString())\n .replace('{count}', item.quantity.toString())\n : '';\n\n const lowInventoryText =\n item.lowInventory &&\n item.onlyXLeftInStock &&\n dictionary.lowInventory.replace(\n '{count}',\n item.onlyXLeftInStock?.toString()\n );\n\n const notAvailableQuantity =\n !item.outOfStock && error && quantityError\n ? dictionary.notAvailableMessage\n : error;\n\n return !itemIsLoading &&\n (error || item.insufficientQuantity || item.lowInventory) ? (\n <span data-testid=\"item-warning\">\n <Icon source={WarningWithCircle} size={'16'} />\n {notAvailableQuantity || insufficientQuantityText || lowInventoryText}\n </span>\n ) : undefined;\n };\n\n const getAlert = (item: CartModel['items'][0]) => {\n if (attributesToHide?.includes('alert')) {\n return undefined;\n }\n const itemIsLoading = itemsLoading.has(item.uid);\n\n return !itemIsLoading && item.outOfStock ? (\n <span data-testid=\"item-alert\">\n <Icon source={OrderError} size={'16'} />\n {dictionary.outOfStockAlert}\n </span>\n ) : undefined;\n };\n\n const getProductAttributes = (item: CartModel['items'][0]) => {\n return (\n <Slot\n name=\"ProductAttributes\"\n slot={slots?.ProductAttributes}\n context={{\n item,\n }}\n />\n );\n };\n\n const getSku = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('sku')) {\n return undefined;\n }\n return <span data-testid=\"cart-list-item-sku\">{item.sku}</span>;\n };\n\n const getFooter = (item: CartModel['items'][0]) => {\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ item, handleItemsLoading, handleItemsError, onItemUpdate }}\n />\n );\n };\n\n const getRemoveContent = (item: CartModel['items'][0]) => {\n if (!enableRemoveItem) {\n return undefined;\n }\n\n return (\n <Slot\n name=\"ItemRemoveAction\"\n slot={slots?.ItemRemoveAction}\n context={{\n item,\n enableRemoveItem,\n handleItemQuantityUpdate,\n handleItemsError,\n handleItemsLoading,\n onItemUpdate,\n itemsLoading,\n }}\n >\n {/* Default remove button */}\n <Button\n data-testid=\"cart-item-remove-button\"\n className={classes(['dropin-cart-item__remove'])}\n variant=\"tertiary\"\n onClick={() => handleItemQuantityUpdate(item, 0)}\n disabled={itemsLoading.has(item.uid)}\n icon={\n <Icon\n data-testid=\"cart-item-remove-icon\"\n source={Trash}\n size=\"24\"\n stroke=\"2\"\n viewBox=\"0 0 24 24\"\n aria-label={\n dictionary.remove?.replace('{product}', decodeHTMLEntities(item.name)) ||\n dictionary.removeDefault\n }\n />\n }\n />\n </Slot>\n );\n };\n\n const getQuantityContent = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('quantity')) {\n return undefined;\n }\n\n if (!enableUpdateItemQuantity) {\n return undefined;\n }\n\n return (\n <Slot\n name=\"ItemQuantity\"\n slot={slots?.ItemQuantity}\n context={{\n item,\n enableUpdateItemQuantity,\n handleItemQuantityUpdate,\n itemsLoading,\n handleItemsError,\n handleItemsLoading,\n onItemUpdate,\n }}\n >\n <Incrementer\n value={item.quantity}\n min={1}\n onValue={(value) => handleItemQuantityUpdate(item, Number(value))}\n name=\"quantity\"\n disabled={itemsLoading.has(item.uid)}\n aria-label={dictionary.quantity}\n />\n </Slot>\n );\n };\n\n // Re-usable function to get a filtered list of cart items\n const getCartItemEntries = (\n filterCallback: (item: CartModel['items'][0]) => boolean\n ) => {\n return cartModelData?.totalQuantity\n ? cartModelData.items.filter(filterCallback).map((item, index) => {\n const { totalProps, discountProps } = getTotalPriceProps(item);\n\n const defaultCartItem = (\n <CartItem\n updating={itemsLoading?.has(item.uid)}\n loading={loading}\n key={item.uid}\n data-testid={`cart-list-item-entry-${item.uid}`}\n image={getImage(item, index)}\n title={\n <Slot\n name=\"ItemTitle\"\n slot={slots?.ItemTitle}\n context={{ item }}\n >\n {getTitle(item)}\n </Slot>\n }\n sku={\n attributesToHide.includes('sku') ? undefined : (\n <Slot\n name=\"ItemSku\"\n slot={slots?.ItemSku}\n context={{ item }}\n >\n {getSku(item)}\n </Slot>\n )\n }\n price={\n attributesToHide.includes('price') ? undefined : (\n <Slot\n name=\"ItemPrice\"\n slot={slots?.ItemPrice}\n context={{ item }}\n slotTag=\"span\"\n >\n <Price {...getPriceProps(item)} />\n </Slot>\n )\n }\n quantity={\n attributesToHide.includes('quantity')\n ? undefined\n : item.quantity\n }\n quantityContent={getQuantityContent(item)}\n total={\n <>\n {attributesToHide.includes('total') ? undefined : (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...totalProps} />\n </Slot>\n )}\n {attributesToHide.includes('totalDiscount')\n ? undefined\n : discountProps && (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...discountProps} />\n </Slot>\n )}\n </>\n }\n attributes={getProductAttributes(item)}\n configurations={getConfiguration(item)}\n totalExcludingTax={\n attributesToHide.includes('totalExcludingTax')\n ? undefined\n : getTotalExcludingTax(item)\n }\n taxIncluded={cartTaxesConfig?.price === 'INCLUDING_TAX'}\n taxExcluded={\n !attributesToHide.includes('totalExcludingTax') &&\n cartTaxesConfig?.price === 'INCLUDING_EXCLUDING_TAX'\n }\n warning={getWarning(item)}\n alert={getAlert(item)}\n quantityType={quantityType}\n dropdownOptions={dropdownOptions}\n onQuantity={\n enableUpdateItemQuantity && !itemsLoading.has(item.uid)\n ? (newQuantity) => {\n handleItemQuantityUpdate(item, newQuantity);\n }\n : undefined\n }\n onRemove={\n enableRemoveItem && !itemsLoading.has(item.uid)\n ? () => handleItemQuantityUpdate(item, 0)\n : undefined\n }\n discount={\n showDiscount && item.discounted && item.discountPercentage ? (\n <div data-testid=\"item-discount-percent\">\n {dictionary.discountPercent.replace(\n '{discount}',\n item.discountPercentage?.toString() ?? ''\n )}\n </div>\n ) : undefined\n }\n savings={\n showSavings && item.discounted && item.savingsAmount ? (\n <div>\n <span>\n <Price {...getSavingsAmount(item)} />\n </span>\n &nbsp;\n {dictionary.savingsAmount}\n </div>\n ) : undefined\n }\n footer={getFooter(item)}\n removeContent={getRemoveContent(item)}\n />\n );\n\n return (\n <Slot\n key={item.uid}\n name=\"CartItem\"\n slot={slots?.CartItem}\n context={{\n item,\n index,\n enableUpdateItemQuantity,\n enableRemoveItem,\n itemsLoading,\n loading,\n attributesToHide,\n cartTaxesConfig,\n quantityType,\n dropdownOptions,\n showDiscount,\n showSavings,\n dictionary,\n getImage,\n getTitle,\n getSku,\n getPriceProps,\n getTotalPriceProps,\n getProductAttributes,\n getConfiguration,\n getTotalExcludingTax,\n getWarning,\n getAlert,\n getFooter,\n getSavingsAmount,\n }}\n >\n {defaultCartItem}\n </Slot>\n );\n })\n : null;\n };\n\n const heading = (\n <Slot\n name=\"Heading\"\n slot={slots?.Heading}\n context={{\n count: cartModelData?.totalQuantity,\n }}\n >\n <div data-testid=\"default-cart-heading\">\n {dictionary.heading.replace(\n '({count})',\n cartModelData?.totalQuantity\n ? `(${cartModelData?.totalQuantity.toString()})`\n : ''\n )}\n </div>\n </Slot>\n );\n\n // Heading Section text for screen reader\n const headingSection = heading.props.children.props.children;\n\n // Out of Stock Items\n const handleRemoveOutOfStockItems = () => {\n const outOfStockItems = cartModelData?.items.filter(\n (item) => item.outOfStock\n );\n\n outOfStockItems?.forEach((item) => {\n handleItemQuantityUpdate(item, 0);\n });\n };\n\n const outOfStockEntries = getCartItemEntries(\n (item) => item.outOfStock || item.insufficientQuantity || false\n );\n\n const outOfStockMessage = cartModelData?.hasOutOfStockItems ? (\n <InLineAlert\n data-testid=\"cart-out-of-stock-message\"\n icon={<Icon source={OrderError} size={'16'} />}\n itemList={\n <CartList data-testid=\"out-of-stock-cart-items\">\n {outOfStockEntries}\n </CartList>\n }\n type=\"warning\"\n heading={dictionary.outOfStockHeading}\n description={dictionary.outOfStockDescription}\n variant=\"primary\"\n actionButtonPosition=\"bottom\"\n additionalActions={\n cartModelData?.hasFullyOutOfStockItems && enableRemoveItem\n ? [\n {\n label: dictionary.removeAction,\n onClick: handleRemoveOutOfStockItems,\n },\n ]\n : undefined\n }\n />\n ) : undefined;\n\n // Main Product Entries\n const mainProductEntries = getCartItemEntries(\n (item) => !item.outOfStock && !item.insufficientQuantity\n );\n\n const numOfVisibleItems = displayMaxItems\n ? Math.max(maxItems || 5, 5)\n : Math.min(cartModelData?.totalQuantity || 5, 5);\n\n const hasHiddenItems = cartModelData?.totalQuantity > numOfVisibleItems;\n\n const canDisplayMoreItems =\n hasHiddenItems && !displayMaxItems && numOfVisibleItems != maxItems;\n\n const footerActions =\n cartModelData?.totalQuantity && mainProductEntries ? (\n <Slot\n name=\"Footer\"\n slot={slots?.CartSummaryFooter}\n context={{ displayMaxItems, routeCart }}\n data-testid=\"cart-cart-summary-footer-slot\"\n className=\"cart-cart-summary-footer\"\n >\n {hasHiddenItems ? (\n canDisplayMoreItems ? (\n <Button\n className=\"cart-cart-summary-list-footer__action\"\n onClick={handleMaxItemsView}\n data-testid=\"view-more-items-button\"\n variant=\"tertiary\"\n >\n {dictionary.viewMore}\n </Button>\n ) : (\n routeCart && (\n <Button\n className=\"cart-cart-summary-list-footer__action\"\n href={routeCart()}\n variant=\"tertiary\"\n data-testid=\"view-cart-or-less-items-button\"\n >\n {dictionary.viewAll}\n </Button>\n )\n )\n ) : (\n routeCart && (\n <Button\n className=\"cart-cart-summary-list-footer__action\"\n href={routeCart()}\n variant=\"tertiary\"\n data-testid=\"view-cart-button\"\n >\n {dictionary.viewAll}\n </Button>\n )\n )}\n </Slot>\n ) : null;\n\n const renderCartListWithUndoBanners = () => {\n if (!cartModelData?.items) return null;\n const entries: (VNode | null)[] = [];\n const items = cartModelData.items;\n const UndoBanner = slots?.UndoBanner;\n\n // Calculate how many items to show (same logic as original)\n const numItemsToShow = displayMaxItems\n ? Math.max(!maxItems ? cartModelData?.totalQuantity : maxItems, 5)\n : Math.min(maxItems ?? 5, 5);\n\n // Only process items up to the limit\n for (let i = 0; i <= numItemsToShow; i++) {\n // Render undo banners for this index only if undo is enabled\n if (undo) {\n recentlyRemovedItems\n .filter((r) => r.index === i)\n .forEach(({ item, error, beingRemoved }) => {\n const defaultUndoBanner = (\n <InLineAlert\n key={`undo-banner-${item.uid}`}\n type={error ? 'error' : 'info'}\n heading={\n beingRemoved\n ? dictionary.itemBeingRemoved?.replace(\n '{product}',\n decodeHTMLEntities(item.name)\n )\n : dictionary.itemRemoved?.replace('{product}', decodeHTMLEntities(item.name))\n }\n description={error || dictionary.itemRemovedDescription}\n variant=\"primary\"\n actionButtonPosition=\"bottom\"\n additionalActions={\n beingRemoved\n ? [] // Hide buttons while removing\n : [\n {\n label: dictionary.undoAction,\n onClick: () => handleUndo(item.uid),\n 'aria-label': `${dictionary.undoAction} remove ${decodeHTMLEntities(item.name)}`,\n },\n {\n label: dictionary.dismissAction,\n onClick: () => handleDismiss(item.uid),\n 'aria-label': `${dictionary.dismissAction} undo for ${decodeHTMLEntities(item.name)}`,\n },\n ]\n }\n />\n );\n\n entries.push(\n UndoBanner ? (\n <Slot\n name=\"UndoBanner\"\n slot={UndoBanner}\n context={{\n item,\n loading,\n error,\n onUndo: () => handleUndo(item.uid),\n onDismiss: () => handleDismiss(item.uid),\n }}\n key={`undo-banner-${item.uid}`}\n >\n {defaultUndoBanner}\n </Slot>\n ) : (\n defaultUndoBanner\n )\n );\n });\n }\n // Render cart item if not at the end and within the slice limit\n if (i < numItemsToShow && i < items.length) {\n entries.push(mainProductEntries?.[i] || null);\n }\n }\n return <CartList data-testid=\"cart-list\">{entries}</CartList>;\n };\n // Undo handler implementation\n const handleUndo = useCallback(\n async (uid: string) => {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === uid ? { ...r, loading: true, error: undefined } : r\n )\n );\n const removed = recentlyRemovedItems.find((r) => r.item.uid === uid);\n if (!removed) return;\n try {\n await addProductsToCart([\n {\n sku: removed.item.sku,\n parentSku: removed.item.topLevelSku,\n quantity: removed.item.quantity,\n optionsUIDs:\n removed.item.bundleOptionsUIDs || // Use bundle option UIDs for bundle products\n (removed.item.selectedOptionsUIDs\n ? Object.values(removed.item.selectedOptionsUIDs)\n : undefined),\n enteredOptions: removed.item.customizableOptions\n ? Object.entries(removed.item.customizableOptions).map(\n ([uid, value]) => ({ uid, value })\n )\n : undefined,\n },\n ]);\n setRecentlyRemovedItems((prev) =>\n prev.filter((r) => r.item.uid !== uid)\n );\n } catch (error: any) {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === uid\n ? { ...r, error: error?.message || 'Failed to restore item.' }\n : r\n )\n );\n }\n },\n [recentlyRemovedItems]\n );\n\n // Expose handleUndo to parent components via ref (for testing)\n useImperativeHandle(\n ref,\n () => ({\n handleUndo,\n }),\n [handleUndo]\n );\n\n // Replace the emptyCart definition with conditional rendering for undo banners\n const emptyCart = (\n <>\n {undo && recentlyRemovedItems.length > 0 ? (\n renderCartListWithUndoBanners()\n ) : (\n <Slot name=\"EmptyCart\" slot={slots?.EmptyCart} context={{}}>\n <EmptyCart\n data-testid=\"empty-cart\"\n ctaLinkURL={routeEmptyCartCTA?.()}\n />\n </Slot>\n )}\n </>\n );\n\n // Choose between original product entries and undo banner version\n const productEntries =\n cartModelData?.totalQuantity ||\n (undo && recentlyRemovedItems.length > 0) ? (\n !undo ? (\n <CartList data-testid=\"cart-list\">\n {mainProductEntries?.slice(\n 0,\n displayMaxItems\n ? Math.max(\n !maxItems ? cartModelData?.totalQuantity : maxItems,\n 5\n )\n : Math.min(maxItems ?? 5, 5)\n )}\n </CartList>\n ) : recentlyRemovedItems.length > 0 ? (\n renderCartListWithUndoBanners()\n ) : (\n <CartList data-testid=\"cart-list\">\n {mainProductEntries?.slice(\n 0,\n displayMaxItems\n ? Math.max(\n !maxItems ? cartModelData?.totalQuantity : maxItems,\n 5\n )\n : Math.min(maxItems ?? 5, 5)\n )}\n </CartList>\n )\n ) : null;\n\n return accordion ? (\n <Accordion\n data-testid=\"cart-summary-list-accordion\"\n className={classes([\n `cart-cart-summary-list-accordion`,\n `cart-cart-summary-list__background--${variant}`,\n ])}\n iconOpen={ChevronRight}\n iconClose={ChevronDown}\n >\n <AccordionSection\n title={headingSection}\n data-testid=\"cart-summary-list-accordion__section\"\n open={true}\n renderContentWhenClosed={true}\n >\n <CartSummaryListComponent\n {...props}\n aria-expanded={true}\n aria-label={'TEST'}\n className={`cart-cart-summary-list-accordion__list`}\n loading={loading}\n footer={\n hideFooter\n ? undefined\n : footerActions || (routeCart ? footerActions : undefined)\n }\n emptyCart={emptyCart}\n products={productEntries}\n outOfStockMessage={outOfStockMessage}\n variant={variant}\n />\n </AccordionSection>\n </Accordion>\n ) : (\n <CartSummaryListComponent\n {...props}\n heading={hideHeading ? undefined : heading}\n footer={\n hideFooter\n ? undefined\n : footerActions || (routeCart ? footerActions : undefined)\n }\n loading={loading}\n emptyCart={emptyCart}\n products={productEntries}\n outOfStockMessage={outOfStockMessage}\n variant={variant}\n />\n );\n }\n);\n\nCartSummaryList.getInitialData = async function () {\n return getPersistedCartData();\n};\n"],"names":["SvgChevronRight","props","React","CartSummaryList","className","children","heading","footer","emptyCart","products","outOfStockMessage","variant","loading","jsx","classes","CartSummaryListSkeleton","jsxs","Fragment","VComponent","Divider","Skeleton","SkeletonRow","decodeHTMLEntities","text","forwardRef","initialData","hideHeading","hideFooter","routeProduct","routeEmptyCartCTA","routeCart","onItemUpdate","onItemRemove","maxItems","slots","attributesToHide","enableRemoveItem","enableUpdateItemQuantity","onItemsErrorsChange","accordion","isLoading","showMaxItems","showDiscount","showSavings","quantityType","dropdownOptions","undo","__testRecentlyRemovedItems","ref","setLoading","useState","cartModelData","setCartModelData","itemsLoading","setItemLoading","itemsErrors","setItemErrors","recentlyRemovedItems","setRecentlyRemovedItems","useEffect","cartTaxesConfig","_a","state","displayMaxItems","setDisplayMaxItems","dictionary","useText","handleItemsLoading","uid","prev","handleItemsError","message","addToRecentlyRemovedItems","cart","getPersistedCartData","item","i","index","r","events","handleItemQuantityUpdate","quantity","updateProductsFromCart","error","handleDismiss","handleMaxItemsView","useCallback","cartDataEvent","payload","getImage","defaultImageProps","imageComponent","Image","Slot","getTitle","getConfiguration","configuration","getPriceProps","_b","_c","_d","getSavingsAmount","getTotalExcludingTax","Price","getTotalPriceProps","totalProps","discountProps","_e","_f","_g","_h","_i","_j","getWarning","quantityError","itemIsLoading","insufficientQuantityText","lowInventoryText","notAvailableQuantity","Icon","WarningWithCircle","getAlert","OrderError","getProductAttributes","getSku","getFooter","getRemoveContent","Button","Trash","getQuantityContent","Incrementer","value","getCartItemEntries","filterCallback","defaultCartItem","CartItem","newQuantity","headingSection","handleRemoveOutOfStockItems","outOfStockItems","outOfStockEntries","InLineAlert","CartList","mainProductEntries","numOfVisibleItems","hasHiddenItems","canDisplayMoreItems","footerActions","renderCartListWithUndoBanners","entries","items","UndoBanner","numItemsToShow","beingRemoved","defaultUndoBanner","handleUndo","removed","addProductsToCart","useImperativeHandle","EmptyCart","productEntries","Accordion","ChevronRight","ChevronDown","AccordionSection","CartSummaryListComponent"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"CartSummaryList.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/ChevronRight.svg","/@dropins/storefront-cart/src/components/CartSummaryList/CartSummaryList.tsx","/@dropins/storefront-cart/src/lib/decodeHTMLEntities.ts","/@dropins/storefront-cart/src/containers/CartSummaryList/CartSummaryList.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgChevronRight = (props) => /* @__PURE__ */ React.createElement(\"svg\", { id: \"Icon_Chevron_right_Base\", \"data-name\": \"Icon \\\\u2013 Chevron right \\\\u2013 Base\", xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Large\" }, /* @__PURE__ */ React.createElement(\"rect\", { id: \"Placement_area\", \"data-name\": \"Placement area\", width: 24, height: 24, fill: \"#fff\", opacity: 0 }), /* @__PURE__ */ React.createElement(\"g\", { id: \"Chevron_right_icon\", \"data-name\": \"Chevron right icon\" }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", id: \"chevron\", d: \"M199.75,367.5l4.255,-4.255-4.255,-4.255\", transform: \"translate(-189.25 -351.0)\", fill: \"none\", stroke: \"currentColor\" }))));\nexport default SvgChevronRight;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { Divider, Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\n\nimport '@/cart/components/CartSummaryList/CartSummaryList.css';\nexport interface CartSummaryListProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n heading?: VNode | null;\n footer?: VNode | null;\n emptyCart: VNode;\n products?: VNode | null;\n outOfStockMessage?: VNode | null;\n loading?: boolean;\n variant?: 'primary' | 'secondary';\n}\n\nexport const CartSummaryList: FunctionComponent<CartSummaryListProps> = ({\n className,\n children,\n heading,\n footer,\n emptyCart,\n products,\n outOfStockMessage,\n variant = 'primary',\n loading = true,\n ...props\n}) => {\n return (\n <div\n {...props}\n className={classes([\n 'cart-cart-summary-list',\n className,\n `cart-cart-summary-list__background--${variant}`,\n ])}\n >\n {loading ? (\n <CartSummaryListSkeleton />\n ) : (\n <>\n {(heading || outOfStockMessage) && (\n <div\n data-testid=\"cart-summary-list-heading-wrapper\"\n className={classes([\n 'cart-cart-summary-list__heading',\n ['cart-cart-summary-list__heading--full-width', !products],\n ])}\n >\n {heading && (\n <>\n <VComponent\n node={heading}\n className=\"cart-cart-summary-list__heading-text\"\n />\n <Divider\n variant=\"primary\"\n className={classes([\n 'cart-cart-summary-list__heading-divider',\n ])}\n />\n </>\n )}\n\n {outOfStockMessage && (\n <VComponent\n node={outOfStockMessage}\n className=\"cart-cart-summary-list__out-of-stock-message\"\n />\n )}\n </div>\n )}\n <div\n className={classes([\n 'cart-cart-summary-list__content',\n ['cart-cart-summary-list__content--empty', !products],\n ])}\n >\n {products || (\n <VComponent\n node={emptyCart}\n className=\"cart-cart-summary-list__empty-cart\"\n />\n )}\n </div>\n\n {footer && (\n <>\n <Divider\n variant=\"primary\"\n className={classes(['cart-cart-summary-list__footer-divider'])}\n />\n <VComponent\n node={footer}\n className=\"cart-cart-summary-list__footer-text\"\n />\n </>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst CartSummaryListSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n data-testid=\"cart-summary-list-skeleton\"\n className=\"cart-cart-summary-list__skeleton\"\n rowGap=\"medium\"\n >\n <SkeletonRow\n variant=\"row\"\n size=\"xlarge\"\n fullWidth={true}\n lines={3}\n multilineGap=\"small\"\n />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/**\n * Decodes HTML entities in a string (e.g., &quot; -> \", &amp; -> &)\n * Uses DOMParser to safely decode entities and extract text content.\n * Note: This will also strip any HTML tags from the decoded result.\n * @param text - The text containing HTML entities to decode\n * @returns The decoded text with HTML entities converted to their characters\n */\nexport const decodeHTMLEntities = (text: string): string => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(text, 'text/html');\n return doc.body.textContent || '';\n};\n\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n useImperativeHandle,\n forwardRef,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps, classes } from '@adobe-commerce/elsie/lib';\n\nimport {\n CartSummaryList as CartSummaryListComponent,\n EmptyCart,\n} from '@/cart/components';\n\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { decodeHTMLEntities } from '@/cart/lib/decodeHTMLEntities';\nimport { CartModel } from '@/cart/data/models/cart-model';\nimport {\n Accordion,\n AccordionSection,\n Button,\n CartItem,\n CartList,\n Icon,\n Image,\n ImageProps,\n InLineAlert,\n Price,\n PriceProps,\n Incrementer,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { VNode } from 'preact';\nimport { events, Cart } from '@adobe-commerce/event-bus';\nimport { state } from '@/cart/lib/state';\nimport {\n ChevronDown,\n ChevronRight,\n OrderError,\n WarningWithCircle,\n Trash,\n} from '@adobe-commerce/elsie/icons';\nimport { updateProductsFromCart } from '@/cart/api';\nimport { addProductsToCart } from '@/cart/api/addProductsToCart/addProductsToCart';\n\nexport interface CartSummaryListProps extends HTMLAttributes<HTMLDivElement> {\n hideHeading?: boolean;\n hideFooter?: boolean;\n routeProduct?: (item: CartModel['items'][0]) => string;\n routeEmptyCartCTA?: () => string;\n routeCart?: () => string;\n onItemUpdate?: ({ item }: { item: CartModel['items'][0] }) => void;\n onItemRemove?: ({ item }: { item: CartModel['items'][0] }) => void;\n maxItems?: number; // Maximum number of items to display\n showMaxItems?: boolean;\n attributesToHide?: SwitchableAttributes[]; // Product attributes to hide\n slots?: {\n Heading?: SlotProps;\n EmptyCart?: SlotProps;\n Footer?: SlotProps;\n RowTotalFooter?: SlotProps<{ item: CartModel['items'][number] }>;\n Thumbnail?: SlotProps<{\n item: CartModel['items'][number];\n defaultImageProps: ImageProps;\n }>;\n ProductAttributes?: SlotProps;\n CartSummaryFooter?: SlotProps;\n CartItem?: SlotProps;\n UndoBanner?: SlotProps<{\n item: CartModel['items'][0];\n loading: boolean;\n error?: string;\n onUndo: () => void;\n onDismiss: () => void;\n }>;\n ItemTitle?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemPrice?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemQuantity?: SlotProps<{\n item: CartModel['items'][number];\n enableUpdateItemQuantity: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n itemsLoading: Set<string>;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n }>;\n ItemTotal?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemSku?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemRemoveAction?: SlotProps<{\n item: CartModel['items'][number];\n enableRemoveItem: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n itemsLoading: Set<string>;\n }>;\n };\n enableRemoveItem?: boolean;\n enableUpdateItemQuantity?: boolean;\n onItemsErrorsChange?: (errors: Map<string, string>) => void;\n accordion?: boolean;\n variant?: 'primary' | 'secondary';\n isLoading?: boolean;\n showDiscount?: boolean;\n showSavings?: boolean;\n quantityType?: 'stepper' | 'dropdown';\n dropdownOptions?: { value: string; text: string }[];\n undo?: boolean;\n /**\n * TEST ONLY: Allows test to inject recentlyRemovedItems for coverage\n */\n __testRecentlyRemovedItems?: Array<{\n item: CartModel['items'][0];\n index: number;\n loading: boolean;\n error?: string;\n beingRemoved?: boolean;\n }>;\n}\n\n// Attributes that can be hidden or shown\nexport type SwitchableAttributes =\n | 'name'\n | 'image'\n | 'configurations'\n | 'warning'\n | 'alert'\n | 'sku'\n | 'price'\n | 'quantity'\n | 'total'\n | 'totalDiscount'\n | 'totalExcludingTax';\n\n// Ref interface for exposing functions to tests\nexport interface CartSummaryListRef {\n handleUndo: (uid: string) => Promise<void>;\n}\n\nexport const CartSummaryList: Container<\n CartSummaryListProps,\n CartModel | null\n> = forwardRef<\n CartSummaryListRef,\n CartSummaryListProps & { initialData?: CartModel | null }\n>(\n (\n {\n initialData = null,\n hideHeading,\n hideFooter,\n routeProduct,\n routeEmptyCartCTA,\n routeCart,\n onItemUpdate,\n onItemRemove,\n maxItems, //if maxItems is not provided, default to show all items\n slots,\n attributesToHide = [],\n enableRemoveItem,\n enableUpdateItemQuantity,\n onItemsErrorsChange,\n accordion = false,\n variant = 'primary',\n isLoading,\n showMaxItems,\n showDiscount,\n showSavings,\n quantityType,\n dropdownOptions,\n undo = false,\n __testRecentlyRemovedItems,\n ...props\n },\n ref\n ) => {\n const [loading, setLoading] = useState(!initialData);\n\n const [cartModelData, setCartModelData] = useState<CartModel | null>(\n initialData\n );\n const [itemsLoading, setItemLoading] = useState<Set<string>>(new Set());\n\n const [itemsErrors, setItemErrors] = useState<Map<string, string>>(\n new Map()\n );\n\n const [recentlyRemovedItems, setRecentlyRemovedItems] = useState<\n {\n item: CartModel['items'][0];\n index: number;\n loading: boolean;\n error?: string;\n beingRemoved?: boolean;\n }[]\n >(__testRecentlyRemovedItems || []);\n\n // TEST ONLY: allow test to update recentlyRemovedItems after mount\n useEffect(() => {\n if (\n process.env.NODE_ENV === 'test' &&\n __testRecentlyRemovedItems &&\n recentlyRemovedItems !== __testRecentlyRemovedItems\n ) {\n setRecentlyRemovedItems(__testRecentlyRemovedItems);\n }\n }, [__testRecentlyRemovedItems, recentlyRemovedItems]);\n\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n\n const [displayMaxItems, setDisplayMaxItems] = useState<boolean>(\n showMaxItems ? true : !maxItems && !showMaxItems\n );\n\n const dictionary = useText({\n file: 'Cart.CartItem.file',\n files: 'Cart.CartItem.files',\n heading: 'Cart.Cart.heading',\n message: 'Cart.CartItem.message',\n recipient: 'Cart.CartItem.recipient',\n regularPrice: 'Cart.CartItem.regularPrice',\n discountedPrice: 'Cart.CartItem.discountedPrice',\n sender: 'Cart.CartItem.sender',\n lowInventory: 'Cart.CartItem.lowInventory',\n insufficientQuantity: 'Cart.CartItem.insufficientQuantity',\n insufficientQuantityGeneral: 'Cart.CartItem.insufficientQuantityGeneral',\n outOfStockHeading: 'Cart.OutOfStockMessage.heading',\n outOfStockDescription: 'Cart.OutOfStockMessage.message',\n outOfStockAlert: 'Cart.OutOfStockMessage.alert',\n removeAction: 'Cart.OutOfStockMessage.action',\n notAvailableMessage: 'Cart.CartItem.notAvailableMessage',\n viewMore: 'Cart.Cart.viewMore',\n viewAll: 'Cart.Cart.viewAll',\n discountPercent: 'Cart.CartItem.discountPercentage',\n savingsAmount: 'Cart.CartItem.savingsAmount',\n itemBeingRemoved: 'Cart.CartItem.itemBeingRemoved',\n itemRemoved: 'Cart.CartItem.itemRemoved',\n itemRemovedDescription: 'Cart.CartItem.itemRemovedDescription',\n undoAction: 'Cart.CartItem.undoAction',\n dismissAction: 'Cart.CartItem.dismissAction',\n remove: 'Dropin.CartItem.remove.label',\n removeDefault: 'Dropin.CartItem.removeDefault.label',\n quantity: 'Dropin.CartItem.quantity.label',\n });\n\n const handleItemsLoading = (uid: string, state: boolean) => {\n setItemLoading((prev) => {\n state ? prev.add(uid) : prev.delete(uid);\n return new Set(prev);\n });\n };\n\n const handleItemsError = (uid: string, message?: string) => {\n setItemErrors((prev) => {\n message ? prev.set(uid, message) : prev.delete(uid);\n return new Map(prev);\n });\n };\n\n // Helper to add to recently removed items for undo\n function addToRecentlyRemovedItems(uid: string) {\n const cart = getPersistedCartData();\n const item = cart?.items.find((i) => i.uid === uid);\n if (item) {\n setRecentlyRemovedItems((prev) => {\n const index = cart.items.findIndex((i) => i.uid === uid);\n if (index !== -1 && !prev.some((r) => r.item.uid === uid)) {\n // Emit the event for analytics or listeners\n events.emit('cart/product/removed', { item, index });\n return [\n ...prev,\n { item, index, error: undefined, beingRemoved: true },\n ];\n }\n return prev;\n });\n }\n }\n\n const handleItemQuantityUpdate = (\n item: CartModel['items'][0],\n quantity: number\n ) => {\n // initial values\n handleItemsLoading(item.uid, true);\n\n // Reset temporary error messages\n setItemErrors(new Map());\n\n if (enableRemoveItem && quantity === 0) {\n // Add to recently removed items for undo\n addToRecentlyRemovedItems(item.uid);\n // use callback for removing (original logic)\n updateProductsFromCart([{ uid: item.uid, quantity }])\n .then(() => {\n onItemRemove?.({ item });\n })\n .finally(() => {\n handleItemsLoading(item.uid, false);\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === item.uid ? { ...r, beingRemoved: false } : r\n )\n );\n })\n .catch((error: any) => {\n console.warn(error);\n });\n }\n // use callback for updating\n else {\n enableUpdateItemQuantity &&\n updateProductsFromCart([{ uid: item.uid, quantity }])\n .then(() => {\n onItemUpdate?.({ item });\n })\n .finally(() => {\n handleItemsLoading(item.uid, false);\n })\n .catch((error: Error) => {\n handleItemsError(item.uid, error.message);\n });\n }\n };\n\n const handleDismiss = (uid: string) => {\n setRecentlyRemovedItems((prev) => prev.filter((r) => r.item.uid !== uid));\n };\n\n // Display max items\n const handleMaxItemsView = useCallback(() => {\n setDisplayMaxItems((prev) => !prev);\n }, []);\n\n useEffect(() => {\n const cartDataEvent = events.on(\n 'cart/data',\n (payload: Cart | null) => {\n setCartModelData(payload as CartModel);\n setLoading(!!isLoading);\n },\n { eager: true }\n );\n\n return () => {\n cartDataEvent?.off();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Clear recently removed items when undo is disabled\n useEffect(() => {\n if (!undo) {\n setRecentlyRemovedItems([]);\n }\n }, [undo]);\n\n // Call onItemsErrorsChange whenever itemsErrors changes\n useEffect(() => {\n if (onItemsErrorsChange) {\n onItemsErrorsChange(itemsErrors);\n }\n }, [itemsErrors, onItemsErrorsChange]);\n\n // Helper functions\n const getImage = (item: CartModel['items'][0], index: number) => {\n if (attributesToHide.includes('image')) {\n return undefined;\n }\n\n const defaultImageProps: ImageProps = {\n loading: index < 4 ? 'eager' : 'lazy',\n src: item.image.src,\n alt: item.image.alt,\n width: '300',\n height: '300',\n params: { width: 300 },\n };\n\n const imageComponent = (\n <Image data-testid=\"cart-list-item-image\" {...defaultImageProps} />\n );\n return (\n <Slot\n name=\"Thumbnail\"\n slot={slots?.Thumbnail}\n context={{\n item,\n defaultImageProps,\n }}\n >\n {routeProduct ? (\n <a href={routeProduct(item)}>{imageComponent}</a>\n ) : (\n imageComponent\n )}\n </Slot>\n );\n };\n\n const getTitle = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('name')) {\n return undefined;\n }\n\n return (\n <span data-testid=\"cart-list-item-title\">\n {routeProduct ? (\n <a href={routeProduct(item)}>{decodeHTMLEntities(item.name)}</a>\n ) : (\n decodeHTMLEntities(item.name)\n )}\n </span>\n );\n };\n\n const getConfiguration = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('configurations')) {\n return undefined;\n }\n\n const configuration = {\n ...item.bundleOptions,\n ...item.selectedOptions,\n ...item.customizableOptions,\n ...(item.recipient ? { [dictionary.recipient]: item.recipient } : null),\n ...(item.recipientEmail && item.recipient\n ? {\n [dictionary.recipient]: `${item.recipient} (${item.recipientEmail})`,\n }\n : null),\n ...(item.sender ? { [dictionary.sender]: item.sender } : null),\n ...(item.senderEmail && item.sender\n ? {\n [dictionary.sender]: `${item.sender} (${item.senderEmail})`,\n }\n : {}),\n ...(item.message ? { [dictionary.message]: item.message } : null),\n ...(item.links && item.links.count\n ? item.links.count > 1\n ? {\n [dictionary.files.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : {\n [dictionary.file.replace(\n '{count}',\n item.links.count.toString()\n )]: item.links.result,\n }\n : null),\n };\n\n if (Object.keys(configuration).length === 0) {\n return undefined;\n }\n\n return configuration;\n };\n\n const getPriceProps = (item: CartModel['items'][0]) => {\n return cartTaxesConfig?.price === 'INCLUDING_TAX'\n ? item.discounted\n ? {\n amount: item.regularPrice.value,\n currency: item.regularPrice.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.taxedPrice?.value,\n currency: item.taxedPrice?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'including-tax-item-price',\n }\n : {\n amount: item.regularPrice?.value,\n currency: item.regularPrice?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'regular-item-price',\n };\n };\n\n const getSavingsAmount = (item: CartModel['items'][0]) => {\n return {\n amount: item.savingsAmount?.value,\n currency: item.savingsAmount?.currency,\n style: { font: 'inherit' },\n 'data-testid': 'item-savings-amount',\n };\n };\n\n const getTotalExcludingTax = (item: CartModel['items'][0]) => {\n return cartTaxesConfig?.price === 'INCLUDING_EXCLUDING_TAX' ? (\n <Price\n amount={item.rowTotal.value}\n currency={item.rowTotal.currency}\n data-testid=\"excluding-tax-total\"\n aria-label={dictionary.regularPrice}\n />\n ) : undefined;\n };\n\n const getTotalPriceProps = (item: CartModel['items'][0]) => {\n const totalProps: PriceProps = {\n 'aria-label': dictionary.regularPrice,\n };\n const discountProps: PriceProps | null = item.discounted ? {} : null;\n\n if (\n ['INCLUDING_TAX', 'INCLUDING_EXCLUDING_TAX'].includes(\n cartTaxesConfig?.price as string\n )\n ) {\n totalProps['amount'] = item.rowTotalIncludingTax?.value;\n totalProps['currency'] = item.rowTotalIncludingTax?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore\n totalProps['data-testid'] = 'including-tax-item-total';\n\n if (discountProps) {\n totalProps['amount'] = item.total?.value;\n totalProps['currency'] = item.total?.currency;\n\n discountProps['amount'] = item.rowTotalIncludingTax?.value;\n discountProps['currency'] = item.rowTotalIncludingTax?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = dictionary.discountedPrice;\n // @ts-ignore\n discountProps['data-testid'] = 'discount-total';\n }\n } else {\n totalProps['amount'] = item.total?.value;\n totalProps['currency'] = item.total?.currency;\n totalProps['variant'] = item.discounted ? 'strikethrough' : 'default';\n // @ts-ignore\n totalProps['data-testid'] = 'regular-item-total';\n\n if (discountProps) {\n discountProps['amount'] = item.discountedTotal?.value;\n discountProps['currency'] = item.discountedTotal?.currency;\n discountProps['sale'] = true;\n discountProps['aria-label'] = dictionary.regularPrice;\n // @ts-ignore\n discountProps['data-testid'] = 'discount-total';\n }\n }\n\n return {\n totalProps,\n discountProps,\n };\n };\n\n const getWarning = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('warning')) {\n return undefined;\n }\n\n const error = itemsErrors.get(item.uid);\n const quantityError = itemsErrors\n .get(item.uid)\n ?.includes('The requested qty is not available');\n const itemIsLoading = itemsLoading.has(item.uid);\n\n const insufficientQuantityText =\n item.insufficientQuantity && item.stockLevel\n ? item.stockLevel === 'noNumber'\n ? dictionary.insufficientQuantityGeneral\n : dictionary.insufficientQuantity\n .replace('{inventory}', item.stockLevel?.toString())\n .replace('{count}', item.quantity.toString())\n : '';\n\n const lowInventoryText =\n item.lowInventory &&\n item.onlyXLeftInStock &&\n dictionary.lowInventory.replace(\n '{count}',\n item.onlyXLeftInStock?.toString()\n );\n\n const notAvailableQuantity =\n !item.outOfStock && error && quantityError\n ? dictionary.notAvailableMessage\n : error;\n\n return !itemIsLoading &&\n (error || item.insufficientQuantity || item.lowInventory) ? (\n <span data-testid=\"item-warning\">\n <Icon source={WarningWithCircle} size={'16'} />\n {notAvailableQuantity || insufficientQuantityText || lowInventoryText}\n </span>\n ) : undefined;\n };\n\n const getAlert = (item: CartModel['items'][0]) => {\n if (attributesToHide?.includes('alert')) {\n return undefined;\n }\n const itemIsLoading = itemsLoading.has(item.uid);\n\n return !itemIsLoading && item.outOfStock ? (\n <span data-testid=\"item-alert\">\n <Icon source={OrderError} size={'16'} />\n {dictionary.outOfStockAlert}\n </span>\n ) : undefined;\n };\n\n const getProductAttributes = (item: CartModel['items'][0]) => {\n return (\n <Slot\n name=\"ProductAttributes\"\n slot={slots?.ProductAttributes}\n context={{\n item,\n }}\n />\n );\n };\n\n const getSku = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('sku')) {\n return undefined;\n }\n return <span data-testid=\"cart-list-item-sku\">{item.sku}</span>;\n };\n\n const getFooter = (item: CartModel['items'][0]) => {\n return (\n <Slot\n name=\"Footer\"\n slot={slots?.Footer}\n context={{ item, handleItemsLoading, handleItemsError, onItemUpdate }}\n />\n );\n };\n\n const getRowTotalFooter = (item: CartModel['items'][0]) => {\n return (\n <Slot\n name=\"RowTotalFooter\"\n slot={slots?.RowTotalFooter}\n context={{ item }}\n />\n );\n };\n\n const getRemoveContent = (item: CartModel['items'][0]) => {\n if (!enableRemoveItem) {\n return undefined;\n }\n\n return (\n <Slot\n name=\"ItemRemoveAction\"\n slot={slots?.ItemRemoveAction}\n context={{\n item,\n enableRemoveItem,\n handleItemQuantityUpdate,\n handleItemsError,\n handleItemsLoading,\n onItemUpdate,\n itemsLoading,\n }}\n >\n {/* Default remove button */}\n <Button\n data-testid=\"cart-item-remove-button\"\n className={classes(['dropin-cart-item__remove'])}\n variant=\"tertiary\"\n onClick={() => handleItemQuantityUpdate(item, 0)}\n disabled={itemsLoading.has(item.uid)}\n icon={\n <Icon\n data-testid=\"cart-item-remove-icon\"\n source={Trash}\n size=\"24\"\n stroke=\"2\"\n viewBox=\"0 0 24 24\"\n aria-label={\n dictionary.remove?.replace('{product}', decodeHTMLEntities(item.name)) ||\n dictionary.removeDefault\n }\n />\n }\n />\n </Slot>\n );\n };\n\n const getQuantityContent = (item: CartModel['items'][0]) => {\n if (attributesToHide.includes('quantity')) {\n return undefined;\n }\n\n if (!enableUpdateItemQuantity) {\n return undefined;\n }\n\n return (\n <Slot\n name=\"ItemQuantity\"\n slot={slots?.ItemQuantity}\n context={{\n item,\n enableUpdateItemQuantity,\n handleItemQuantityUpdate,\n itemsLoading,\n handleItemsError,\n handleItemsLoading,\n onItemUpdate,\n }}\n >\n <Incrementer\n value={item.quantity}\n min={1}\n onValue={(value) => handleItemQuantityUpdate(item, Number(value))}\n name=\"quantity\"\n disabled={itemsLoading.has(item.uid)}\n aria-label={dictionary.quantity}\n />\n </Slot>\n );\n };\n\n // Re-usable function to get a filtered list of cart items\n const getCartItemEntries = (\n filterCallback: (item: CartModel['items'][0]) => boolean\n ) => {\n return cartModelData?.totalQuantity\n ? cartModelData.items.filter(filterCallback).map((item, index) => {\n const { totalProps, discountProps } = getTotalPriceProps(item);\n\n const defaultCartItem = (\n <CartItem\n updating={itemsLoading?.has(item.uid)}\n loading={loading}\n key={item.uid}\n data-testid={`cart-list-item-entry-${item.uid}`}\n image={getImage(item, index)}\n title={\n <Slot\n name=\"ItemTitle\"\n slot={slots?.ItemTitle}\n context={{ item }}\n >\n {getTitle(item)}\n </Slot>\n }\n sku={\n attributesToHide.includes('sku') ? undefined : (\n <Slot\n name=\"ItemSku\"\n slot={slots?.ItemSku}\n context={{ item }}\n >\n {getSku(item)}\n </Slot>\n )\n }\n price={\n attributesToHide.includes('price') ? undefined : (\n <Slot\n name=\"ItemPrice\"\n slot={slots?.ItemPrice}\n context={{ item }}\n slotTag=\"span\"\n >\n <Price {...getPriceProps(item)} />\n </Slot>\n )\n }\n quantity={\n attributesToHide.includes('quantity')\n ? undefined\n : item.quantity\n }\n quantityContent={getQuantityContent(item)}\n total={\n <>\n {attributesToHide.includes('total') ? undefined : (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...totalProps} />\n </Slot>\n )}\n {attributesToHide.includes('totalDiscount')\n ? undefined\n : discountProps && (\n <Slot\n name=\"ItemTotal\"\n slot={slots?.ItemTotal}\n context={{ item }}\n >\n <Price {...discountProps} />\n </Slot>\n )}\n </>\n }\n attributes={getProductAttributes(item)}\n configurations={getConfiguration(item)}\n totalExcludingTax={\n attributesToHide.includes('totalExcludingTax')\n ? undefined\n : getTotalExcludingTax(item)\n }\n taxIncluded={cartTaxesConfig?.price === 'INCLUDING_TAX'}\n taxExcluded={\n !attributesToHide.includes('totalExcludingTax') &&\n cartTaxesConfig?.price === 'INCLUDING_EXCLUDING_TAX'\n }\n warning={getWarning(item)}\n alert={getAlert(item)}\n quantityType={quantityType}\n dropdownOptions={dropdownOptions}\n onQuantity={\n enableUpdateItemQuantity && !itemsLoading.has(item.uid)\n ? (newQuantity) => {\n handleItemQuantityUpdate(item, newQuantity);\n }\n : undefined\n }\n onRemove={\n enableRemoveItem && !itemsLoading.has(item.uid)\n ? () => handleItemQuantityUpdate(item, 0)\n : undefined\n }\n discount={\n showDiscount && item.discounted && item.discountPercentage ? (\n <div data-testid=\"item-discount-percent\">\n {dictionary.discountPercent.replace(\n '{discount}',\n item.discountPercentage?.toString() ?? ''\n )}\n </div>\n ) : undefined\n }\n savings={\n showSavings && item.discounted && item.savingsAmount ? (\n <div>\n <span>\n <Price {...getSavingsAmount(item)} />\n </span>\n &nbsp;\n {dictionary.savingsAmount}\n </div>\n ) : undefined\n }\n rowTotalFooter={getRowTotalFooter(item)}\n footer={getFooter(item)}\n removeContent={getRemoveContent(item)}\n />\n );\n\n return (\n <Slot\n key={item.uid}\n name=\"CartItem\"\n slot={slots?.CartItem}\n context={{\n item,\n index,\n enableUpdateItemQuantity,\n enableRemoveItem,\n itemsLoading,\n loading,\n attributesToHide,\n cartTaxesConfig,\n quantityType,\n dropdownOptions,\n showDiscount,\n showSavings,\n dictionary,\n getImage,\n getTitle,\n getSku,\n getPriceProps,\n getTotalPriceProps,\n getProductAttributes,\n getConfiguration,\n getTotalExcludingTax,\n getWarning,\n getAlert,\n getRowTotalFooter,\n getFooter,\n getSavingsAmount,\n }}\n >\n {defaultCartItem}\n </Slot>\n );\n })\n : null;\n };\n\n const heading = (\n <Slot\n name=\"Heading\"\n slot={slots?.Heading}\n context={{\n count: cartModelData?.totalQuantity,\n }}\n >\n <div data-testid=\"default-cart-heading\">\n {dictionary.heading.replace(\n '({count})',\n cartModelData?.totalQuantity\n ? `(${cartModelData?.totalQuantity.toString()})`\n : ''\n )}\n </div>\n </Slot>\n );\n\n // Heading Section text for screen reader\n const headingSection = heading.props.children.props.children;\n\n // Out of Stock Items\n const handleRemoveOutOfStockItems = () => {\n const outOfStockItems = cartModelData?.items.filter(\n (item) => item.outOfStock\n );\n\n outOfStockItems?.forEach((item) => {\n handleItemQuantityUpdate(item, 0);\n });\n };\n\n const outOfStockEntries = getCartItemEntries(\n (item) => item.outOfStock || item.insufficientQuantity || false\n );\n\n const outOfStockMessage = cartModelData?.hasOutOfStockItems ? (\n <InLineAlert\n data-testid=\"cart-out-of-stock-message\"\n icon={<Icon source={OrderError} size={'16'} />}\n itemList={\n <CartList data-testid=\"out-of-stock-cart-items\">\n {outOfStockEntries}\n </CartList>\n }\n type=\"warning\"\n heading={dictionary.outOfStockHeading}\n description={dictionary.outOfStockDescription}\n variant=\"primary\"\n actionButtonPosition=\"bottom\"\n additionalActions={\n cartModelData?.hasFullyOutOfStockItems && enableRemoveItem\n ? [\n {\n label: dictionary.removeAction,\n onClick: handleRemoveOutOfStockItems,\n },\n ]\n : undefined\n }\n />\n ) : undefined;\n\n // Main Product Entries\n const mainProductEntries = getCartItemEntries(\n (item) => !item.outOfStock && !item.insufficientQuantity\n );\n\n const numOfVisibleItems = displayMaxItems\n ? Math.max(maxItems || 5, 5)\n : Math.min(cartModelData?.totalQuantity || 5, 5);\n\n const hasHiddenItems = cartModelData?.totalQuantity > numOfVisibleItems;\n\n const canDisplayMoreItems =\n hasHiddenItems && !displayMaxItems && numOfVisibleItems != maxItems;\n\n const footerActions =\n cartModelData?.totalQuantity && mainProductEntries ? (\n <Slot\n name=\"Footer\"\n slot={slots?.CartSummaryFooter}\n context={{ displayMaxItems, routeCart }}\n data-testid=\"cart-cart-summary-footer-slot\"\n className=\"cart-cart-summary-footer\"\n >\n {hasHiddenItems ? (\n canDisplayMoreItems ? (\n <Button\n className=\"cart-cart-summary-list-footer__action\"\n onClick={handleMaxItemsView}\n data-testid=\"view-more-items-button\"\n variant=\"tertiary\"\n >\n {dictionary.viewMore}\n </Button>\n ) : (\n routeCart && (\n <Button\n className=\"cart-cart-summary-list-footer__action\"\n href={routeCart()}\n variant=\"tertiary\"\n data-testid=\"view-cart-or-less-items-button\"\n >\n {dictionary.viewAll}\n </Button>\n )\n )\n ) : (\n routeCart && (\n <Button\n className=\"cart-cart-summary-list-footer__action\"\n href={routeCart()}\n variant=\"tertiary\"\n data-testid=\"view-cart-button\"\n >\n {dictionary.viewAll}\n </Button>\n )\n )}\n </Slot>\n ) : null;\n\n const renderCartListWithUndoBanners = () => {\n if (!cartModelData?.items) return null;\n const entries: (VNode | null)[] = [];\n const items = cartModelData.items;\n const UndoBanner = slots?.UndoBanner;\n\n // Calculate how many items to show (same logic as original)\n const numItemsToShow = displayMaxItems\n ? Math.max(!maxItems ? cartModelData?.totalQuantity : maxItems, 5)\n : Math.min(maxItems ?? 5, 5);\n\n // Only process items up to the limit\n for (let i = 0; i <= numItemsToShow; i++) {\n // Render undo banners for this index only if undo is enabled\n if (undo) {\n recentlyRemovedItems\n .filter((r) => r.index === i)\n .forEach(({ item, error, beingRemoved }) => {\n const defaultUndoBanner = (\n <InLineAlert\n key={`undo-banner-${item.uid}`}\n type={error ? 'error' : 'info'}\n heading={\n beingRemoved\n ? dictionary.itemBeingRemoved?.replace(\n '{product}',\n decodeHTMLEntities(item.name)\n )\n : dictionary.itemRemoved?.replace('{product}', decodeHTMLEntities(item.name))\n }\n description={error || dictionary.itemRemovedDescription}\n variant=\"primary\"\n actionButtonPosition=\"bottom\"\n additionalActions={\n beingRemoved\n ? [] // Hide buttons while removing\n : [\n {\n label: dictionary.undoAction,\n onClick: () => handleUndo(item.uid),\n 'aria-label': `${dictionary.undoAction} remove ${decodeHTMLEntities(item.name)}`,\n },\n {\n label: dictionary.dismissAction,\n onClick: () => handleDismiss(item.uid),\n 'aria-label': `${dictionary.dismissAction} undo for ${decodeHTMLEntities(item.name)}`,\n },\n ]\n }\n />\n );\n\n entries.push(\n UndoBanner ? (\n <Slot\n name=\"UndoBanner\"\n slot={UndoBanner}\n context={{\n item,\n loading,\n error,\n onUndo: () => handleUndo(item.uid),\n onDismiss: () => handleDismiss(item.uid),\n }}\n key={`undo-banner-${item.uid}`}\n >\n {defaultUndoBanner}\n </Slot>\n ) : (\n defaultUndoBanner\n )\n );\n });\n }\n // Render cart item if not at the end and within the slice limit\n if (i < numItemsToShow && i < items.length) {\n entries.push(mainProductEntries?.[i] || null);\n }\n }\n return <CartList data-testid=\"cart-list\">{entries}</CartList>;\n };\n // Undo handler implementation\n const handleUndo = useCallback(\n async (uid: string) => {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === uid ? { ...r, loading: true, error: undefined } : r\n )\n );\n const removed = recentlyRemovedItems.find((r) => r.item.uid === uid);\n if (!removed) return;\n try {\n await addProductsToCart([\n {\n sku: removed.item.sku,\n parentSku: removed.item.topLevelSku,\n quantity: removed.item.quantity,\n optionsUIDs:\n removed.item.bundleOptionsUIDs || // Use bundle option UIDs for bundle products\n (removed.item.selectedOptionsUIDs\n ? Object.values(removed.item.selectedOptionsUIDs)\n : undefined),\n enteredOptions: removed.item.customizableOptions\n ? Object.entries(removed.item.customizableOptions).map(\n ([uid, value]) => ({ uid, value })\n )\n : undefined,\n },\n ]);\n setRecentlyRemovedItems((prev) =>\n prev.filter((r) => r.item.uid !== uid)\n );\n } catch (error: any) {\n setRecentlyRemovedItems((prev) =>\n prev.map((r) =>\n r.item.uid === uid\n ? { ...r, error: error?.message || 'Failed to restore item.' }\n : r\n )\n );\n }\n },\n [recentlyRemovedItems]\n );\n\n // Expose handleUndo to parent components via ref (for testing)\n useImperativeHandle(\n ref,\n () => ({\n handleUndo,\n }),\n [handleUndo]\n );\n\n // Replace the emptyCart definition with conditional rendering for undo banners\n const emptyCart = (\n <>\n {undo && recentlyRemovedItems.length > 0 ? (\n renderCartListWithUndoBanners()\n ) : (\n <Slot name=\"EmptyCart\" slot={slots?.EmptyCart} context={{}}>\n <EmptyCart\n data-testid=\"empty-cart\"\n ctaLinkURL={routeEmptyCartCTA?.()}\n />\n </Slot>\n )}\n </>\n );\n\n // Choose between original product entries and undo banner version\n const productEntries =\n cartModelData?.totalQuantity ||\n (undo && recentlyRemovedItems.length > 0) ? (\n !undo ? (\n <CartList data-testid=\"cart-list\">\n {mainProductEntries?.slice(\n 0,\n displayMaxItems\n ? Math.max(\n !maxItems ? cartModelData?.totalQuantity : maxItems,\n 5\n )\n : Math.min(maxItems ?? 5, 5)\n )}\n </CartList>\n ) : recentlyRemovedItems.length > 0 ? (\n renderCartListWithUndoBanners()\n ) : (\n <CartList data-testid=\"cart-list\">\n {mainProductEntries?.slice(\n 0,\n displayMaxItems\n ? Math.max(\n !maxItems ? cartModelData?.totalQuantity : maxItems,\n 5\n )\n : Math.min(maxItems ?? 5, 5)\n )}\n </CartList>\n )\n ) : null;\n\n return accordion ? (\n <Accordion\n data-testid=\"cart-summary-list-accordion\"\n className={classes([\n `cart-cart-summary-list-accordion`,\n `cart-cart-summary-list__background--${variant}`,\n ])}\n iconOpen={ChevronRight}\n iconClose={ChevronDown}\n >\n <AccordionSection\n title={headingSection}\n data-testid=\"cart-summary-list-accordion__section\"\n open={true}\n renderContentWhenClosed={true}\n >\n <CartSummaryListComponent\n {...props}\n aria-expanded={true}\n aria-label={'TEST'}\n className={`cart-cart-summary-list-accordion__list`}\n loading={loading}\n footer={\n hideFooter\n ? undefined\n : footerActions || (routeCart ? footerActions : undefined)\n }\n emptyCart={emptyCart}\n products={productEntries}\n outOfStockMessage={outOfStockMessage}\n variant={variant}\n />\n </AccordionSection>\n </Accordion>\n ) : (\n <CartSummaryListComponent\n {...props}\n heading={hideHeading ? undefined : heading}\n footer={\n hideFooter\n ? undefined\n : footerActions || (routeCart ? footerActions : undefined)\n }\n loading={loading}\n emptyCart={emptyCart}\n products={productEntries}\n outOfStockMessage={outOfStockMessage}\n variant={variant}\n />\n );\n }\n);\n\nCartSummaryList.getInitialData = async function () {\n return getPersistedCartData();\n};\n"],"names":["SvgChevronRight","props","React","CartSummaryList","className","children","heading","footer","emptyCart","products","outOfStockMessage","variant","loading","jsx","classes","CartSummaryListSkeleton","jsxs","Fragment","VComponent","Divider","Skeleton","SkeletonRow","decodeHTMLEntities","text","forwardRef","initialData","hideHeading","hideFooter","routeProduct","routeEmptyCartCTA","routeCart","onItemUpdate","onItemRemove","maxItems","slots","attributesToHide","enableRemoveItem","enableUpdateItemQuantity","onItemsErrorsChange","accordion","isLoading","showMaxItems","showDiscount","showSavings","quantityType","dropdownOptions","undo","__testRecentlyRemovedItems","ref","setLoading","useState","cartModelData","setCartModelData","itemsLoading","setItemLoading","itemsErrors","setItemErrors","recentlyRemovedItems","setRecentlyRemovedItems","useEffect","cartTaxesConfig","_a","state","displayMaxItems","setDisplayMaxItems","dictionary","useText","handleItemsLoading","uid","prev","handleItemsError","message","addToRecentlyRemovedItems","cart","getPersistedCartData","item","i","index","r","events","handleItemQuantityUpdate","quantity","updateProductsFromCart","error","handleDismiss","handleMaxItemsView","useCallback","cartDataEvent","payload","getImage","defaultImageProps","imageComponent","Image","Slot","getTitle","getConfiguration","configuration","getPriceProps","_b","_c","_d","getSavingsAmount","getTotalExcludingTax","Price","getTotalPriceProps","totalProps","discountProps","_e","_f","_g","_h","_i","_j","getWarning","quantityError","itemIsLoading","insufficientQuantityText","lowInventoryText","notAvailableQuantity","Icon","WarningWithCircle","getAlert","OrderError","getProductAttributes","getSku","getFooter","getRowTotalFooter","getRemoveContent","Button","Trash","getQuantityContent","Incrementer","value","getCartItemEntries","filterCallback","defaultCartItem","CartItem","newQuantity","headingSection","handleRemoveOutOfStockItems","outOfStockItems","outOfStockEntries","InLineAlert","CartList","mainProductEntries","numOfVisibleItems","hasHiddenItems","canDisplayMoreItems","footerActions","renderCartListWithUndoBanners","entries","items","UndoBanner","numItemsToShow","beingRemoved","defaultUndoBanner","handleUndo","removed","addProductsToCart","useImperativeHandle","EmptyCart","productEntries","Accordion","ChevronRight","ChevronDown","AccordionSection","CartSummaryListComponent"],"mappings":"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","x_google_ignoreList":[0]}
@@ -22,6 +22,9 @@ export interface CartSummaryListProps extends HTMLAttributes<HTMLDivElement> {
22
22
  Heading?: SlotProps;
23
23
  EmptyCart?: SlotProps;
24
24
  Footer?: SlotProps;
25
+ RowTotalFooter?: SlotProps<{
26
+ item: CartModel['items'][number];
27
+ }>;
25
28
  Thumbnail?: SlotProps<{
26
29
  item: CartModel['items'][number];
27
30
  defaultImageProps: ImageProps;
@@ -19,6 +19,9 @@ export interface MiniCartProps extends HTMLAttributes<HTMLDivElement> {
19
19
  Heading?: SlotProps;
20
20
  EmptyCart?: SlotProps;
21
21
  Footer?: SlotProps;
22
+ RowTotalFooter?: SlotProps<{
23
+ item: CartModel['items'][number];
24
+ }>;
22
25
  ProductAttributes?: SlotProps;
23
26
  CartSummaryFooter?: SlotProps;
24
27
  CartItem?: SlotProps;
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- import{jsx as e,jsxs as d,Fragment as B}from"@dropins/tools/preact-jsx-runtime.js";import{useState as O,useEffect as j,useCallback as V}from"@dropins/tools/preact-compat.js";import{classes as y,VComponent as o,Slot as _}from"@dropins/tools/lib.js";import{g as Y}from"../chunks/persisted-data.js";import{events as $}from"@dropins/tools/event-bus.js";import{Button as k,Price as P}from"@dropins/tools/components.js";/* empty css */import{useText as T}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import{s as h}from"../chunks/resetCart.js";import{a as q}from"../chunks/acdl.js";import{u as z}from"../chunks/updateProductsFromCart.js";import"../chunks/CartSummaryGrid.js";import{C as J}from"../chunks/CartSummaryList.js";import"../chunks/OrderSummary.js";import"../chunks/CartSummaryTable2.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/refreshCart.js";import"../fragments.js";import"../chunks/EmptyCart2.js";import"../chunks/createGuestCart.js";import"../chunks/WarningWithCircle.js";import"../chunks/ChevronDown.js";import"../chunks/getEstimatedTotals.js";import"../chunks/OrderSummaryLine.js";import"../chunks/ChevronUp.js";import"../chunks/Coupon.js";import"../chunks/GiftCard.js";import"../chunks/EmptyCart.js";import"../chunks/Close.js";const K=({className:x,products:p,productListFooter:b,subtotal:t,subtotalExcludingTaxes:I,preCheckoutSection:m,ctas:a,...f})=>{const l=T({subtotal:"Cart.MiniCart.subtotal",subtotalExcludingTaxes:"Cart.MiniCart.subtotalExcludingTaxes"});return e("div",{...f,className:y(["cart-mini-cart",x]),children:p&&d(B,{children:[e("div",{className:"cart-mini-cart__products","data-testid":"mini-cart-products-wrapper",children:p}),b&&e("div",{className:y(["cart-mini-cart__productListFooter"]),"data-testid":"mini-cart-product-list-footer",children:e(o,{node:b})}),d("div",{className:"cart-mini-cart__footer","data-testid":"mini-cart-subtotals",children:[t&&d("div",{className:"cart-mini-cart__footer__estimated-total","data-testid":"mini-cart-subtotal",children:[l.subtotal,e(o,{node:t})]}),I&&d("div",{className:"cart-mini-cart__footer__estimated-total-excluding-taxes","data-testid":"mini-cart-subtotal-excluding-taxes",children:[l.subtotalExcludingTaxes,e(o,{node:I,className:y(["dropin-price-summary__price","dropin-price-summary__price--muted"])})]}),m&&e("div",{className:y(["cart-mini-cart__preCheckoutSection"]),"data-testid":"mini-cart-pre-checkout-section",children:e(o,{node:m})}),a&&e(o,{node:a,className:"cart-mini-cart__footer__ctas"})]})]})})},W=100,Z=({children:x,initialData:p=null,hideFooter:b=!0,slots:t,routeProduct:I,routeCart:m,routeCheckout:a,routeEmptyCartCTA:f,showDiscount:l,showSavings:S,enableItemRemoval:D=!0,enableQuantityUpdate:A=!1,hideHeading:Q=!1,undo:U=!1,...E})=>{var C,L,N;const[i,F]=O(p),n=(C=h.config)==null?void 0:C.shoppingCartDisplaySetting;j(()=>{const r=$.on("cart/data",c=>{F(c)},{eager:!0});return()=>{r==null||r.off()}},[]);const g=T({cartLink:"Cart.MiniCart.cartLink",checkoutLink:"Cart.MiniCart.checkoutLink"}),v=(r,c)=>z([{uid:r,quantity:c}]),M=r=>v(r,0),u=i==null?void 0:i.hasOutOfStockItems,G=V(r=>{i&&!u&&(r.preventDefault(),q(i,h.locale),setTimeout(()=>{const c=a==null?void 0:a();c&&(window.location.href=c)},W))},[i,u,a]),H=e(_,{name:"ProductList",slot:t==null?void 0:t.ProductList,context:{itemQuantityUpdateHandler:v,itemRemoveHandler:M,totalQuantity:i==null?void 0:i.totalQuantity},children:e(J,{"data-testid":"default-cart-summary-list",routeProduct:I,routeEmptyCartCTA:f,initialData:i,maxItems:(L=h.config)==null?void 0:L.miniCartMaxItemsDisplay,showMaxItems:!!((N=h.config)!=null&&N.miniCartMaxItemsDisplay),hideHeading:Q||!(i!=null&&i.totalQuantity),hideFooter:b,enableRemoveItem:D,enableUpdateItemQuantity:A,showDiscount:l,showSavings:S,undo:U,slots:{Thumbnail:t==null?void 0:t.Thumbnail,Heading:t==null?void 0:t.Heading,EmptyCart:t==null?void 0:t.EmptyCart,Footer:t==null?void 0:t.Footer,ProductAttributes:t==null?void 0:t.ProductAttributes,CartSummaryFooter:t==null?void 0:t.CartSummaryFooter,CartItem:t==null?void 0:t.CartItem,UndoBanner:t==null?void 0:t.UndoBanner,ItemTitle:t==null?void 0:t.ItemTitle,ItemPrice:t==null?void 0:t.ItemPrice,ItemQuantity:t==null?void 0:t.ItemQuantity,ItemTotal:t==null?void 0:t.ItemTotal,ItemSku:t==null?void 0:t.ItemSku,ItemRemoveAction:t==null?void 0:t.ItemRemoveAction}})}),R=r=>e(_,{name:"ProductListFooter",slot:t==null?void 0:t.ProductListFooter,context:{data:r}}),X=r=>e(_,{name:"PreCheckoutSection",slot:t==null?void 0:t.PreCheckoutSection,context:{data:r}}),w=()=>(n==null?void 0:n.subtotal)==="INCLUDING_TAX"||(n==null?void 0:n.subtotal)==="INCLUDING_EXCLUDING_TAX"?{amount:i==null?void 0:i.subtotal.includingTax.value,currency:i==null?void 0:i.subtotal.includingTax.currency,"data-testid":"subtotal-including-tax",style:{font:"inherit"}}:{amount:i==null?void 0:i.subtotal.excludingTax.value,currency:i==null?void 0:i.subtotal.excludingTax.currency,"data-testid":"subtotal-excluding-tax",style:{font:"inherit"}};return e(K,{...E,productListFooter:R(i),subtotal:i!=null&&i.totalQuantity?(i==null?void 0:i.subtotal)&&e(P,{...w()}):void 0,subtotalExcludingTaxes:i!=null&&i.totalQuantity?(i==null?void 0:i.subtotal)&&((n==null?void 0:n.subtotal)==="INCLUDING_EXCLUDING_TAX"?e(P,{amount:i==null?void 0:i.subtotal.excludingTax.value,currency:i==null?void 0:i.subtotal.excludingTax.currency,"data-testid":"subtotal-including-excluding-tax",style:{font:"inherit"}}):void 0):void 0,preCheckoutSection:X(i),ctas:i!=null&&i.totalQuantity?d("div",{children:[a&&e(k,{"data-testid":"route-checkout-button",variant:"primary",href:u?void 0:a(),disabled:u,"aria-disabled":u,onClick:G,children:g.checkoutLink}),m&&e(k,{"data-testid":"route-cart-button",variant:"tertiary",href:m(),children:g.cartLink})]}):void 0,products:H})};Z.getInitialData=async function(){return Y()};export{Z as MiniCart,Z as default};
3
+ import{jsx as e,jsxs as d,Fragment as B}from"@dropins/tools/preact-jsx-runtime.js";import{useState as O,useEffect as j,useCallback as V}from"@dropins/tools/preact-compat.js";import{classes as h,VComponent as o,Slot as _}from"@dropins/tools/lib.js";import{g as Y}from"../chunks/persisted-data.js";import{events as $}from"@dropins/tools/event-bus.js";import{Button as T,Price as k}from"@dropins/tools/components.js";/* empty css */import{useText as P}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import{s as f}from"../chunks/resetCart.js";import{a as q}from"../chunks/acdl.js";import{u as z}from"../chunks/updateProductsFromCart.js";import"../chunks/CartSummaryGrid.js";import{C as J}from"../chunks/CartSummaryList.js";import"../chunks/OrderSummary.js";import"../chunks/CartSummaryTable2.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/refreshCart.js";import"../fragments.js";import"../chunks/EmptyCart2.js";import"../chunks/createGuestCart.js";import"../chunks/WarningWithCircle.js";import"../chunks/ChevronDown.js";import"../chunks/getEstimatedTotals.js";import"../chunks/OrderSummaryLine.js";import"../chunks/ChevronUp.js";import"../chunks/Coupon.js";import"../chunks/GiftCard.js";import"../chunks/EmptyCart.js";import"../chunks/Close.js";const K=({className:x,products:p,productListFooter:b,subtotal:t,subtotalExcludingTaxes:I,preCheckoutSection:m,ctas:a,...l})=>{const y=P({subtotal:"Cart.MiniCart.subtotal",subtotalExcludingTaxes:"Cart.MiniCart.subtotalExcludingTaxes"});return e("div",{...l,className:h(["cart-mini-cart",x]),children:p&&d(B,{children:[e("div",{className:"cart-mini-cart__products","data-testid":"mini-cart-products-wrapper",children:p}),b&&e("div",{className:h(["cart-mini-cart__productListFooter"]),"data-testid":"mini-cart-product-list-footer",children:e(o,{node:b})}),d("div",{className:"cart-mini-cart__footer","data-testid":"mini-cart-subtotals",children:[t&&d("div",{className:"cart-mini-cart__footer__estimated-total","data-testid":"mini-cart-subtotal",children:[y.subtotal,e(o,{node:t})]}),I&&d("div",{className:"cart-mini-cart__footer__estimated-total-excluding-taxes","data-testid":"mini-cart-subtotal-excluding-taxes",children:[y.subtotalExcludingTaxes,e(o,{node:I,className:h(["dropin-price-summary__price","dropin-price-summary__price--muted"])})]}),m&&e("div",{className:h(["cart-mini-cart__preCheckoutSection"]),"data-testid":"mini-cart-pre-checkout-section",children:e(o,{node:m})}),a&&e(o,{node:a,className:"cart-mini-cart__footer__ctas"})]})]})})},W=100,Z=({children:x,initialData:p=null,hideFooter:b=!0,slots:t,routeProduct:I,routeCart:m,routeCheckout:a,routeEmptyCartCTA:l,showDiscount:y,showSavings:S,enableItemRemoval:D=!0,enableQuantityUpdate:A=!1,hideHeading:F=!1,undo:Q=!1,...U})=>{var C,L,N;const[i,E]=O(p),n=(C=f.config)==null?void 0:C.shoppingCartDisplaySetting;j(()=>{const r=$.on("cart/data",c=>{E(c)},{eager:!0});return()=>{r==null||r.off()}},[]);const g=P({cartLink:"Cart.MiniCart.cartLink",checkoutLink:"Cart.MiniCart.checkoutLink"}),v=(r,c)=>z([{uid:r,quantity:c}]),M=r=>v(r,0),u=i==null?void 0:i.hasOutOfStockItems,R=V(r=>{i&&!u&&(r.preventDefault(),q(i,f.locale),setTimeout(()=>{const c=a==null?void 0:a();c&&(window.location.href=c)},W))},[i,u,a]),w=e(_,{name:"ProductList",slot:t==null?void 0:t.ProductList,context:{itemQuantityUpdateHandler:v,itemRemoveHandler:M,totalQuantity:i==null?void 0:i.totalQuantity},children:e(J,{"data-testid":"default-cart-summary-list",routeProduct:I,routeEmptyCartCTA:l,initialData:i,maxItems:(L=f.config)==null?void 0:L.miniCartMaxItemsDisplay,showMaxItems:!!((N=f.config)!=null&&N.miniCartMaxItemsDisplay),hideHeading:F||!(i!=null&&i.totalQuantity),hideFooter:b,enableRemoveItem:D,enableUpdateItemQuantity:A,showDiscount:y,showSavings:S,undo:Q,slots:{Thumbnail:t==null?void 0:t.Thumbnail,Heading:t==null?void 0:t.Heading,EmptyCart:t==null?void 0:t.EmptyCart,Footer:t==null?void 0:t.Footer,RowTotalFooter:t==null?void 0:t.RowTotalFooter,ProductAttributes:t==null?void 0:t.ProductAttributes,CartSummaryFooter:t==null?void 0:t.CartSummaryFooter,CartItem:t==null?void 0:t.CartItem,UndoBanner:t==null?void 0:t.UndoBanner,ItemTitle:t==null?void 0:t.ItemTitle,ItemPrice:t==null?void 0:t.ItemPrice,ItemQuantity:t==null?void 0:t.ItemQuantity,ItemTotal:t==null?void 0:t.ItemTotal,ItemSku:t==null?void 0:t.ItemSku,ItemRemoveAction:t==null?void 0:t.ItemRemoveAction}})}),G=r=>e(_,{name:"ProductListFooter",slot:t==null?void 0:t.ProductListFooter,context:{data:r}}),H=r=>e(_,{name:"PreCheckoutSection",slot:t==null?void 0:t.PreCheckoutSection,context:{data:r}}),X=()=>(n==null?void 0:n.subtotal)==="INCLUDING_TAX"||(n==null?void 0:n.subtotal)==="INCLUDING_EXCLUDING_TAX"?{amount:i==null?void 0:i.subtotal.includingTax.value,currency:i==null?void 0:i.subtotal.includingTax.currency,"data-testid":"subtotal-including-tax",style:{font:"inherit"}}:{amount:i==null?void 0:i.subtotal.excludingTax.value,currency:i==null?void 0:i.subtotal.excludingTax.currency,"data-testid":"subtotal-excluding-tax",style:{font:"inherit"}};return e(K,{...U,productListFooter:G(i),subtotal:i!=null&&i.totalQuantity?(i==null?void 0:i.subtotal)&&e(k,{...X()}):void 0,subtotalExcludingTaxes:i!=null&&i.totalQuantity?(i==null?void 0:i.subtotal)&&((n==null?void 0:n.subtotal)==="INCLUDING_EXCLUDING_TAX"?e(k,{amount:i==null?void 0:i.subtotal.excludingTax.value,currency:i==null?void 0:i.subtotal.excludingTax.currency,"data-testid":"subtotal-including-excluding-tax",style:{font:"inherit"}}):void 0):void 0,preCheckoutSection:H(i),ctas:i!=null&&i.totalQuantity?d("div",{children:[a&&e(T,{"data-testid":"route-checkout-button",variant:"primary",href:u?void 0:a(),disabled:u,"aria-disabled":u,onClick:R,children:g.checkoutLink}),m&&e(T,{"data-testid":"route-cart-button",variant:"tertiary",href:m(),children:g.cartLink})]}):void 0,products:w})};Z.getInitialData=async function(){return Y()};export{Z as MiniCart,Z as default};
4
4
  //# sourceMappingURL=MiniCart.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MiniCart.js","sources":["/@dropins/storefront-cart/src/components/MiniCart/MiniCart.tsx","/@dropins/storefront-cart/src/containers/MiniCart/MiniCart.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nimport '@/cart/components/MiniCart/MiniCart.css';\n\nexport interface MiniCartProps extends HTMLAttributes<HTMLDivElement> {\n products?: VNode;\n productListFooter?: VNode;\n subtotal?: VNode;\n subtotalExcludingTaxes?: VNode;\n preCheckoutSection?: VNode;\n ctas?: VNode;\n}\n\nexport const MiniCart: FunctionComponent<MiniCartProps> = ({\n className,\n products,\n productListFooter,\n subtotal,\n subtotalExcludingTaxes,\n preCheckoutSection,\n ctas,\n ...props\n}) => {\n const dictionary = useText({\n subtotal: 'Cart.MiniCart.subtotal',\n subtotalExcludingTaxes: 'Cart.MiniCart.subtotalExcludingTaxes',\n });\n\n return (\n <div {...props} className={classes(['cart-mini-cart', className])}>\n {/* Content */}\n {products && (\n <>\n <div\n className=\"cart-mini-cart__products\"\n data-testid=\"mini-cart-products-wrapper\"\n >\n {products}\n </div>\n\n {/* Product List Footer */}\n {productListFooter && (\n <div\n className={classes(['cart-mini-cart__productListFooter'])}\n data-testid=\"mini-cart-product-list-footer\"\n >\n <VComponent node={productListFooter} />\n </div>\n )}\n\n <div\n className=\"cart-mini-cart__footer\"\n data-testid=\"mini-cart-subtotals\"\n >\n {/* Subtotal */}\n {subtotal && (\n <div\n className=\"cart-mini-cart__footer__estimated-total\"\n data-testid=\"mini-cart-subtotal\"\n >\n {dictionary.subtotal}\n <VComponent node={subtotal} />\n </div>\n )}\n {/* Subtotal Excluding Taxes */}\n {subtotalExcludingTaxes && (\n <div\n className=\"cart-mini-cart__footer__estimated-total-excluding-taxes\"\n data-testid=\"mini-cart-subtotal-excluding-taxes\"\n >\n {dictionary.subtotalExcludingTaxes}\n <VComponent\n node={subtotalExcludingTaxes}\n className={classes([\n 'dropin-price-summary__price',\n 'dropin-price-summary__price--muted',\n ])}\n />\n </div>\n )}\n\n {/* Pre-checkout section */}\n {preCheckoutSection && (\n <div\n className={classes(['cart-mini-cart__preCheckoutSection'])}\n data-testid=\"mini-cart-pre-checkout-section\"\n >\n <VComponent node={preCheckoutSection} />\n </div>\n )}\n\n {ctas && (\n <VComponent\n node={ctas}\n className=\"cart-mini-cart__footer__ctas\"\n />\n )}\n </div>\n </>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { CartModel } from '@/cart/data/models';\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { events } from '@adobe-commerce/event-bus';\nimport { MiniCart as MiniCartComponent } from '@/cart/components';\nimport { CartSummaryList } from '@/cart/containers';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button, ImageProps, Price } from '@adobe-commerce/elsie/components';\nimport { updateProductsFromCart } from '@/cart/api';\nimport { publishInitiateCheckoutEvent } from '@/cart/lib/acdl';\nimport { state } from '@/cart/lib/state';\n\n// Delay navigation to allow analytics event to be sent before page unload.\n// 100ms provides a reasonable balance between user experience and event reliability.\nconst ANALYTICS_NAVIGATION_DELAY_MS = 100;\n\nexport interface MiniCartProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (item: CartModel['items'][0]) => string;\n routeCart?: () => string;\n routeCheckout?: () => string;\n routeEmptyCartCTA?: () => string;\n slots?: {\n ProductList?: SlotProps;\n ProductListFooter?: SlotProps;\n PreCheckoutSection?: SlotProps;\n Thumbnail?: SlotProps<{\n item: CartModel['items'][number];\n defaultImageProps: ImageProps;\n }>;\n Heading?: SlotProps;\n EmptyCart?: SlotProps;\n Footer?: SlotProps;\n ProductAttributes?: SlotProps;\n CartSummaryFooter?: SlotProps;\n CartItem?: SlotProps; // For backward compatibility\n UndoBanner?: SlotProps<{\n item: CartModel['items'][0];\n loading: boolean;\n error?: string;\n onUndo: () => void;\n onDismiss: () => void;\n }>;\n ItemTitle?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemPrice?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemQuantity?: SlotProps<{\n item: CartModel['items'][number];\n enableUpdateItemQuantity: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n itemsLoading: Set<string>;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n }>;\n ItemTotal?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemSku?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemRemoveAction?: SlotProps<{\n item: CartModel['items'][number];\n enableRemoveItem: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n itemsLoading: Set<string>;\n }>;\n };\n hideFooter?: boolean;\n displayAllItems?: boolean;\n showDiscount?: boolean;\n showSavings?: boolean;\n enableItemRemoval?: boolean;\n enableQuantityUpdate?: boolean;\n hideHeading?: boolean;\n undo?: boolean;\n}\n\nexport const MiniCart: Container<MiniCartProps, CartModel | null> = ({\n children,\n initialData = null,\n hideFooter = true, // Default to true for MiniCart\n slots,\n routeProduct,\n routeCart,\n routeCheckout,\n routeEmptyCartCTA,\n showDiscount,\n showSavings,\n enableItemRemoval = true, // Default to true for MiniCart\n enableQuantityUpdate = false, // Default to false for MiniCart\n hideHeading = false, // Default to false for MiniCart\n undo = false,\n ...props\n}) => {\n const [data, setData] = useState<CartModel | null>(initialData);\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n\n useEffect(() => {\n const event = events.on(\n 'cart/data',\n (payload) => {\n setData(payload as CartModel);\n },\n { eager: true }\n );\n\n return () => {\n event?.off();\n };\n }, []);\n\n const dictionary = useText({\n cartLink: 'Cart.MiniCart.cartLink',\n checkoutLink: 'Cart.MiniCart.checkoutLink',\n });\n\n const handleItemQuantityUpdate = (uid: string, quantity: number) => {\n return updateProductsFromCart([{ uid, quantity }]);\n };\n\n const handleItemRemove = (uid: string) => handleItemQuantityUpdate(uid, 0);\n\n const checkoutLinkDisabled = data?.hasOutOfStockItems;\n\n const handleInitiateCheckout = useCallback((e: MouseEvent) => {\n if (data && !checkoutLinkDisabled) {\n e.preventDefault();\n publishInitiateCheckoutEvent(data, state.locale);\n \n setTimeout(() => {\n const checkoutUrl = routeCheckout?.();\n if (checkoutUrl) {\n window.location.href = checkoutUrl;\n }\n }, ANALYTICS_NAVIGATION_DELAY_MS);\n }\n }, [data, checkoutLinkDisabled, routeCheckout]);\n\n const productList = (\n <Slot\n name=\"ProductList\"\n slot={slots?.ProductList}\n context={{\n itemQuantityUpdateHandler: handleItemQuantityUpdate,\n itemRemoveHandler: handleItemRemove,\n totalQuantity: data?.totalQuantity,\n }}\n >\n <CartSummaryList\n data-testid=\"default-cart-summary-list\"\n routeProduct={routeProduct}\n routeEmptyCartCTA={routeEmptyCartCTA}\n initialData={data}\n maxItems={state.config?.miniCartMaxItemsDisplay}\n showMaxItems={!!state.config?.miniCartMaxItemsDisplay}\n hideHeading={hideHeading || !data?.totalQuantity}\n hideFooter={hideFooter}\n enableRemoveItem={enableItemRemoval}\n enableUpdateItemQuantity={enableQuantityUpdate}\n showDiscount={showDiscount}\n showSavings={showSavings}\n undo={undo}\n slots={{\n Thumbnail: slots?.Thumbnail,\n Heading: slots?.Heading,\n EmptyCart: slots?.EmptyCart,\n Footer: slots?.Footer,\n ProductAttributes: slots?.ProductAttributes,\n CartSummaryFooter: slots?.CartSummaryFooter,\n CartItem: slots?.CartItem, // Keep for backward compatibility\n UndoBanner: slots?.UndoBanner,\n ItemTitle: slots?.ItemTitle,\n ItemPrice: slots?.ItemPrice,\n ItemQuantity: slots?.ItemQuantity,\n ItemTotal: slots?.ItemTotal,\n ItemSku: slots?.ItemSku,\n ItemRemoveAction: slots?.ItemRemoveAction,\n }}\n />\n </Slot>\n );\n\n const getProductListFooter = (data: CartModel | null) => {\n return (\n <Slot\n name=\"ProductListFooter\"\n slot={slots?.ProductListFooter}\n context={{\n data,\n }}\n />\n );\n };\n\n const getPreCheckoutSection = (data: CartModel | null) => {\n return (\n <Slot\n name=\"PreCheckoutSection\"\n slot={slots?.PreCheckoutSection}\n context={{\n data,\n }}\n />\n );\n };\n\n const getSubtotalPriceProps = () =>\n cartTaxesConfig?.subtotal === 'INCLUDING_TAX' ||\n cartTaxesConfig?.subtotal === 'INCLUDING_EXCLUDING_TAX'\n ? {\n amount: data?.subtotal.includingTax.value,\n currency: data?.subtotal.includingTax.currency,\n 'data-testid': 'subtotal-including-tax',\n style: { font: 'inherit' },\n }\n : {\n amount: data?.subtotal.excludingTax.value,\n currency: data?.subtotal.excludingTax.currency,\n 'data-testid': 'subtotal-excluding-tax',\n style: { font: 'inherit' },\n };\n\n return (\n <MiniCartComponent\n {...props}\n productListFooter={getProductListFooter(data)}\n subtotal={\n !data?.totalQuantity\n ? undefined\n : data?.subtotal && <Price {...getSubtotalPriceProps()} />\n }\n subtotalExcludingTaxes={\n !data?.totalQuantity\n ? undefined\n : data?.subtotal &&\n (cartTaxesConfig?.subtotal === 'INCLUDING_EXCLUDING_TAX' ? (\n <Price\n amount={data?.subtotal.excludingTax.value}\n currency={data?.subtotal.excludingTax.currency}\n data-testid=\"subtotal-including-excluding-tax\"\n style={{ font: 'inherit' }}\n />\n ) : undefined)\n }\n preCheckoutSection={getPreCheckoutSection(data)}\n ctas={\n !data?.totalQuantity ? undefined : (\n <div>\n {routeCheckout && (\n <Button\n data-testid=\"route-checkout-button\"\n variant=\"primary\"\n href={checkoutLinkDisabled ? undefined : routeCheckout()}\n disabled={checkoutLinkDisabled}\n aria-disabled={checkoutLinkDisabled}\n onClick={handleInitiateCheckout}\n >\n {dictionary.checkoutLink}\n </Button>\n )}\n {routeCart && (\n <Button\n data-testid=\"route-cart-button\"\n variant=\"tertiary\"\n href={routeCart()}\n >\n {dictionary.cartLink}\n </Button>\n )}\n </div>\n )\n }\n products={productList}\n />\n );\n};\n\nMiniCart.getInitialData = async function () {\n return getPersistedCartData();\n};\n"],"names":["MiniCart","className","products","productListFooter","subtotal","subtotalExcludingTaxes","preCheckoutSection","ctas","props","dictionary","useText","jsx","classes","jsxs","Fragment","VComponent","ANALYTICS_NAVIGATION_DELAY_MS","children","initialData","hideFooter","slots","routeProduct","routeCart","routeCheckout","routeEmptyCartCTA","showDiscount","showSavings","enableItemRemoval","enableQuantityUpdate","hideHeading","undo","data","setData","useState","cartTaxesConfig","_a","state","useEffect","event","events","payload","handleItemQuantityUpdate","uid","quantity","updateProductsFromCart","handleItemRemove","checkoutLinkDisabled","handleInitiateCheckout","useCallback","e","publishInitiateCheckoutEvent","checkoutUrl","productList","Slot","CartSummaryList","_b","_c","getProductListFooter","getPreCheckoutSection","getSubtotalPriceProps","MiniCartComponent","Price","Button","getPersistedCartData"],"mappings":"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"}
1
+ {"version":3,"file":"MiniCart.js","sources":["/@dropins/storefront-cart/src/components/MiniCart/MiniCart.tsx","/@dropins/storefront-cart/src/containers/MiniCart/MiniCart.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { VComponent, classes } from '@adobe-commerce/elsie/lib';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nimport '@/cart/components/MiniCart/MiniCart.css';\n\nexport interface MiniCartProps extends HTMLAttributes<HTMLDivElement> {\n products?: VNode;\n productListFooter?: VNode;\n subtotal?: VNode;\n subtotalExcludingTaxes?: VNode;\n preCheckoutSection?: VNode;\n ctas?: VNode;\n}\n\nexport const MiniCart: FunctionComponent<MiniCartProps> = ({\n className,\n products,\n productListFooter,\n subtotal,\n subtotalExcludingTaxes,\n preCheckoutSection,\n ctas,\n ...props\n}) => {\n const dictionary = useText({\n subtotal: 'Cart.MiniCart.subtotal',\n subtotalExcludingTaxes: 'Cart.MiniCart.subtotalExcludingTaxes',\n });\n\n return (\n <div {...props} className={classes(['cart-mini-cart', className])}>\n {/* Content */}\n {products && (\n <>\n <div\n className=\"cart-mini-cart__products\"\n data-testid=\"mini-cart-products-wrapper\"\n >\n {products}\n </div>\n\n {/* Product List Footer */}\n {productListFooter && (\n <div\n className={classes(['cart-mini-cart__productListFooter'])}\n data-testid=\"mini-cart-product-list-footer\"\n >\n <VComponent node={productListFooter} />\n </div>\n )}\n\n <div\n className=\"cart-mini-cart__footer\"\n data-testid=\"mini-cart-subtotals\"\n >\n {/* Subtotal */}\n {subtotal && (\n <div\n className=\"cart-mini-cart__footer__estimated-total\"\n data-testid=\"mini-cart-subtotal\"\n >\n {dictionary.subtotal}\n <VComponent node={subtotal} />\n </div>\n )}\n {/* Subtotal Excluding Taxes */}\n {subtotalExcludingTaxes && (\n <div\n className=\"cart-mini-cart__footer__estimated-total-excluding-taxes\"\n data-testid=\"mini-cart-subtotal-excluding-taxes\"\n >\n {dictionary.subtotalExcludingTaxes}\n <VComponent\n node={subtotalExcludingTaxes}\n className={classes([\n 'dropin-price-summary__price',\n 'dropin-price-summary__price--muted',\n ])}\n />\n </div>\n )}\n\n {/* Pre-checkout section */}\n {preCheckoutSection && (\n <div\n className={classes(['cart-mini-cart__preCheckoutSection'])}\n data-testid=\"mini-cart-pre-checkout-section\"\n >\n <VComponent node={preCheckoutSection} />\n </div>\n )}\n\n {ctas && (\n <VComponent\n node={ctas}\n className=\"cart-mini-cart__footer__ctas\"\n />\n )}\n </div>\n </>\n )}\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { CartModel } from '@/cart/data/models';\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { events } from '@adobe-commerce/event-bus';\nimport { MiniCart as MiniCartComponent } from '@/cart/components';\nimport { CartSummaryList } from '@/cart/containers';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Button, ImageProps, Price } from '@adobe-commerce/elsie/components';\nimport { updateProductsFromCart } from '@/cart/api';\nimport { publishInitiateCheckoutEvent } from '@/cart/lib/acdl';\nimport { state } from '@/cart/lib/state';\n\n// Delay navigation to allow analytics event to be sent before page unload.\n// 100ms provides a reasonable balance between user experience and event reliability.\nconst ANALYTICS_NAVIGATION_DELAY_MS = 100;\n\nexport interface MiniCartProps extends HTMLAttributes<HTMLDivElement> {\n routeProduct?: (item: CartModel['items'][0]) => string;\n routeCart?: () => string;\n routeCheckout?: () => string;\n routeEmptyCartCTA?: () => string;\n slots?: {\n ProductList?: SlotProps;\n ProductListFooter?: SlotProps;\n PreCheckoutSection?: SlotProps;\n Thumbnail?: SlotProps<{\n item: CartModel['items'][number];\n defaultImageProps: ImageProps;\n }>;\n Heading?: SlotProps;\n EmptyCart?: SlotProps;\n Footer?: SlotProps;\n RowTotalFooter?: SlotProps<{ item: CartModel['items'][number] }>;\n ProductAttributes?: SlotProps;\n CartSummaryFooter?: SlotProps;\n CartItem?: SlotProps; // For backward compatibility\n UndoBanner?: SlotProps<{\n item: CartModel['items'][0];\n loading: boolean;\n error?: string;\n onUndo: () => void;\n onDismiss: () => void;\n }>;\n ItemTitle?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemPrice?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemQuantity?: SlotProps<{\n item: CartModel['items'][number];\n enableUpdateItemQuantity: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n itemsLoading: Set<string>;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n }>;\n ItemTotal?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemSku?: SlotProps<{ item: CartModel['items'][number] }>;\n ItemRemoveAction?: SlotProps<{\n item: CartModel['items'][number];\n enableRemoveItem: boolean;\n handleItemQuantityUpdate: (\n item: CartModel['items'][number],\n quantity: number\n ) => void;\n handleItemsError: (uid: string, message?: string) => void;\n handleItemsLoading: (uid: string, state: boolean) => void;\n onItemUpdate?: ({ item }: { item: CartModel['items'][number] }) => void;\n itemsLoading: Set<string>;\n }>;\n };\n hideFooter?: boolean;\n displayAllItems?: boolean;\n showDiscount?: boolean;\n showSavings?: boolean;\n enableItemRemoval?: boolean;\n enableQuantityUpdate?: boolean;\n hideHeading?: boolean;\n undo?: boolean;\n}\n\nexport const MiniCart: Container<MiniCartProps, CartModel | null> = ({\n children,\n initialData = null,\n hideFooter = true, // Default to true for MiniCart\n slots,\n routeProduct,\n routeCart,\n routeCheckout,\n routeEmptyCartCTA,\n showDiscount,\n showSavings,\n enableItemRemoval = true, // Default to true for MiniCart\n enableQuantityUpdate = false, // Default to false for MiniCart\n hideHeading = false, // Default to false for MiniCart\n undo = false,\n ...props\n}) => {\n const [data, setData] = useState<CartModel | null>(initialData);\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n\n useEffect(() => {\n const event = events.on(\n 'cart/data',\n (payload) => {\n setData(payload as CartModel);\n },\n { eager: true }\n );\n\n return () => {\n event?.off();\n };\n }, []);\n\n const dictionary = useText({\n cartLink: 'Cart.MiniCart.cartLink',\n checkoutLink: 'Cart.MiniCart.checkoutLink',\n });\n\n const handleItemQuantityUpdate = (uid: string, quantity: number) => {\n return updateProductsFromCart([{ uid, quantity }]);\n };\n\n const handleItemRemove = (uid: string) => handleItemQuantityUpdate(uid, 0);\n\n const checkoutLinkDisabled = data?.hasOutOfStockItems;\n\n const handleInitiateCheckout = useCallback(\n (e: MouseEvent) => {\n if (data && !checkoutLinkDisabled) {\n e.preventDefault();\n publishInitiateCheckoutEvent(data, state.locale);\n\n setTimeout(() => {\n const checkoutUrl = routeCheckout?.();\n if (checkoutUrl) {\n window.location.href = checkoutUrl;\n }\n }, ANALYTICS_NAVIGATION_DELAY_MS);\n }\n },\n [data, checkoutLinkDisabled, routeCheckout]\n );\n\n const productList = (\n <Slot\n name=\"ProductList\"\n slot={slots?.ProductList}\n context={{\n itemQuantityUpdateHandler: handleItemQuantityUpdate,\n itemRemoveHandler: handleItemRemove,\n totalQuantity: data?.totalQuantity,\n }}\n >\n <CartSummaryList\n data-testid=\"default-cart-summary-list\"\n routeProduct={routeProduct}\n routeEmptyCartCTA={routeEmptyCartCTA}\n initialData={data}\n maxItems={state.config?.miniCartMaxItemsDisplay}\n showMaxItems={!!state.config?.miniCartMaxItemsDisplay}\n hideHeading={hideHeading || !data?.totalQuantity}\n hideFooter={hideFooter}\n enableRemoveItem={enableItemRemoval}\n enableUpdateItemQuantity={enableQuantityUpdate}\n showDiscount={showDiscount}\n showSavings={showSavings}\n undo={undo}\n slots={{\n Thumbnail: slots?.Thumbnail,\n Heading: slots?.Heading,\n EmptyCart: slots?.EmptyCart,\n Footer: slots?.Footer,\n RowTotalFooter: slots?.RowTotalFooter,\n ProductAttributes: slots?.ProductAttributes,\n CartSummaryFooter: slots?.CartSummaryFooter,\n CartItem: slots?.CartItem, // Keep for backward compatibility\n UndoBanner: slots?.UndoBanner,\n ItemTitle: slots?.ItemTitle,\n ItemPrice: slots?.ItemPrice,\n ItemQuantity: slots?.ItemQuantity,\n ItemTotal: slots?.ItemTotal,\n ItemSku: slots?.ItemSku,\n ItemRemoveAction: slots?.ItemRemoveAction,\n }}\n />\n </Slot>\n );\n\n const getProductListFooter = (data: CartModel | null) => {\n return (\n <Slot\n name=\"ProductListFooter\"\n slot={slots?.ProductListFooter}\n context={{\n data,\n }}\n />\n );\n };\n\n const getPreCheckoutSection = (data: CartModel | null) => {\n return (\n <Slot\n name=\"PreCheckoutSection\"\n slot={slots?.PreCheckoutSection}\n context={{\n data,\n }}\n />\n );\n };\n\n const getSubtotalPriceProps = () =>\n cartTaxesConfig?.subtotal === 'INCLUDING_TAX' ||\n cartTaxesConfig?.subtotal === 'INCLUDING_EXCLUDING_TAX'\n ? {\n amount: data?.subtotal.includingTax.value,\n currency: data?.subtotal.includingTax.currency,\n 'data-testid': 'subtotal-including-tax',\n style: { font: 'inherit' },\n }\n : {\n amount: data?.subtotal.excludingTax.value,\n currency: data?.subtotal.excludingTax.currency,\n 'data-testid': 'subtotal-excluding-tax',\n style: { font: 'inherit' },\n };\n\n return (\n <MiniCartComponent\n {...props}\n productListFooter={getProductListFooter(data)}\n subtotal={\n !data?.totalQuantity\n ? undefined\n : data?.subtotal && <Price {...getSubtotalPriceProps()} />\n }\n subtotalExcludingTaxes={\n !data?.totalQuantity\n ? undefined\n : data?.subtotal &&\n (cartTaxesConfig?.subtotal === 'INCLUDING_EXCLUDING_TAX' ? (\n <Price\n amount={data?.subtotal.excludingTax.value}\n currency={data?.subtotal.excludingTax.currency}\n data-testid=\"subtotal-including-excluding-tax\"\n style={{ font: 'inherit' }}\n />\n ) : undefined)\n }\n preCheckoutSection={getPreCheckoutSection(data)}\n ctas={\n !data?.totalQuantity ? undefined : (\n <div>\n {routeCheckout && (\n <Button\n data-testid=\"route-checkout-button\"\n variant=\"primary\"\n href={checkoutLinkDisabled ? undefined : routeCheckout()}\n disabled={checkoutLinkDisabled}\n aria-disabled={checkoutLinkDisabled}\n onClick={handleInitiateCheckout}\n >\n {dictionary.checkoutLink}\n </Button>\n )}\n {routeCart && (\n <Button\n data-testid=\"route-cart-button\"\n variant=\"tertiary\"\n href={routeCart()}\n >\n {dictionary.cartLink}\n </Button>\n )}\n </div>\n )\n }\n products={productList}\n />\n );\n};\n\nMiniCart.getInitialData = async function () {\n return getPersistedCartData();\n};\n"],"names":["MiniCart","className","products","productListFooter","subtotal","subtotalExcludingTaxes","preCheckoutSection","ctas","props","dictionary","useText","jsx","classes","jsxs","Fragment","VComponent","ANALYTICS_NAVIGATION_DELAY_MS","children","initialData","hideFooter","slots","routeProduct","routeCart","routeCheckout","routeEmptyCartCTA","showDiscount","showSavings","enableItemRemoval","enableQuantityUpdate","hideHeading","undo","data","setData","useState","cartTaxesConfig","_a","state","useEffect","event","events","payload","handleItemQuantityUpdate","uid","quantity","updateProductsFromCart","handleItemRemove","checkoutLinkDisabled","handleInitiateCheckout","useCallback","e","publishInitiateCheckoutEvent","checkoutUrl","productList","Slot","CartSummaryList","_b","_c","getProductListFooter","getPreCheckoutSection","getSubtotalPriceProps","MiniCartComponent","Price","Button","getPersistedCartData"],"mappings":"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"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-cart", "version": "3.0.0", "@dropins/tools": "~1.6.0", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-cart", "version": "3.1.0-beta1", "@dropins/tools": "~1.7.0-beta3", "license": "SEE LICENSE IN LICENSE.md"}