@dropins/storefront-cart 3.3.0-beta.0 → 3.3.0-beta.2
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.
- package/CHANGELOG.md +12 -0
- package/api.js +28 -448
- package/api.js.map +1 -1
- package/containers/CartSummaryGrid.js +1 -1
- package/containers/CartSummaryList.js +1 -1
- package/containers/CartSummaryTable.js +1 -1
- package/containers/Coupons.js +1 -1
- package/containers/Coupons.js.map +1 -1
- package/containers/EmptyCart.js +1 -1
- package/containers/EstimateShipping.js +1 -1
- package/containers/EstimateShipping.js.map +1 -1
- package/containers/GiftCards.js +1 -1
- package/containers/GiftCards.js.map +1 -1
- package/containers/GiftOptions.js +1 -1
- package/containers/GiftOptions.js.map +1 -1
- package/containers/MiniCart.js +1 -1
- package/containers/MiniCart.js.map +1 -1
- package/containers/OrderSummary.js +1 -1
- package/containers/OrderSummaryLine.js +1 -1
- package/fragments.js +421 -1
- package/fragments.js.map +1 -1
- package/package.json +1 -1
- package/render.js +1 -1
- package/render.js.map +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{C as
|
|
3
|
+
import{C as l,C as x}from"../chunks/CartSummaryGrid.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"../chunks/components.js";import"@dropins/tools/lib.js";import"@dropins/tools/i18n.js";import"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";import"../api.js";import"@dropins/tools/event-bus.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";export{l as CartSummaryGrid,x as default};
|
|
4
4
|
//# sourceMappingURL=CartSummaryGrid.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{C as
|
|
3
|
+
import{C as l,C as x}from"../chunks/CartSummaryList.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import"../chunks/components.js";import"@dropins/tools/i18n.js";import"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";import"../api.js";import"@dropins/tools/event-bus.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";export{l as CartSummaryList,x as default};
|
|
4
4
|
//# sourceMappingURL=CartSummaryList.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{C,e as
|
|
3
|
+
import{C as U,e as b,a as f,f as g,b as B,d as k,c as u,C as D,g as H}from"../chunks/CartSummaryTable.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";import"../chunks/components.js";import"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/preact-hooks.js";import"../api.js";import"@dropins/tools/event-bus.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/EmptyCart.js";export{U as CartSummaryTable,b as createDismissCallback,f as createDismissHandler,g as createUndoBanner,B as createUndoBannerActions,k as createUndoCallback,u as createUndoHandler,D as default,H as getIsUndoBeingRemoved};
|
|
4
4
|
//# sourceMappingURL=CartSummaryTable.js.map
|
package/containers/Coupons.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as E,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as d}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as b,Icon as x,Button as L,Input as R}from"@dropins/tools/components.js";import{S as P,C as B}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import{applyCouponsToCart as S,ApplyCouponsStrategy as f}from"../api.js";import{events as h}from"@dropins/tools/event-bus.js";import{useText as $}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";const
|
|
3
|
+
import{jsxs as E,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as d}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as b,Icon as x,Button as L,Input as R}from"@dropins/tools/components.js";import{S as P,C as B}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import{applyCouponsToCart as S,ApplyCouponsStrategy as f}from"../api.js";import{events as h}from"@dropins/tools/event-bus.js";import{useText as $}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const H=({children:z,...w})=>{const[m,c]=l(new Set),[u,C]=l([]),[i,p]=l(new Set),s=$({applyButton:"Cart.PriceSummary.coupon.applyAction",placeholder:"Cart.PriceSummary.coupon.placeholder",ariaLabelRemove:"Cart.PriceSummary.coupon.ariaLabelRemove"}),y=async o=>{const e=o.coupon,n=new Set(m);n.add(e),p(new Set);const r=Array.from(n);S(r,f.REPLACE).then(a=>{if(a===null)throw new Error("Error adding coupon code");c(n)}).catch(a=>{console.warn(a),p(new Set([a.message]))})},g=o=>{const e=new Set(m);e.delete(o),p(new Set);const n=Array.from(e);S(n,f.REPLACE).then(r=>{if(r===null)throw new Error("Error removing coupon code");c(e)}).catch(r=>{console.warn(r),p(new Set([r.message]))})};d(()=>{const o=h.on("cart/data",e=>{const n=e==null?void 0:e.appliedCoupons;if(!n){C([]),p(new Set);return}const r=n.map(a=>a.code);C(r),p(new Set)},{eager:!0});return()=>{o==null||o.off()}},[]),d(()=>{c(new Set(u))},[u]),d(()=>{const o=h.on("shipping/estimate",()=>{p(new Set)},{eager:!0});return()=>{o==null||o.off()}},[]);const v=u.map((o,e)=>E(b,{className:"coupon-code-form__applied-item",children:[t("span",{children:o}),t("button",{"aria-label":`${s.ariaLabelRemove} ${o}`,onClick:()=>g(o),"data-testid":`remove-coupon-${e+1}`,children:t(x,{source:P,size:"16"})})]},o)),A=i.size>0?t("div",{"data-testid":"coupon-code-error",children:Array.from(i)[0]}):void 0;return t(B,{...w,couponCodeField:t(R,{"aria-label":s.placeholder,type:"text",placeholder:s.placeholder,name:"coupon",variant:"primary",value:"","data-testid":"coupon-code-input",maxLength:50,error:i.size>0}),applyCouponsButton:t(L,{variant:"secondary",children:s.applyButton}),error:A,appliedCoupons:t("div",{children:v}),onApplyCoupon:y})};export{H as Coupons,H as default};
|
|
4
4
|
//# sourceMappingURL=Coupons.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Coupons.js","sources":["/@dropins/storefront-cart/src/containers/Coupons/Coupons.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 { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { applyCouponsToCart, ApplyCouponsStrategy } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface CouponsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Coupons: Container<CouponsProps> = ({ children, ...props }) => {\n const [successfulCouponSet, setSuccessfulCouponSet] = useState(new Set());\n const [appliedCouponsArray, setAppliedCouponsArray] = useState<string[]>([]);\n const [couponError, setCouponError] = useState(new Set());\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.coupon.applyAction',\n placeholder: 'Cart.PriceSummary.coupon.placeholder',\n ariaLabelRemove: 'Cart.PriceSummary.coupon.ariaLabelRemove',\n });\n\n const handleApplyCoupon = async (value: { coupon: string }) => {\n const couponCode = value.coupon;\n\n const newSet = new Set(successfulCouponSet);\n newSet.add(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n const handleRemoveCoupon = (couponCode: string) => {\n const newSet = new Set(successfulCouponSet);\n newSet.delete(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedCoupons = payload?.appliedCoupons;\n\n if (!appliedCoupons) {\n // When appliedCoupons returns null, no coupons are applied\n setAppliedCouponsArray([]);\n // Clear error message\n setCouponError(new Set());\n return;\n }\n\n const couponCodes = appliedCoupons.map((coupon) => coupon.code);\n\n setAppliedCouponsArray(couponCodes);\n // Clear error message\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulCouponSet(new Set(appliedCouponsArray));\n }, [appliedCouponsArray]);\n\n useEffect(() => {\n const cartEvent = events.on(\n 'shipping/estimate',\n () => {\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n const appliedCoupons = appliedCouponsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveCoupon(code)}\n data-testid={`remove-coupon-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n couponError.size > 0 ? (\n <div data-testid=\"coupon-code-error\">\n {Array.from(couponError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n couponCodeField={\n <Input\n aria-label={dictionary.placeholder}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"coupon\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"coupon-code-input\"\n maxLength={50}\n error={couponError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedCoupons}</div>}\n onApplyCoupon={handleApplyCoupon}\n />\n );\n};\n"],"names":["Coupons","children","props","successfulCouponSet","setSuccessfulCouponSet","useState","appliedCouponsArray","setAppliedCouponsArray","couponError","setCouponError","dictionary","useText","handleApplyCoupon","value","couponCode","newSet","couponCodes","applyCouponsToCart","ApplyCouponsStrategy","result","error","handleRemoveCoupon","useEffect","cartEvent","events","payload","appliedCoupons","coupon","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","Input","Button"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Coupons.js","sources":["/@dropins/storefront-cart/src/containers/Coupons/Coupons.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 { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { applyCouponsToCart, ApplyCouponsStrategy } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface CouponsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Coupons: Container<CouponsProps> = ({ children, ...props }) => {\n const [successfulCouponSet, setSuccessfulCouponSet] = useState(new Set());\n const [appliedCouponsArray, setAppliedCouponsArray] = useState<string[]>([]);\n const [couponError, setCouponError] = useState(new Set());\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.coupon.applyAction',\n placeholder: 'Cart.PriceSummary.coupon.placeholder',\n ariaLabelRemove: 'Cart.PriceSummary.coupon.ariaLabelRemove',\n });\n\n const handleApplyCoupon = async (value: { coupon: string }) => {\n const couponCode = value.coupon;\n\n const newSet = new Set(successfulCouponSet);\n newSet.add(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n const handleRemoveCoupon = (couponCode: string) => {\n const newSet = new Set(successfulCouponSet);\n newSet.delete(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedCoupons = payload?.appliedCoupons;\n\n if (!appliedCoupons) {\n // When appliedCoupons returns null, no coupons are applied\n setAppliedCouponsArray([]);\n // Clear error message\n setCouponError(new Set());\n return;\n }\n\n const couponCodes = appliedCoupons.map((coupon) => coupon.code);\n\n setAppliedCouponsArray(couponCodes);\n // Clear error message\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulCouponSet(new Set(appliedCouponsArray));\n }, [appliedCouponsArray]);\n\n useEffect(() => {\n const cartEvent = events.on(\n 'shipping/estimate',\n () => {\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n const appliedCoupons = appliedCouponsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveCoupon(code)}\n data-testid={`remove-coupon-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n couponError.size > 0 ? (\n <div data-testid=\"coupon-code-error\">\n {Array.from(couponError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n couponCodeField={\n <Input\n aria-label={dictionary.placeholder}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"coupon\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"coupon-code-input\"\n maxLength={50}\n error={couponError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedCoupons}</div>}\n onApplyCoupon={handleApplyCoupon}\n />\n );\n};\n"],"names":["Coupons","children","props","successfulCouponSet","setSuccessfulCouponSet","useState","appliedCouponsArray","setAppliedCouponsArray","couponError","setCouponError","dictionary","useText","handleApplyCoupon","value","couponCode","newSet","couponCodes","applyCouponsToCart","ApplyCouponsStrategy","result","error","handleRemoveCoupon","useEffect","cartEvent","events","payload","appliedCoupons","coupon","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","Input","Button"],"mappings":"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"}
|
package/containers/EmptyCart.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{E as
|
|
3
|
+
import{E as u,E as x}from"../chunks/EmptyCart.js";import"@dropins/tools/preact-jsx-runtime.js";import"../chunks/components.js";import"@dropins/tools/lib.js";import"@dropins/tools/i18n.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/components.js";import"@dropins/tools/preact-hooks.js";import"../api.js";import"@dropins/tools/event-bus.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";export{u as EmptyCart,x as default};
|
|
4
4
|
//# sourceMappingURL=EmptyCart.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/lib.js";import{Button as X,Input as R,Picker as U,Price as N}from"@dropins/tools/components.js";import{e as k}from"../chunks/components.js";import{useState as p,useEffect as D,useCallback as M}from"@dropins/tools/preact-compat.js";import"@dropins/tools/preact-hooks.js";import{getCountries as j,getRegions as $,getEstimateShipping as q,
|
|
3
|
+
import{jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/lib.js";import{Button as X,Input as R,Picker as U,Price as N}from"@dropins/tools/components.js";import{e as k}from"../chunks/components.js";import{useState as p,useEffect as D,useCallback as M}from"@dropins/tools/preact-compat.js";import"@dropins/tools/preact-hooks.js";import{getCountries as j,getRegions as $,getEstimateShipping as q,a as A,s as G}from"../api.js";import{events as B}from"@dropins/tools/event-bus.js";import{useText as w}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const H=()=>{const[b,F]=p(!1),[T,P]=p([]),[_,m]=p("US"),[h,S]=p(""),[n,y]=p(""),[f,L]=p([]),[g,d]=p(!1),[x,v]=p(),[C,t]=p(),[o,E]=p(""),[e,u]=p(!1),I=()=>{m("US"),S(""),y(""),v(null),t(null),E(""),u(!1)},Z=async c=>{const{shippingCountry:i,shippingState:r="",shippingZip:s=""}=c,V={countryCode:i,postcode:s,region:{region:r}};return F(!0),q(V).then(l=>(l&&(v({amount:l.amount.value,currency:l.amount.currency,priceIncludingtax:{amount:l.price_incl_tax.value,currency:l.price_incl_tax.currency},priceExcludingtax:{amount:l.price_excl_tax.value,currency:l.price_excl_tax.currency}}),t({carrier_code:l.carrier_code,method_code:l.method_code}),m(i),S(r),y(s),E(r||s||i),u(!0)),m(i),S(r),y(s),E(r||s||i),l)).finally(()=>{F(!1)})},z=c=>{c.preventDefault(),S(""),y("");const i=c.target.value;m(i)};return D(()=>{j().then(c=>{let i="US";const r=c.map(s=>(s.isDefaultCountry&&(i=s.id),{text:s.label,value:s.id}));P(r),m(i)})},[]),D(()=>{d(!0),$(_).then(c=>{const i=c.map(r=>({text:r.name,value:r.code}));L(i)}).finally(()=>{d(!1)})},[_,d]),{loading:b,regionsLoading:g,estimatedDestinationText:o,countries:T,selectedCountry:_,selectedRegion:h,selectedZip:n,regions:f,estimatedShippingPrice:x,estimatedShippingMethod:C,shippingEstimated:e,handleEstimateShipping:Z,handleCountrySelected:z,resetValues:I,setPriceSummaryLoading:F}},se=({showDefaultEstimatedShippingCost:b})=>{var E;const[F,T]=p(!1),{loading:P,countries:_,regions:m,selectedCountry:h,estimatedDestinationText:S,estimatedShippingPrice:n,handleCountrySelected:y,handleEstimateShipping:f,regionsLoading:L,selectedRegion:g,selectedZip:d,shippingEstimated:x,resetValues:v}=H(),C=M(e=>{f(e).then(()=>{A(e)})},[f]);D(()=>{const e=B.on("cart/data",u=>{var i,r,s;T((u==null?void 0:u.isVirtual)||!1);const I=(r=(i=u==null?void 0:u.addresses)==null?void 0:i.shipping)==null?void 0:r[0];if(b&&!I&&f({shippingCountry:((s=G.config)==null?void 0:s.defaultCountry)??""}),!I)return;const{countryCode:Z,regionCode:z,zipCode:c}=I;C({shippingCountry:Z,shippingState:z,shippingZip:c})},{eager:!0});return()=>{e==null||e.off()}},[]),D(()=>{const e=B.on("cart/updated",()=>{x&&f({shippingCountry:h,shippingState:g,shippingZip:d})});return()=>{e==null||e.off()}},[x,h,g,d,f]),D(()=>{const e=B.on("cart/reset",()=>{v(),A(null)});return()=>{e==null||e.off()}},[v]),D(()=>{const e=B.on("cart/merged",()=>{x&&C({shippingCountry:h,shippingState:g,shippingZip:d})});return()=>{e==null||e.off()}},[x,h,g,d,C]);const t=w({applyButton:"Cart.PriceSummary.estimatedShippingForm.apply.label",countryField:"Cart.PriceSummary.estimatedShippingForm.country.placeholder",freeShipping:"Cart.PriceSummary.freeShipping",stateField:"Cart.PriceSummary.estimatedShippingForm.state.placeholder",taxToBeDetermined:"Cart.PriceSummary.taxToBeDetermined",zipField:"Cart.PriceSummary.estimatedShippingForm.zip.placeholder"});if(F)return null;const o=(E=G.config)==null?void 0:E.shoppingCartDisplaySetting;return a(k,{loading:P,taxIncluded:(o==null?void 0:o.shipping)==="INCLUDING_TAX",taxExcluded:(o==null?void 0:o.shipping)==="INCLUDING_EXCLUDING_TAX",price:(n==null?void 0:n.amount)==0?a("span",{"data-testId":"free-shipping",children:t.freeShipping}):(o==null?void 0:o.shipping)==="INCLUDING_TAX"&&n?a(N,{"data-testid":"shipping",...n.priceIncludingtax}):n?a(N,{...n}):a("span",{children:t.taxToBeDetermined}),estimated:!0,priceExcludingTax:n!=null&&n.priceExcludingtax?a(N,{"data-testid":"shipping-excluding-tax",...n.priceExcludingtax}):a("span",{children:t.taxToBeDetermined}),countryField:a(U,{name:"shippingCountry",placeholder:t.countryField,value:h,variant:"primary",options:_,handleSelect:y,"data-testid":"estimate-shipping-country-selector"}),stateField:m.length>0?a(U,{name:"shippingState",placeholder:t.stateField,variant:"primary",options:m,value:g,"data-testid":"estimate-shipping-state-selector",disabled:L}):a(R,{"aria-label":t.stateField,name:"shippingState",placeholder:t.stateField,variant:"primary",value:g,disabled:L,"data-testid":"estimate-shipping-state-input",maxLength:50}),zipField:a(R,{"aria-label":t.zipField,name:"shippingZip",placeholder:t.zipField,variant:"primary","data-testid":"estimate-shipping-zip-input",value:d,maxLength:12}),estimateButton:a(X,{variant:"secondary","data-testid":"estimate-shipping-apply-button","aria-label":t.applyButton,children:t.applyButton}),destinationText:S||t.taxToBeDetermined,onEstimate:C})};export{se as EstimateShipping,se as default};
|
|
4
4
|
//# sourceMappingURL=EstimateShipping.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EstimateShipping.js","sources":["/@dropins/storefront-cart/src/hooks/useEstimatedShipping.ts","/@dropins/storefront-cart/src/containers/EstimateShipping/EstimateShipping.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 { useEffect, useState } from 'preact/compat';\n\nimport {\n EstimateAddressInput,\n getCountries,\n getEstimateShipping,\n getRegions,\n} from '@/cart/api';\nimport { PriceProps } from '@adobe-commerce/elsie/components';\n\nexport const useEstimatedShipping = () => {\n const [priceSummaryLoading, setPriceSummaryLoading] =\n useState<boolean>(false);\n\n /* State data related to estimating costs in the Price Summary component */\n const [countries, setCountries] = useState<{ text: string; value: string }[]>(\n []\n );\n const [selectedCountry, setSelectedCountry] = useState<string>('US');\n const [selectedRegion, setSelectedRegion] = useState<string>('');\n const [selectedZip, setSelectedZip] = useState<string>('');\n const [regions, setRegions] = useState<{ text: string; value: string }[]>([]);\n const [regionsLoading, setRegionsLoading] = useState<boolean>(false);\n const [estimatedShippingPrice, setEstimatedShippingPrice] = useState<\n PriceProps | null | any\n >();\n const [estimatedShippingMethod, setEstimatedShippingMethod] = useState<any>();\n const [estimatedDestinationText, setEstimatedDestinationText] =\n useState<string>('');\n const [shippingEstimated, setShippingEstimated] = useState<boolean>(false);\n\n const resetValues = () => {\n setSelectedCountry('US');\n setSelectedRegion('');\n setSelectedZip('');\n setEstimatedShippingPrice(null);\n setEstimatedShippingMethod(null);\n setEstimatedDestinationText('');\n setShippingEstimated(false);\n };\n\n const handleEstimateShipping = async (formValues: {\n shippingCountry: string;\n shippingState?: string;\n shippingZip?: string;\n }) => {\n const {\n shippingCountry,\n shippingState = '',\n shippingZip = '',\n } = formValues;\n\n const addressData: EstimateAddressInput = {\n countryCode: shippingCountry,\n postcode: shippingZip,\n region: {\n region: shippingState,\n },\n };\n\n setPriceSummaryLoading(true);\n\n return getEstimateShipping(addressData)\n .then((data) => {\n if (data) {\n setEstimatedShippingPrice({\n amount: data.amount.value,\n currency: data.amount.currency,\n priceIncludingtax: {\n amount: data.price_incl_tax.value,\n currency: data.price_incl_tax.currency,\n },\n priceExcludingtax: {\n amount: data.price_excl_tax.value,\n currency: data.price_excl_tax.currency,\n },\n });\n setEstimatedShippingMethod({\n carrier_code: data.carrier_code,\n method_code: data.method_code,\n });\n\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n\n setShippingEstimated(true);\n }\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n return data;\n })\n .finally(() => {\n setPriceSummaryLoading(false);\n });\n };\n\n const handleCountrySelected = (event: Event) => {\n event.preventDefault();\n\n setSelectedRegion('');\n setSelectedZip('');\n\n const value = (event.target as HTMLSelectElement).value;\n setSelectedCountry(value);\n };\n\n // Get list of countries on initial load\n useEffect(() => {\n getCountries().then((countries) => {\n let defaultCountry = 'US';\n const transformedCountries = countries.map((country) => {\n if (country.isDefaultCountry) {\n defaultCountry = country.id;\n }\n return {\n text: country.label,\n value: country.id,\n };\n });\n setCountries(transformedCountries);\n setSelectedCountry(defaultCountry);\n });\n }, []);\n\n // Update regions when country is updated\n useEffect(() => {\n setRegionsLoading(true);\n getRegions(selectedCountry)\n .then((regions) => {\n const transformedRegions = regions.map((region) => {\n return {\n text: region.name,\n value: region.code,\n };\n });\n setRegions(transformedRegions);\n })\n .finally(() => {\n setRegionsLoading(false);\n });\n }, [selectedCountry, setRegionsLoading]);\n\n return {\n loading: priceSummaryLoading,\n regionsLoading,\n estimatedDestinationText,\n countries,\n selectedCountry,\n selectedRegion,\n selectedZip,\n regions,\n estimatedShippingPrice,\n estimatedShippingMethod,\n shippingEstimated,\n handleEstimateShipping,\n handleCountrySelected,\n resetValues,\n setPriceSummaryLoading,\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 { EstimateShipping as EstimateShippingComponent } from '@/cart/components';\nimport { useEstimatedShipping } from '@/cart/hooks';\nimport { setEstimatedShippingLocation } from '@/cart/lib/persisted-data';\nimport { state } from '@/cart/lib/state';\nimport { Button, Input, Picker, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\n\nexport interface EstimateShippingProps extends HTMLAttributes<HTMLDivElement> {\n showDefaultEstimatedShippingCost: boolean;\n}\n\nexport const EstimateShipping: Container<EstimateShippingProps> = ({\n showDefaultEstimatedShippingCost,\n}) => {\n const [isVirtual, setIsVirtual] = useState(false);\n\n const {\n loading,\n countries,\n regions,\n selectedCountry,\n estimatedDestinationText,\n estimatedShippingPrice,\n handleCountrySelected,\n handleEstimateShipping,\n regionsLoading,\n selectedRegion,\n selectedZip,\n shippingEstimated,\n resetValues,\n } = useEstimatedShipping();\n const handleEstimations = useCallback(\n (formValues: any) => {\n handleEstimateShipping(formValues).then(() => {\n setEstimatedShippingLocation(formValues);\n });\n },\n [handleEstimateShipping]\n );\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n setIsVirtual(payload?.isVirtual || false);\n\n const shippingAddress = payload?.addresses?.shipping?.[0];\n\n if (showDefaultEstimatedShippingCost && !shippingAddress) {\n handleEstimateShipping({\n shippingCountry: state.config?.defaultCountry ?? '',\n });\n }\n if (!shippingAddress) return;\n const { countryCode, regionCode, zipCode } = shippingAddress;\n\n handleEstimations({\n shippingCountry: countryCode,\n shippingState: regionCode,\n shippingZip: zipCode,\n });\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const updatedEvent = events.on('cart/updated', () => {\n if (!shippingEstimated) return;\n handleEstimateShipping({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n updatedEvent?.off();\n };\n }, [shippingEstimated, selectedCountry, selectedRegion, selectedZip, handleEstimateShipping]);\n\n useEffect(() => {\n const resetEvent = events.on('cart/reset', () => {\n resetValues();\n setEstimatedShippingLocation(null);\n });\n\n return () => {\n resetEvent?.off();\n };\n }, [resetValues]);\n\n useEffect(() => {\n const mergeEvent = events.on('cart/merged', () => {\n if (!shippingEstimated) return;\n\n handleEstimations({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n mergeEvent?.off();\n };\n }, [\n shippingEstimated,\n selectedCountry,\n selectedRegion,\n selectedZip,\n handleEstimations,\n ]);\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.estimatedShippingForm.apply.label',\n countryField: 'Cart.PriceSummary.estimatedShippingForm.country.placeholder',\n freeShipping: 'Cart.PriceSummary.freeShipping',\n stateField: 'Cart.PriceSummary.estimatedShippingForm.state.placeholder',\n taxToBeDetermined: 'Cart.PriceSummary.taxToBeDetermined',\n zipField: 'Cart.PriceSummary.estimatedShippingForm.zip.placeholder',\n });\n\n if (isVirtual) return null;\n\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n return (\n <EstimateShippingComponent\n loading={loading}\n taxIncluded={cartTaxesConfig?.shipping === 'INCLUDING_TAX'}\n taxExcluded={cartTaxesConfig?.shipping === 'INCLUDING_EXCLUDING_TAX'}\n price={\n estimatedShippingPrice?.amount == 0 ? (\n <span data-testId=\"free-shipping\">{dictionary.freeShipping}</span>\n ) : cartTaxesConfig?.shipping === 'INCLUDING_TAX' &&\n estimatedShippingPrice ? (\n <Price\n data-testid=\"shipping\"\n {...estimatedShippingPrice.priceIncludingtax}\n />\n ) : estimatedShippingPrice ? (\n <Price {...estimatedShippingPrice} />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n estimated={true}\n priceExcludingTax={\n estimatedShippingPrice?.priceExcludingtax ? (\n <Price\n data-testid=\"shipping-excluding-tax\"\n {...estimatedShippingPrice.priceExcludingtax}\n />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n countryField={\n <Picker\n name=\"shippingCountry\"\n placeholder={dictionary.countryField}\n value={selectedCountry}\n variant=\"primary\"\n options={countries}\n handleSelect={handleCountrySelected}\n data-testid=\"estimate-shipping-country-selector\"\n />\n }\n stateField={\n regions.length > 0 ? (\n <Picker\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n options={regions}\n value={selectedRegion}\n data-testid=\"estimate-shipping-state-selector\"\n disabled={regionsLoading}\n />\n ) : (\n <Input\n aria-label={dictionary.stateField}\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n value={selectedRegion}\n disabled={regionsLoading}\n data-testid=\"estimate-shipping-state-input\"\n maxLength={50}\n />\n )\n }\n zipField={\n <Input\n aria-label={dictionary.zipField}\n name=\"shippingZip\"\n placeholder={dictionary.zipField}\n variant=\"primary\"\n data-testid=\"estimate-shipping-zip-input\"\n value={selectedZip}\n maxLength={12}\n />\n }\n estimateButton={\n <Button\n variant=\"secondary\"\n data-testid=\"estimate-shipping-apply-button\"\n aria-label={dictionary.applyButton}\n >\n {dictionary.applyButton}\n </Button>\n }\n destinationText={estimatedDestinationText || dictionary.taxToBeDetermined}\n onEstimate={handleEstimations}\n />\n );\n};\n"],"names":["useEstimatedShipping","priceSummaryLoading","setPriceSummaryLoading","useState","countries","setCountries","selectedCountry","setSelectedCountry","selectedRegion","setSelectedRegion","selectedZip","setSelectedZip","regions","setRegions","regionsLoading","setRegionsLoading","estimatedShippingPrice","setEstimatedShippingPrice","estimatedShippingMethod","setEstimatedShippingMethod","estimatedDestinationText","setEstimatedDestinationText","shippingEstimated","setShippingEstimated","resetValues","handleEstimateShipping","formValues","shippingCountry","shippingState","shippingZip","addressData","getEstimateShipping","data","handleCountrySelected","event","value","useEffect","getCountries","defaultCountry","transformedCountries","country","getRegions","transformedRegions","region","EstimateShipping","showDefaultEstimatedShippingCost","isVirtual","setIsVirtual","loading","handleEstimations","useCallback","setEstimatedShippingLocation","cartEvent","events","payload","shippingAddress","_b","_a","_c","state","countryCode","regionCode","zipCode","updatedEvent","resetEvent","mergeEvent","dictionary","useText","cartTaxesConfig","jsx","EstimateShippingComponent","Price","Picker","Input","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EstimateShipping.js","sources":["/@dropins/storefront-cart/src/hooks/useEstimatedShipping.ts","/@dropins/storefront-cart/src/containers/EstimateShipping/EstimateShipping.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 { useEffect, useState } from 'preact/compat';\n\nimport {\n EstimateAddressInput,\n getCountries,\n getEstimateShipping,\n getRegions,\n} from '@/cart/api';\nimport { PriceProps } from '@adobe-commerce/elsie/components';\n\nexport const useEstimatedShipping = () => {\n const [priceSummaryLoading, setPriceSummaryLoading] =\n useState<boolean>(false);\n\n /* State data related to estimating costs in the Price Summary component */\n const [countries, setCountries] = useState<{ text: string; value: string }[]>(\n []\n );\n const [selectedCountry, setSelectedCountry] = useState<string>('US');\n const [selectedRegion, setSelectedRegion] = useState<string>('');\n const [selectedZip, setSelectedZip] = useState<string>('');\n const [regions, setRegions] = useState<{ text: string; value: string }[]>([]);\n const [regionsLoading, setRegionsLoading] = useState<boolean>(false);\n const [estimatedShippingPrice, setEstimatedShippingPrice] = useState<\n PriceProps | null | any\n >();\n const [estimatedShippingMethod, setEstimatedShippingMethod] = useState<any>();\n const [estimatedDestinationText, setEstimatedDestinationText] =\n useState<string>('');\n const [shippingEstimated, setShippingEstimated] = useState<boolean>(false);\n\n const resetValues = () => {\n setSelectedCountry('US');\n setSelectedRegion('');\n setSelectedZip('');\n setEstimatedShippingPrice(null);\n setEstimatedShippingMethod(null);\n setEstimatedDestinationText('');\n setShippingEstimated(false);\n };\n\n const handleEstimateShipping = async (formValues: {\n shippingCountry: string;\n shippingState?: string;\n shippingZip?: string;\n }) => {\n const {\n shippingCountry,\n shippingState = '',\n shippingZip = '',\n } = formValues;\n\n const addressData: EstimateAddressInput = {\n countryCode: shippingCountry,\n postcode: shippingZip,\n region: {\n region: shippingState,\n },\n };\n\n setPriceSummaryLoading(true);\n\n return getEstimateShipping(addressData)\n .then((data) => {\n if (data) {\n setEstimatedShippingPrice({\n amount: data.amount.value,\n currency: data.amount.currency,\n priceIncludingtax: {\n amount: data.price_incl_tax.value,\n currency: data.price_incl_tax.currency,\n },\n priceExcludingtax: {\n amount: data.price_excl_tax.value,\n currency: data.price_excl_tax.currency,\n },\n });\n setEstimatedShippingMethod({\n carrier_code: data.carrier_code,\n method_code: data.method_code,\n });\n\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n\n setShippingEstimated(true);\n }\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n return data;\n })\n .finally(() => {\n setPriceSummaryLoading(false);\n });\n };\n\n const handleCountrySelected = (event: Event) => {\n event.preventDefault();\n\n setSelectedRegion('');\n setSelectedZip('');\n\n const value = (event.target as HTMLSelectElement).value;\n setSelectedCountry(value);\n };\n\n // Get list of countries on initial load\n useEffect(() => {\n getCountries().then((countries) => {\n let defaultCountry = 'US';\n const transformedCountries = countries.map((country) => {\n if (country.isDefaultCountry) {\n defaultCountry = country.id;\n }\n return {\n text: country.label,\n value: country.id,\n };\n });\n setCountries(transformedCountries);\n setSelectedCountry(defaultCountry);\n });\n }, []);\n\n // Update regions when country is updated\n useEffect(() => {\n setRegionsLoading(true);\n getRegions(selectedCountry)\n .then((regions) => {\n const transformedRegions = regions.map((region) => {\n return {\n text: region.name,\n value: region.code,\n };\n });\n setRegions(transformedRegions);\n })\n .finally(() => {\n setRegionsLoading(false);\n });\n }, [selectedCountry, setRegionsLoading]);\n\n return {\n loading: priceSummaryLoading,\n regionsLoading,\n estimatedDestinationText,\n countries,\n selectedCountry,\n selectedRegion,\n selectedZip,\n regions,\n estimatedShippingPrice,\n estimatedShippingMethod,\n shippingEstimated,\n handleEstimateShipping,\n handleCountrySelected,\n resetValues,\n setPriceSummaryLoading,\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 { EstimateShipping as EstimateShippingComponent } from '@/cart/components';\nimport { useEstimatedShipping } from '@/cart/hooks';\nimport { setEstimatedShippingLocation } from '@/cart/lib/persisted-data';\nimport { state } from '@/cart/lib/state';\nimport { Button, Input, Picker, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\n\nexport interface EstimateShippingProps extends HTMLAttributes<HTMLDivElement> {\n showDefaultEstimatedShippingCost: boolean;\n}\n\nexport const EstimateShipping: Container<EstimateShippingProps> = ({\n showDefaultEstimatedShippingCost,\n}) => {\n const [isVirtual, setIsVirtual] = useState(false);\n\n const {\n loading,\n countries,\n regions,\n selectedCountry,\n estimatedDestinationText,\n estimatedShippingPrice,\n handleCountrySelected,\n handleEstimateShipping,\n regionsLoading,\n selectedRegion,\n selectedZip,\n shippingEstimated,\n resetValues,\n } = useEstimatedShipping();\n const handleEstimations = useCallback(\n (formValues: any) => {\n handleEstimateShipping(formValues).then(() => {\n setEstimatedShippingLocation(formValues);\n });\n },\n [handleEstimateShipping]\n );\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n setIsVirtual(payload?.isVirtual || false);\n\n const shippingAddress = payload?.addresses?.shipping?.[0];\n\n if (showDefaultEstimatedShippingCost && !shippingAddress) {\n handleEstimateShipping({\n shippingCountry: state.config?.defaultCountry ?? '',\n });\n }\n if (!shippingAddress) return;\n const { countryCode, regionCode, zipCode } = shippingAddress;\n\n handleEstimations({\n shippingCountry: countryCode,\n shippingState: regionCode,\n shippingZip: zipCode,\n });\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const updatedEvent = events.on('cart/updated', () => {\n if (!shippingEstimated) return;\n handleEstimateShipping({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n updatedEvent?.off();\n };\n }, [shippingEstimated, selectedCountry, selectedRegion, selectedZip, handleEstimateShipping]);\n\n useEffect(() => {\n const resetEvent = events.on('cart/reset', () => {\n resetValues();\n setEstimatedShippingLocation(null);\n });\n\n return () => {\n resetEvent?.off();\n };\n }, [resetValues]);\n\n useEffect(() => {\n const mergeEvent = events.on('cart/merged', () => {\n if (!shippingEstimated) return;\n\n handleEstimations({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n mergeEvent?.off();\n };\n }, [\n shippingEstimated,\n selectedCountry,\n selectedRegion,\n selectedZip,\n handleEstimations,\n ]);\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.estimatedShippingForm.apply.label',\n countryField: 'Cart.PriceSummary.estimatedShippingForm.country.placeholder',\n freeShipping: 'Cart.PriceSummary.freeShipping',\n stateField: 'Cart.PriceSummary.estimatedShippingForm.state.placeholder',\n taxToBeDetermined: 'Cart.PriceSummary.taxToBeDetermined',\n zipField: 'Cart.PriceSummary.estimatedShippingForm.zip.placeholder',\n });\n\n if (isVirtual) return null;\n\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n return (\n <EstimateShippingComponent\n loading={loading}\n taxIncluded={cartTaxesConfig?.shipping === 'INCLUDING_TAX'}\n taxExcluded={cartTaxesConfig?.shipping === 'INCLUDING_EXCLUDING_TAX'}\n price={\n estimatedShippingPrice?.amount == 0 ? (\n <span data-testId=\"free-shipping\">{dictionary.freeShipping}</span>\n ) : cartTaxesConfig?.shipping === 'INCLUDING_TAX' &&\n estimatedShippingPrice ? (\n <Price\n data-testid=\"shipping\"\n {...estimatedShippingPrice.priceIncludingtax}\n />\n ) : estimatedShippingPrice ? (\n <Price {...estimatedShippingPrice} />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n estimated={true}\n priceExcludingTax={\n estimatedShippingPrice?.priceExcludingtax ? (\n <Price\n data-testid=\"shipping-excluding-tax\"\n {...estimatedShippingPrice.priceExcludingtax}\n />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n countryField={\n <Picker\n name=\"shippingCountry\"\n placeholder={dictionary.countryField}\n value={selectedCountry}\n variant=\"primary\"\n options={countries}\n handleSelect={handleCountrySelected}\n data-testid=\"estimate-shipping-country-selector\"\n />\n }\n stateField={\n regions.length > 0 ? (\n <Picker\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n options={regions}\n value={selectedRegion}\n data-testid=\"estimate-shipping-state-selector\"\n disabled={regionsLoading}\n />\n ) : (\n <Input\n aria-label={dictionary.stateField}\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n value={selectedRegion}\n disabled={regionsLoading}\n data-testid=\"estimate-shipping-state-input\"\n maxLength={50}\n />\n )\n }\n zipField={\n <Input\n aria-label={dictionary.zipField}\n name=\"shippingZip\"\n placeholder={dictionary.zipField}\n variant=\"primary\"\n data-testid=\"estimate-shipping-zip-input\"\n value={selectedZip}\n maxLength={12}\n />\n }\n estimateButton={\n <Button\n variant=\"secondary\"\n data-testid=\"estimate-shipping-apply-button\"\n aria-label={dictionary.applyButton}\n >\n {dictionary.applyButton}\n </Button>\n }\n destinationText={estimatedDestinationText || dictionary.taxToBeDetermined}\n onEstimate={handleEstimations}\n />\n );\n};\n"],"names":["useEstimatedShipping","priceSummaryLoading","setPriceSummaryLoading","useState","countries","setCountries","selectedCountry","setSelectedCountry","selectedRegion","setSelectedRegion","selectedZip","setSelectedZip","regions","setRegions","regionsLoading","setRegionsLoading","estimatedShippingPrice","setEstimatedShippingPrice","estimatedShippingMethod","setEstimatedShippingMethod","estimatedDestinationText","setEstimatedDestinationText","shippingEstimated","setShippingEstimated","resetValues","handleEstimateShipping","formValues","shippingCountry","shippingState","shippingZip","addressData","getEstimateShipping","data","handleCountrySelected","event","value","useEffect","getCountries","defaultCountry","transformedCountries","country","getRegions","transformedRegions","region","EstimateShipping","showDefaultEstimatedShippingCost","isVirtual","setIsVirtual","loading","handleEstimations","useCallback","setEstimatedShippingLocation","cartEvent","events","payload","shippingAddress","_b","_a","_c","state","countryCode","regionCode","zipCode","updatedEvent","resetEvent","mergeEvent","dictionary","useText","cartTaxesConfig","jsx","EstimateShippingComponent","Price","Picker","Input","Button"],"mappings":"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"}
|
package/containers/GiftCards.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as y,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as p,useEffect as
|
|
3
|
+
import{jsxs as y,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as p,useEffect as f}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as G,Icon as v,Button as b,Input as A}from"@dropins/tools/components.js";import{S as L,C as x,a as E}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import{removeGiftCardFromCart as P,applyGiftCardToCart as T}from"../api.js";import{events as B}from"@dropins/tools/event-bus.js";import{useText as R}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const J=({children:z,...C})=>{const[l,d]=p(new Set),[c,m]=p([]),[s,i]=p(new Set),o=R({giftCardTitle:"Cart.PriceSummary.giftCard.title",applyButton:"Cart.PriceSummary.giftCard.applyAction",placeholder:"Cart.PriceSummary.giftCard.placeholder",ariaLabel:"Cart.PriceSummary.giftCard.ariaLabel",ariaLabelRemove:"Cart.PriceSummary.giftCard.ariaLabelRemove",empty:"Cart.PriceSummary.giftCard.errors.empty"}),u=async r=>{const e=r==null?void 0:r.giftCardCode;if(e==="")return i(new Set([o.empty])),!0;const t=new Set(l);t.add(e),i(new Set),T(e).then(n=>{if(n===null)throw new Error("Error adding gift card code");d(t)}).catch(n=>{console.warn(n),i(new Set([n.message]))})},S=r=>{const e=new Set(l);e.delete(r),i(new Set),P(r).then(t=>{if(t===null)throw new Error("Error removing gift card code");d(e)}).catch(t=>{console.warn(t),i(new Set([t.message]))})};f(()=>{const r=B.on("cart/data",e=>{const t=e==null?void 0:e.appliedGiftCards;if(!t){m([]),i(new Set);return}const n=t.map(({code:w})=>w);m(n),i(new Set)},{eager:!0});return()=>{r==null||r.off()}},[]),f(()=>{d(new Set(c))},[c]);const g=c.map((r,e)=>y(G,{className:"coupon-code-form__applied-item",children:[a("span",{children:r}),a("button",{"aria-label":`${o.ariaLabelRemove} ${r}`,onClick:()=>S(r),"data-testid":`remove-giftcard-${e+1}`,children:a(v,{source:L,size:"16"})})]},r)),h=s.size>0?a("div",{"data-testid":"giftcard-code-error",children:Array.from(s)[0]}):void 0;return a(x,{...C,className:"cart-gift-cards",accordionSectionTitle:o.giftCardTitle,accordionSectionIcon:E,couponCodeField:a(A,{"aria-label":o.ariaLabel,type:"text",placeholder:o.placeholder,name:"giftCardCode",variant:"primary",value:"","data-testid":"giftcard-code-input",maxLength:50,error:s.size>0}),applyCouponsButton:a(b,{variant:"secondary",children:o.applyButton}),error:h,appliedCoupons:a("div",{children:g}),onApplyCoupon:u})};export{J as GiftCards,J as default};
|
|
4
4
|
//# sourceMappingURL=GiftCards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GiftCards.js","sources":["/@dropins/storefront-cart/src/containers/GiftCards/GiftCards.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 { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close, GiftCard } from '@adobe-commerce/elsie/icons';\nimport { applyGiftCardToCart, removeGiftCardFromCart } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface GiftCardsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const GiftCards: Container<GiftCardsProps> = ({\n children,\n ...props\n}) => {\n const [successfulGiftCardSet, setSuccessfulGiftCardSet] = useState(new Set());\n const [appliedGiftCardsArray, setAppliedGiftCardsArray] = useState<string[]>(\n []\n );\n const [giftCardError, setGiftCardError] = useState(new Set());\n\n const dictionary = useText({\n giftCardTitle: 'Cart.PriceSummary.giftCard.title',\n applyButton: 'Cart.PriceSummary.giftCard.applyAction',\n placeholder: 'Cart.PriceSummary.giftCard.placeholder',\n ariaLabel: 'Cart.PriceSummary.giftCard.ariaLabel',\n ariaLabelRemove: 'Cart.PriceSummary.giftCard.ariaLabelRemove',\n empty: 'Cart.PriceSummary.giftCard.errors.empty',\n });\n\n const handleApplyGiftCard = async (value: { giftCardCode: string }) => {\n const giftCardCode = value?.giftCardCode;\n\n if (giftCardCode === '') {\n setGiftCardError(new Set([dictionary.empty]));\n return true;\n }\n\n const newSet = new Set(successfulGiftCardSet);\n newSet.add(giftCardCode);\n setGiftCardError(new Set());\n\n applyGiftCardToCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n const handleRemoveGiftCard = (giftCardCode: string) => {\n const newSet = new Set(successfulGiftCardSet);\n newSet.delete(giftCardCode);\n setGiftCardError(new Set());\n\n removeGiftCardFromCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedGiftCards = payload?.appliedGiftCards;\n\n if (!appliedGiftCards) {\n // When appliedGiftCards returns null, no GiftCards are applied\n setAppliedGiftCardsArray([]);\n // Clear error message\n setGiftCardError(new Set());\n return;\n }\n\n const giftCardCodes = appliedGiftCards.map(({ code }) => code);\n\n setAppliedGiftCardsArray(giftCardCodes);\n // Clear error message\n setGiftCardError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulGiftCardSet(new Set(appliedGiftCardsArray));\n }, [appliedGiftCardsArray]);\n\n const appliedGiftCards = appliedGiftCardsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveGiftCard(code)}\n data-testid={`remove-giftcard-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n giftCardError.size > 0 ? (\n <div data-testid=\"giftcard-code-error\">\n {Array.from(giftCardError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n className={'cart-gift-cards'}\n accordionSectionTitle={dictionary.giftCardTitle}\n accordionSectionIcon={GiftCard}\n couponCodeField={\n <Input\n aria-label={dictionary.ariaLabel}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"giftCardCode\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"giftcard-code-input\"\n maxLength={50}\n error={giftCardError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedGiftCards}</div>}\n onApplyCoupon={handleApplyGiftCard}\n />\n );\n};\n"],"names":["GiftCards","children","props","successfulGiftCardSet","setSuccessfulGiftCardSet","useState","appliedGiftCardsArray","setAppliedGiftCardsArray","giftCardError","setGiftCardError","dictionary","useText","handleApplyGiftCard","value","giftCardCode","newSet","applyGiftCardToCart","result","error","handleRemoveGiftCard","removeGiftCardFromCart","useEffect","cartEvent","events","payload","appliedGiftCards","giftCardCodes","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","GiftCard","Input","Button"],"mappings":"
|
|
1
|
+
{"version":3,"file":"GiftCards.js","sources":["/@dropins/storefront-cart/src/containers/GiftCards/GiftCards.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 { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close, GiftCard } from '@adobe-commerce/elsie/icons';\nimport { applyGiftCardToCart, removeGiftCardFromCart } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface GiftCardsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const GiftCards: Container<GiftCardsProps> = ({\n children,\n ...props\n}) => {\n const [successfulGiftCardSet, setSuccessfulGiftCardSet] = useState(new Set());\n const [appliedGiftCardsArray, setAppliedGiftCardsArray] = useState<string[]>(\n []\n );\n const [giftCardError, setGiftCardError] = useState(new Set());\n\n const dictionary = useText({\n giftCardTitle: 'Cart.PriceSummary.giftCard.title',\n applyButton: 'Cart.PriceSummary.giftCard.applyAction',\n placeholder: 'Cart.PriceSummary.giftCard.placeholder',\n ariaLabel: 'Cart.PriceSummary.giftCard.ariaLabel',\n ariaLabelRemove: 'Cart.PriceSummary.giftCard.ariaLabelRemove',\n empty: 'Cart.PriceSummary.giftCard.errors.empty',\n });\n\n const handleApplyGiftCard = async (value: { giftCardCode: string }) => {\n const giftCardCode = value?.giftCardCode;\n\n if (giftCardCode === '') {\n setGiftCardError(new Set([dictionary.empty]));\n return true;\n }\n\n const newSet = new Set(successfulGiftCardSet);\n newSet.add(giftCardCode);\n setGiftCardError(new Set());\n\n applyGiftCardToCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n const handleRemoveGiftCard = (giftCardCode: string) => {\n const newSet = new Set(successfulGiftCardSet);\n newSet.delete(giftCardCode);\n setGiftCardError(new Set());\n\n removeGiftCardFromCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedGiftCards = payload?.appliedGiftCards;\n\n if (!appliedGiftCards) {\n // When appliedGiftCards returns null, no GiftCards are applied\n setAppliedGiftCardsArray([]);\n // Clear error message\n setGiftCardError(new Set());\n return;\n }\n\n const giftCardCodes = appliedGiftCards.map(({ code }) => code);\n\n setAppliedGiftCardsArray(giftCardCodes);\n // Clear error message\n setGiftCardError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulGiftCardSet(new Set(appliedGiftCardsArray));\n }, [appliedGiftCardsArray]);\n\n const appliedGiftCards = appliedGiftCardsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveGiftCard(code)}\n data-testid={`remove-giftcard-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n giftCardError.size > 0 ? (\n <div data-testid=\"giftcard-code-error\">\n {Array.from(giftCardError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n className={'cart-gift-cards'}\n accordionSectionTitle={dictionary.giftCardTitle}\n accordionSectionIcon={GiftCard}\n couponCodeField={\n <Input\n aria-label={dictionary.ariaLabel}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"giftCardCode\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"giftcard-code-input\"\n maxLength={50}\n error={giftCardError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedGiftCards}</div>}\n onApplyCoupon={handleApplyGiftCard}\n />\n );\n};\n"],"names":["GiftCards","children","props","successfulGiftCardSet","setSuccessfulGiftCardSet","useState","appliedGiftCardsArray","setAppliedGiftCardsArray","giftCardError","setGiftCardError","dictionary","useText","handleApplyGiftCard","value","giftCardCode","newSet","applyGiftCardToCart","result","error","handleRemoveGiftCard","removeGiftCardFromCart","useEffect","cartEvent","events","payload","appliedGiftCards","giftCardCodes","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","GiftCard","Input","Button"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as be}from"@dropins/tools/preact-jsx-runtime.js";import{Slot as Te}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";import{G as Ne}from"../chunks/components.js";import"@dropins/tools/preact-compat.js";import{useState as d,useCallback as
|
|
3
|
+
import{jsx as be}from"@dropins/tools/preact-jsx-runtime.js";import{Slot as Te}from"@dropins/tools/lib.js";import"@dropins/tools/components.js";import{G as Ne}from"../chunks/components.js";import"@dropins/tools/preact-compat.js";import{useState as d,useCallback as B,useEffect as Ge,useMemo as Z}from"@dropins/tools/preact-hooks.js";import{events as Re}from"@dropins/tools/event-bus.js";import{s as A,setGiftOptionsOnCart as me,updateProductsFromCart as ye}from"../api.js";import{useText as Be}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const x={recipientName:"",senderName:"",message:""},_e={giftReceiptIncluded:!1,printedCardIncluded:!1,isGiftWrappingSelected:!1},we=(e,f)=>{var O,a;if(!f)return!!((O=A.config)!=null&&O.allowGiftMessageOnOrder);const w=((a=A.config)==null?void 0:a.allowGiftMessageOnOrderItems)??!1;return typeof(e==null?void 0:e.giftMessageAvailable)=="boolean"?e==null?void 0:e.giftMessageAvailable:w},ke=(e,f)=>{const{allowGiftWrappingOnOrder:w,allowGiftWrappingOnOrderItems:O,allowGiftMessageOnOrder:a,allowGiftMessageOnOrderItems:W,allowGiftReceipt:p,allowPrintedCard:r}=A.config||{},c=!W&&!O&&!we(f,!0),C=!w&&!a&&!p&&!r;return!!(e==="product"&&c||e==="order"&&C)},qe=({item:e,view:f,dataSource:w,initialLoading:O,handleItemsLoading:a,handleItemsError:W,onItemUpdate:p,onGiftOptionsChange:r})=>{var U,ee,ie,se,te,re;const c=f==="product",C=Be({requiredFieldError:"Cart.GiftOptions.formText.requiredFieldError"}),[R,E]=d(()=>O),[v,H]=d({isGiftReceiptVisible:!0,isPrintedCartVisible:!0,isGiftWrappingVisible:!0,isGiftOptionsVisible:!0}),[h,D]=d(!0),[j,m]=d(!1),[S,I]=d(!1),[P,y]=d(!1),[T,V]=d(!1),[K,X]=d(!1),[$,z]=d([]),[t,_]=d(null),[Oe,J]=d(x),[n,L]=d(()=>({giftWrappingId:"",...x,..._e})),k=((U=n.recipientName)==null?void 0:U.trim())&&((ee=n.senderName)==null?void 0:ee.trim())&&((ie=n.message)==null?void 0:ie.trim()),q=!((se=n.recipientName)!=null&&se.trim())&&!((te=n.senderName)!=null&&te.trim())&&!((re=n.message)!=null&&re.trim()),g=B(async i=>{switch(m(f==="order"),I(!0),f){case"product":{"uid"in e&&(a==null||a(e.uid,!0),W==null||W(e.uid));const{recipientName:s,senderName:l,message:o,giftWrappingId:M,isGiftWrappingSelected:b}=i,F={gift_message:{to:s??"",from:l??"",message:o??""},gift_wrapping_id:b?M:null};"uid"in e&&"quantity"in e&&await ye([{uid:e.uid,quantity:e.quantity,giftOptions:F}]).then(()=>{p==null||p({item:e})}).finally(()=>{a==null||a(e.uid,!1),I(!1),y(!1),m(!1)}).catch(u=>{console.warn(u)})}break;case"order":await me(i).finally(()=>{I(!1),y(!1),m(!1)});break;default:console.error('Incorrect "view" prop value provided for GiftOptions container (storefront-cart)');break}},[W,a,e,p,f]),Q=B((i,s,l={})=>{L(o=>{const M=G=>G in o,b=G=>M(G)?o[G]:void 0;if(!(b(i)!==s||Object.keys(l).some(G=>b(G)!==l[G])))return r==null||r(o),o;const u={...o,[i]:s,...l};return!u.recipientName&&!u.senderName&&!u.message&&V(!0),(typeof s=="boolean"||["giftWrappingId","giftReceiptIncluded","printedCardIncluded"].includes(i))&&(V(!1),typeof r=="function"?r(u):g(u)),y(!0),r==null||r(u),u})},[g,r]),We=B(async()=>{S||typeof r!="function"&&(q&&T&&(J(x),V(!1),await g(n)),P&&k&&(V(!0),await g(n)))},[g,n,P,q,T,S,r,k]),Me=B(async i=>{if(S||typeof r=="function")return;const{name:s,value:l}=i.target;J(o=>({...o,[s]:l.trim()?"":C.requiredFieldError})),q&&T&&(J(x),V(!1),await g(n)),P&&k&&await g(n)},[S,q,T,P,k,C,g,n,r]),Fe=B(i=>{const s=i.target,l=s.name,o=s.type==="checkbox"?s.checked:s.value;Q(l,o)},[Q]);Ge(()=>{if(c)return;const i=Re.on(w==="cart"?"cart/data":"order/data",s=>{var M,b;_(s);const l=(M=s==null?void 0:s.items)==null?void 0:M.some(({giftWrappingAvailable:F})=>F),o=(b=s==null?void 0:s.cartGiftWrapping)==null?void 0:b.some(F=>F.selected);!l&&o&&g({...n,giftWrappingId:"",isGiftWrappingSelected:!1})},{eager:!0});return()=>{i==null||i.off()}},[_,g,w,n,c]);const Y=Z(()=>{var ce,fe,le,de,pe,ue;if(!t&&!e)return null;const i=c?(ce=e==null?void 0:e.productGiftWrapping)==null?void 0:ce.map(N=>{var ge;return{...N,price:e!=null&&e.giftWrappingPrice&&((ge=e==null?void 0:e.giftWrappingPrice)==null?void 0:ge.value)>0?e.giftWrappingPrice:N.price}}):(t==null?void 0:t.cartGiftWrapping)||[],s=i==null?void 0:i.find(N=>N.selected),l=(s==null?void 0:s.uid)??((fe=i==null?void 0:i[0])==null?void 0:fe.uid),o=!!s,M=c?e.giftMessage:t==null?void 0:t.giftMessage,b=t==null?void 0:t.printedCardIncluded,F=t==null?void 0:t.giftReceiptIncluded,u=we(e,c),G=(le=A.config)==null?void 0:le.allowGiftWrappingOnOrder,Ae=(de=A.config)==null?void 0:de.allowGiftReceipt,Ce=(pe=A.config)==null?void 0:pe.allowPrintedCard,Ie=(ue=t==null?void 0:t.items)==null?void 0:ue.some(N=>N.giftWrappingAvailable),Pe=e==null?void 0:e.giftWrappingAvailable,ne=c?!1:!!Ae,oe=c?!1:!!Ce,ae=c?!!Pe&&!!i.length:!!G&&!!i.length&&!!Ie;return H({isGiftReceiptVisible:ne,isPrintedCartVisible:oe,isGiftWrappingVisible:ae,isGiftOptionsVisible:!(!ne&&!oe&&!ae)}),D(u),{...e&&"uid"in e?{itemId:e.uid}:{},...c?{}:{printedCardIncluded:b,giftReceiptIncluded:F},...M,giftWrappingId:l,isGiftWrappingSelected:o,giftWrappingOptions:i}},[t,e,c]);Ge(()=>{if(!Y)return;const{giftWrappingOptions:i,...s}=Y;L(s),i!=null&&i.length&&z(i),E(!1)},[Y]);const Se=Z(()=>Object.entries(n).filter(([i])=>i!=="itemId"&&i!=="giftWrappingId").some(([,i])=>!!i),[n]),Ve=Z(()=>{var i;return!R&&!!((i=A)!=null&&i.config)&&ke(f,e)},[e,R,f]);return{loading:R,giftOptions:n,showModal:K,errorsField:Oe,updateLoading:j,cartData:t,fieldsDisabled:S,isGiftOptionsApplied:Se,giftWrappingConfig:$,setFieldsDisabled:I,handleFormMouseLeave:We,onInputChange:Fe,updateGiftOptions:Q,setShowModal:X,handleBlur:Me,isGiftMessageVisible:h,areGiftOptionsVisible:v,isGiftOptionsHidden:Ve}},Qe=({item:e,view:f="order",readOnlyFormOrderView:w="primary",dataSource:O="cart",isEditable:a=!0,initialLoading:W=!0,slots:p,handleItemsLoading:r,handleItemsError:c,onItemUpdate:C,onGiftOptionsChange:R})=>{const{isGiftMessageVisible:E,areGiftOptionsVisible:v,loading:H,giftOptions:h,showModal:D,errorsField:j,updateLoading:m,cartData:S,isGiftOptionsApplied:I,fieldsDisabled:P,giftWrappingConfig:y,handleFormMouseLeave:T,updateGiftOptions:V,setShowModal:K,onInputChange:X,handleBlur:$,isGiftOptionsHidden:z}=qe({item:e,view:f,dataSource:O,initialLoading:W,handleItemsLoading:r,handleItemsError:c,onItemUpdate:C,onGiftOptionsChange:R});return z?null:be(Ne,{item:e,view:f,loading:H,onBlur:$,giftOptions:h,showModal:D,isEditable:a,errorsField:j,setShowModal:K,updateLoading:m,updateGiftOptions:V,cartData:S,isGiftOptionsApplied:I,fieldsDisabled:P,giftWrappingConfig:y,handleFormMouseLeave:T,readOnlyFormOrderView:w,onInputChange:X,isGiftMessageVisible:E,areGiftOptionsVisible:v,imageSwatchImageNode:p!=null&&p.SwatchImage?({imageSwatchContext:t,..._})=>be(Te,{name:"SwatchImage",slotTag:"span",contentTag:"span",slot:p.SwatchImage,context:{item:e,imageSwatchContext:t,defaultImageProps:_}}):void 0})};export{Qe as GiftOptions,Qe as default};
|
|
4
4
|
//# sourceMappingURL=GiftOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GiftOptions.js","sources":["/@dropins/storefront-cart/src/lib/giftOptionsHelper.ts","/@dropins/storefront-cart/src/hooks/useGiftOptions.tsx","/@dropins/storefront-cart/src/containers/GiftOptions/GiftOptions.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 { CartModel, Item } from '@/cart/data/models';\nimport { state } from '@/cart/lib/state';\nimport {\n GiftWrappingConfigProps,\n GiftOptionsViewProps,\n ProductGiftOptionsConfig,\n} from '@/cart/types';\n\n// This helper is specifically designed for small functions needed in useGiftOptions for formSections configuration manipulation.\nexport const DEFAULT_FORM_STATE = {\n recipientName: '',\n senderName: '',\n message: '',\n};\n\nexport const DEFAULT_CHECKBOXES_STATE = {\n giftReceiptIncluded: false,\n printedCardIncluded: false,\n isGiftWrappingSelected: false,\n};\n\nexport const shouldShowGiftMessage = (\n item: CartModel['items'][0] | ProductGiftOptionsConfig,\n isProductView: boolean\n) => {\n if (!isProductView) return !!state.config?.allowGiftMessageOnOrder;\n\n const allowGiftMessageOnOrderItems =\n state.config?.allowGiftMessageOnOrderItems ?? false;\n\n return typeof item?.giftMessageAvailable === 'boolean'\n ? item?.giftMessageAvailable\n : allowGiftMessageOnOrderItems;\n};\n\nexport const getSelectedGiftWrapping = (\n giftWrappingOptions: GiftWrappingConfigProps[] | []\n): GiftWrappingConfigProps | undefined => {\n const fallbackGiftWrappingData = {\n uid: '',\n design: '',\n selected: false,\n image: {\n url: '',\n design: '',\n },\n price: {\n currency: 'USD',\n value: 0,\n },\n };\n\n if (!giftWrappingOptions || giftWrappingOptions.length === 0) {\n return fallbackGiftWrappingData;\n }\n\n const isNotSelected = giftWrappingOptions?.every((wrap) => !wrap.selected);\n\n if (isNotSelected) {\n return giftWrappingOptions[0];\n }\n\n return giftWrappingOptions.find((wrap) => wrap.selected);\n};\n\nexport const areGiftOptionsDisabled = (\n view: GiftOptionsViewProps,\n item: Item | ProductGiftOptionsConfig\n) => {\n const {\n allowGiftWrappingOnOrder,\n allowGiftWrappingOnOrderItems,\n allowGiftMessageOnOrder,\n allowGiftMessageOnOrderItems,\n allowGiftReceipt,\n allowPrintedCard,\n } = state.config || {};\n\n const isGiftOptionsOnProductDisabled =\n !allowGiftMessageOnOrderItems &&\n !allowGiftWrappingOnOrderItems &&\n !shouldShowGiftMessage(item, true);\n\n const isGiftOptionsOnOrderDisabled =\n !allowGiftWrappingOnOrder &&\n !allowGiftMessageOnOrder &&\n !allowGiftReceipt &&\n !allowPrintedCard;\n\n if (view === 'product' && isGiftOptionsOnProductDisabled) {\n return true;\n }\n\n if (view === 'order' && isGiftOptionsOnOrderDisabled) {\n return true;\n }\n\n return false;\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 { useCallback, useEffect, useState, useMemo } from 'preact/hooks';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CartModel, Item } from '@/cart/data/models';\nimport { setGiftOptionsOnCart, updateProductsFromCart } from '@/cart/api';\nimport {\n DEFAULT_FORM_STATE,\n DEFAULT_CHECKBOXES_STATE,\n shouldShowGiftMessage,\n areGiftOptionsDisabled,\n} from '@/cart/lib/giftOptionsHelper';\nimport {\n GiftOptionsDataSourcesProps,\n GiftOptionsViewProps,\n GiftWrappingConfigProps,\n GiftFormDataType,\n ProductGiftOptionsConfig,\n} from '@/cart/types';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { state } from '@/cart/lib/state';\n\nexport interface UseGiftOptionsProps {\n item: Item | ProductGiftOptionsConfig;\n view: GiftOptionsViewProps;\n dataSource: GiftOptionsDataSourcesProps;\n initialLoading: boolean;\n handleItemsLoading?: (uid: string, state: boolean) => void;\n handleItemsError?: (uid: string, message?: string) => void;\n onItemUpdate?: ({ item }: { item: Item }) => void;\n onGiftOptionsChange?: (data: GiftFormDataType) => void;\n}\n\nexport const useGiftOptions = ({\n item,\n view,\n dataSource,\n initialLoading,\n handleItemsLoading,\n handleItemsError,\n onItemUpdate,\n onGiftOptionsChange,\n}: UseGiftOptionsProps) => {\n const isProductView = view === 'product';\n\n const dictionary = useText({\n requiredFieldError: 'Cart.GiftOptions.formText.requiredFieldError',\n });\n\n const [loading, setLoading] = useState(() => initialLoading);\n const [areGiftOptionsVisible, setAreGiftOptionsVisible] = useState({\n isGiftReceiptVisible: true,\n isPrintedCartVisible: true,\n isGiftWrappingVisible: true,\n isGiftOptionsVisible: true,\n });\n const [isGiftMessageVisible, setIsGiftMessageVisible] = useState(true);\n const [updateLoading, setUpdateLoading] = useState(false);\n const [fieldsDisabled, setFieldsDisabled] = useState(false);\n const [isDataChanged, setIsDataChanged] = useState(false);\n const [isFormTouched, setIsFormTouched] = useState(false);\n const [showModal, setShowModal] = useState<boolean>(false);\n const [giftWrappingConfig, setGiftWrappingConfig] = useState<\n GiftWrappingConfigProps[] | []\n >([]);\n const [cartData, setCartData] = useState<CartModel | null>(null);\n const [errorsField, setErrorsField] =\n useState<typeof DEFAULT_FORM_STATE>(DEFAULT_FORM_STATE);\n const [giftOptions, setGiftOptions] = useState<GiftFormDataType>(() => ({\n giftWrappingId: '',\n ...DEFAULT_FORM_STATE,\n ...DEFAULT_CHECKBOXES_STATE,\n }));\n\n const isFormFilled =\n giftOptions.recipientName?.trim() &&\n giftOptions.senderName?.trim() &&\n giftOptions.message?.trim();\n\n const isFormEmpty =\n !giftOptions.recipientName?.trim() &&\n !giftOptions.senderName?.trim() &&\n !giftOptions.message?.trim();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const applyGiftOptionsToCart = useCallback(\n async (updatedGiftOptions: GiftFormDataType) => {\n // Update loading state used to render loading indicator required only in order view\n setUpdateLoading(view === 'order');\n setFieldsDisabled(true);\n\n switch (view) {\n case 'product':\n {\n if ('uid' in item) {\n handleItemsLoading?.(item.uid, true);\n handleItemsError?.(item.uid);\n }\n\n const {\n recipientName,\n senderName,\n message,\n giftWrappingId,\n isGiftWrappingSelected,\n } = updatedGiftOptions;\n\n const giftOptions = {\n gift_message: {\n to: recipientName ?? '',\n from: senderName ?? '',\n message: message ?? '',\n },\n gift_wrapping_id: isGiftWrappingSelected ? giftWrappingId : null,\n };\n\n if ('uid' in item && 'quantity' in item) {\n await updateProductsFromCart([\n {\n uid: item.uid,\n quantity: item.quantity,\n giftOptions,\n },\n ])\n .then(() => {\n onItemUpdate?.({ item });\n })\n .finally(() => {\n handleItemsLoading?.(item.uid, false);\n setFieldsDisabled(false);\n setIsDataChanged(false);\n setUpdateLoading(false);\n })\n .catch((error: any) => {\n console.warn(error);\n });\n }\n }\n break;\n case 'order':\n await setGiftOptionsOnCart(updatedGiftOptions).finally(() => {\n setFieldsDisabled(false);\n setIsDataChanged(false);\n setUpdateLoading(false);\n });\n break;\n default:\n console.error(\n 'Incorrect \"view\" prop value provided for GiftOptions container (storefront-cart)'\n );\n break;\n }\n },\n [handleItemsError, handleItemsLoading, item, onItemUpdate, view]\n );\n\n const updateGiftOptions = useCallback(\n (\n name: string,\n value: string | boolean | number | undefined,\n extraGiftOptions: Record<string, string | boolean | number> = {}\n ) => {\n setGiftOptions((prevGiftOptions: GiftFormDataType) => {\n const isValidGiftFormKey = (\n key: string\n ): key is keyof GiftFormDataType => key in prevGiftOptions;\n\n const getPrevValue = (key: string) =>\n isValidGiftFormKey(key) ? prevGiftOptions[key] : undefined;\n\n const hasChanged =\n getPrevValue(name) !== value ||\n Object.keys(extraGiftOptions).some(\n (key) => getPrevValue(key) !== extraGiftOptions[key]\n );\n\n if (!hasChanged) {\n onGiftOptionsChange?.(prevGiftOptions);\n return prevGiftOptions;\n }\n\n const updatedGiftOptions = {\n ...prevGiftOptions,\n [name]: value,\n ...extraGiftOptions,\n };\n\n if (\n !updatedGiftOptions.recipientName &&\n !updatedGiftOptions.senderName &&\n !updatedGiftOptions.message\n ) {\n setIsFormTouched(true);\n }\n\n if (\n typeof value === 'boolean' ||\n [\n 'giftWrappingId',\n 'giftReceiptIncluded',\n 'printedCardIncluded',\n ].includes(name)\n ) {\n setIsFormTouched(false);\n typeof onGiftOptionsChange === 'function'\n ? onGiftOptionsChange(updatedGiftOptions)\n : applyGiftOptionsToCart(updatedGiftOptions);\n }\n\n setIsDataChanged(true);\n\n onGiftOptionsChange?.(updatedGiftOptions);\n return updatedGiftOptions;\n });\n },\n [applyGiftOptionsToCart, onGiftOptionsChange]\n );\n\n const handleFormMouseLeave = useCallback(\n async () => {\n // Fields disabled if other event handler already triggered\n if (fieldsDisabled) return;\n if (typeof onGiftOptionsChange === 'function') return;\n\n // Case when user removed all form fields - reset to initial state\n if (isFormEmpty && isFormTouched) {\n setErrorsField(DEFAULT_FORM_STATE);\n setIsFormTouched(false);\n await applyGiftOptionsToCart(giftOptions);\n }\n\n // Case when user edited one of form fields\n if (isDataChanged && isFormFilled) {\n setIsFormTouched(true);\n await applyGiftOptionsToCart(giftOptions);\n }\n },\n [\n applyGiftOptionsToCart,\n giftOptions,\n isDataChanged,\n isFormEmpty,\n isFormTouched,\n fieldsDisabled,\n onGiftOptionsChange,\n isFormFilled\n ]\n );\n\n const handleBlur = useCallback(\n async (event: Event) => {\n // Fields disabled if other event handler already triggered\n if (fieldsDisabled) return;\n if (typeof onGiftOptionsChange === 'function') return;\n\n const { name, value } = event.target as HTMLInputElement;\n\n setErrorsField((prevErrors: typeof DEFAULT_FORM_STATE) => ({\n ...prevErrors,\n [name]: value.trim() ? '' : dictionary.requiredFieldError,\n }));\n\n // Case when user removed all form fields - reset to initial state\n if (isFormEmpty && isFormTouched) {\n setErrorsField(DEFAULT_FORM_STATE);\n setIsFormTouched(false);\n await applyGiftOptionsToCart(giftOptions);\n }\n\n if (isDataChanged && isFormFilled) {\n await applyGiftOptionsToCart(giftOptions);\n }\n },\n [\n fieldsDisabled,\n isFormEmpty,\n isFormTouched,\n isDataChanged,\n isFormFilled,\n dictionary,\n applyGiftOptionsToCart,\n giftOptions,\n onGiftOptionsChange,\n ]\n );\n\n const onInputChange = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const name = target.name;\n const value = target.type === 'checkbox' ? target.checked : target.value;\n\n updateGiftOptions(name, value);\n },\n [updateGiftOptions]\n );\n\n useEffect(() => {\n if (isProductView) return;\n\n const dataEvent = events.on(\n // @ts-ignore\n dataSource === 'cart' ? 'cart/data' : 'order/data',\n (payload: CartModel) => {\n setCartData(payload);\n // Gift wrapping is allowed for the cart if at least one item has gift wrapping available\n const isCartGiftWrappingAllowed = payload?.items?.some(\n ({ giftWrappingAvailable }: { giftWrappingAvailable: boolean }) =>\n giftWrappingAvailable\n );\n const isCartGiftWrappingApplied = payload?.cartGiftWrapping?.some(\n (wrap: GiftWrappingConfigProps) => wrap.selected\n );\n\n // If gift wrapping is not allowed and it is applied, remove it\n if (!isCartGiftWrappingAllowed && isCartGiftWrappingApplied) {\n applyGiftOptionsToCart({\n ...giftOptions,\n giftWrappingId: '',\n isGiftWrappingSelected: false,\n });\n }\n },\n { eager: true }\n );\n return () => {\n dataEvent?.off();\n };\n }, [setCartData, applyGiftOptionsToCart, dataSource, giftOptions, isProductView]);\n\n const giftOptionsState: GiftFormDataType | null = useMemo(() => {\n if (!cartData && !item) return null;\n\n const giftWrappingOptions: GiftWrappingConfigProps[] = isProductView\n ? item?.productGiftWrapping?.map(\n (wrap: GiftWrappingConfigProps): GiftWrappingConfigProps => ({\n ...wrap,\n price:\n item?.giftWrappingPrice && item?.giftWrappingPrice?.value > 0\n ? item.giftWrappingPrice\n : wrap.price,\n })\n )\n : cartData?.cartGiftWrapping || [];\n\n const selectedWrap = giftWrappingOptions?.find((wrap) => wrap.selected);\n const selectedGiftWrappingId =\n selectedWrap?.uid ?? giftWrappingOptions?.[0]?.uid;\n\n const isGiftWrappingSelected = !!selectedWrap;\n\n const giftMessageConfig = isProductView\n ? item.giftMessage\n : cartData?.giftMessage;\n const printedCardIncluded = cartData?.printedCardIncluded;\n const giftReceiptIncluded = cartData?.giftReceiptIncluded;\n\n const giftMessageAvailable = shouldShowGiftMessage(item, isProductView);\n\n const allowGiftWrappingOnOrder = state.config?.allowGiftWrappingOnOrder;\n const allowGiftReceipt = state.config?.allowGiftReceipt;\n const allowPrintedCard = state.config?.allowPrintedCard;\n const isGiftWrappingAvailableForSome = cartData?.items?.some(\n (item: { giftWrappingAvailable: boolean }) => item.giftWrappingAvailable\n );\n const allowGiftWrappingOnProduct = item?.giftWrappingAvailable;\n const isGiftReceiptVisible = isProductView ? false : !!allowGiftReceipt;\n const isPrintedCartVisible = isProductView ? false : !!allowPrintedCard;\n const isGiftWrappingVisible = isProductView\n ? !!allowGiftWrappingOnProduct && !!giftWrappingOptions.length\n : !!allowGiftWrappingOnOrder &&\n !!giftWrappingOptions.length &&\n !!isGiftWrappingAvailableForSome;\n const checkBoxesIsHidden =\n !isGiftReceiptVisible && !isPrintedCartVisible && !isGiftWrappingVisible;\n\n setAreGiftOptionsVisible({\n isGiftReceiptVisible,\n isPrintedCartVisible,\n isGiftWrappingVisible,\n isGiftOptionsVisible: !checkBoxesIsHidden,\n });\n setIsGiftMessageVisible(giftMessageAvailable);\n\n return {\n ...(item && 'uid' in item ? { itemId: item.uid } : {}),\n ...(!isProductView\n ? {\n printedCardIncluded,\n giftReceiptIncluded,\n }\n : {}),\n ...giftMessageConfig,\n giftWrappingId: selectedGiftWrappingId,\n isGiftWrappingSelected,\n giftWrappingOptions,\n };\n }, [cartData, item, isProductView]);\n\n useEffect(() => {\n if (!giftOptionsState) return;\n\n const { giftWrappingOptions, ...giftOptionsFetchData } = giftOptionsState;\n\n setGiftOptions(giftOptionsFetchData);\n\n if (giftWrappingOptions?.length) {\n setGiftWrappingConfig(giftWrappingOptions);\n }\n\n setLoading(false);\n }, [giftOptionsState]);\n\n const isGiftOptionsApplied = useMemo(() => {\n return Object.entries(giftOptions)\n .filter(([key]) => key !== 'itemId' && key !== 'giftWrappingId')\n .some(([, value]) => Boolean(value));\n }, [giftOptions]);\n\n const isGiftOptionsHidden = useMemo(() => {\n return !loading && !!state?.config && areGiftOptionsDisabled(view, item);\n }, [item, loading, view]);\n\n return {\n loading,\n giftOptions,\n showModal,\n errorsField,\n updateLoading,\n cartData,\n fieldsDisabled,\n isGiftOptionsApplied,\n giftWrappingConfig,\n setFieldsDisabled,\n handleFormMouseLeave,\n onInputChange,\n updateGiftOptions,\n setShowModal,\n handleBlur,\n isGiftMessageVisible,\n areGiftOptionsVisible,\n isGiftOptionsHidden,\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 { GiftOptions as GiftOptionsComponent } from '@/cart/components';\nimport { Item } from '@/cart/data/models';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useGiftOptions } from '@/cart/hooks/useGiftOptions';\nimport {\n GiftOptionsViewProps,\n GiftOptionsDataSourcesProps,\n GiftFormDataType,\n ProductGiftOptionsConfig,\n GiftOptionsReadOnlyViewProps,\n} from '@/cart/types';\nimport { ImageNodeRenderProps, ImageProps } from '@adobe-commerce/elsie/components';\n\nexport interface GiftOptionsProps {\n item: Item | ProductGiftOptionsConfig;\n view?: GiftOptionsViewProps;\n readOnlyFormOrderView: GiftOptionsReadOnlyViewProps;\n dataSource?: GiftOptionsDataSourcesProps;\n isEditable?: boolean;\n initialLoading?: boolean;\n handleItemsLoading?: (uid: string, state: boolean) => void;\n handleItemsError?: (uid: string, message?: string) => void;\n onItemUpdate?: ({ item }: { item: Item }) => void;\n onGiftOptionsChange?: (data: GiftFormDataType) => void;\n slots?: {\n SwatchImage?: SlotProps<{ \n item: Item | ProductGiftOptionsConfig\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext']\n defaultImageProps: ImageProps\n }>;\n };\n}\n\nexport const GiftOptions: Container<GiftOptionsProps> = ({\n item,\n view = 'order',\n readOnlyFormOrderView = 'primary',\n dataSource = 'cart',\n isEditable = true,\n initialLoading = true,\n slots,\n handleItemsLoading,\n handleItemsError,\n onItemUpdate,\n onGiftOptionsChange,\n}: GiftOptionsProps) => {\n const {\n isGiftMessageVisible,\n areGiftOptionsVisible,\n loading,\n giftOptions,\n showModal,\n errorsField,\n updateLoading,\n cartData,\n isGiftOptionsApplied,\n fieldsDisabled,\n giftWrappingConfig,\n handleFormMouseLeave,\n updateGiftOptions,\n setShowModal,\n onInputChange,\n handleBlur,\n isGiftOptionsHidden,\n } = useGiftOptions({\n item,\n view,\n dataSource,\n initialLoading,\n handleItemsLoading,\n handleItemsError,\n onItemUpdate,\n onGiftOptionsChange,\n });\n\n if (isGiftOptionsHidden) {\n return null;\n }\n\n return (\n <GiftOptionsComponent\n item={item}\n view={view}\n loading={loading}\n onBlur={handleBlur}\n giftOptions={giftOptions}\n showModal={showModal}\n isEditable={isEditable}\n errorsField={errorsField}\n setShowModal={setShowModal}\n updateLoading={updateLoading}\n updateGiftOptions={updateGiftOptions}\n cartData={cartData}\n isGiftOptionsApplied={isGiftOptionsApplied}\n fieldsDisabled={fieldsDisabled}\n giftWrappingConfig={giftWrappingConfig}\n handleFormMouseLeave={handleFormMouseLeave}\n readOnlyFormOrderView={readOnlyFormOrderView}\n onInputChange={onInputChange}\n isGiftMessageVisible={isGiftMessageVisible}\n areGiftOptionsVisible={areGiftOptionsVisible}\n imageSwatchImageNode={\n slots?.SwatchImage ? ({ imageSwatchContext, ...defaultImageProps }) => (\n // No need to provide default content, as the slot will only be rendered if it's actually provided.\n <Slot \n name=\"SwatchImage\"\n slotTag='span'\n contentTag='span'\n slot={slots.SwatchImage} \n context={{ item, imageSwatchContext, defaultImageProps }} \n />\n ) : undefined\n }\n />\n );\n};\n"],"names":["DEFAULT_FORM_STATE","DEFAULT_CHECKBOXES_STATE","shouldShowGiftMessage","item","isProductView","_a","state","allowGiftMessageOnOrderItems","_b","areGiftOptionsDisabled","view","allowGiftWrappingOnOrder","allowGiftWrappingOnOrderItems","allowGiftMessageOnOrder","allowGiftReceipt","allowPrintedCard","isGiftOptionsOnProductDisabled","isGiftOptionsOnOrderDisabled","useGiftOptions","dataSource","initialLoading","handleItemsLoading","handleItemsError","onItemUpdate","onGiftOptionsChange","dictionary","useText","loading","setLoading","useState","areGiftOptionsVisible","setAreGiftOptionsVisible","isGiftMessageVisible","setIsGiftMessageVisible","updateLoading","setUpdateLoading","fieldsDisabled","setFieldsDisabled","isDataChanged","setIsDataChanged","isFormTouched","setIsFormTouched","showModal","setShowModal","giftWrappingConfig","setGiftWrappingConfig","cartData","setCartData","errorsField","setErrorsField","giftOptions","setGiftOptions","isFormFilled","_c","isFormEmpty","_d","_e","_f","applyGiftOptionsToCart","useCallback","updatedGiftOptions","recipientName","senderName","message","giftWrappingId","isGiftWrappingSelected","updateProductsFromCart","error","setGiftOptionsOnCart","updateGiftOptions","name","value","extraGiftOptions","prevGiftOptions","isValidGiftFormKey","key","getPrevValue","handleFormMouseLeave","handleBlur","event","prevErrors","onInputChange","target","useEffect","dataEvent","events","payload","isCartGiftWrappingAllowed","giftWrappingAvailable","isCartGiftWrappingApplied","wrap","giftOptionsState","useMemo","giftWrappingOptions","selectedWrap","selectedGiftWrappingId","giftMessageConfig","printedCardIncluded","giftReceiptIncluded","giftMessageAvailable","isGiftWrappingAvailableForSome","allowGiftWrappingOnProduct","isGiftReceiptVisible","isPrintedCartVisible","isGiftWrappingVisible","giftOptionsFetchData","isGiftOptionsApplied","isGiftOptionsHidden","GiftOptions","readOnlyFormOrderView","isEditable","slots","jsx","GiftOptionsComponent","imageSwatchContext","defaultImageProps","Slot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GiftOptions.js","sources":["/@dropins/storefront-cart/src/lib/giftOptionsHelper.ts","/@dropins/storefront-cart/src/hooks/useGiftOptions.tsx","/@dropins/storefront-cart/src/containers/GiftOptions/GiftOptions.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 { CartModel, Item } from '@/cart/data/models';\nimport { state } from '@/cart/lib/state';\nimport {\n GiftWrappingConfigProps,\n GiftOptionsViewProps,\n ProductGiftOptionsConfig,\n} from '@/cart/types';\n\n// This helper is specifically designed for small functions needed in useGiftOptions for formSections configuration manipulation.\nexport const DEFAULT_FORM_STATE = {\n recipientName: '',\n senderName: '',\n message: '',\n};\n\nexport const DEFAULT_CHECKBOXES_STATE = {\n giftReceiptIncluded: false,\n printedCardIncluded: false,\n isGiftWrappingSelected: false,\n};\n\nexport const shouldShowGiftMessage = (\n item: CartModel['items'][0] | ProductGiftOptionsConfig,\n isProductView: boolean\n) => {\n if (!isProductView) return !!state.config?.allowGiftMessageOnOrder;\n\n const allowGiftMessageOnOrderItems =\n state.config?.allowGiftMessageOnOrderItems ?? false;\n\n return typeof item?.giftMessageAvailable === 'boolean'\n ? item?.giftMessageAvailable\n : allowGiftMessageOnOrderItems;\n};\n\nexport const getSelectedGiftWrapping = (\n giftWrappingOptions: GiftWrappingConfigProps[] | []\n): GiftWrappingConfigProps | undefined => {\n const fallbackGiftWrappingData = {\n uid: '',\n design: '',\n selected: false,\n image: {\n url: '',\n design: '',\n },\n price: {\n currency: 'USD',\n value: 0,\n },\n };\n\n if (!giftWrappingOptions || giftWrappingOptions.length === 0) {\n return fallbackGiftWrappingData;\n }\n\n const isNotSelected = giftWrappingOptions?.every((wrap) => !wrap.selected);\n\n if (isNotSelected) {\n return giftWrappingOptions[0];\n }\n\n return giftWrappingOptions.find((wrap) => wrap.selected);\n};\n\nexport const areGiftOptionsDisabled = (\n view: GiftOptionsViewProps,\n item: Item | ProductGiftOptionsConfig\n) => {\n const {\n allowGiftWrappingOnOrder,\n allowGiftWrappingOnOrderItems,\n allowGiftMessageOnOrder,\n allowGiftMessageOnOrderItems,\n allowGiftReceipt,\n allowPrintedCard,\n } = state.config || {};\n\n const isGiftOptionsOnProductDisabled =\n !allowGiftMessageOnOrderItems &&\n !allowGiftWrappingOnOrderItems &&\n !shouldShowGiftMessage(item, true);\n\n const isGiftOptionsOnOrderDisabled =\n !allowGiftWrappingOnOrder &&\n !allowGiftMessageOnOrder &&\n !allowGiftReceipt &&\n !allowPrintedCard;\n\n if (view === 'product' && isGiftOptionsOnProductDisabled) {\n return true;\n }\n\n if (view === 'order' && isGiftOptionsOnOrderDisabled) {\n return true;\n }\n\n return false;\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 { useCallback, useEffect, useState, useMemo } from 'preact/hooks';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CartModel, Item } from '@/cart/data/models';\nimport { setGiftOptionsOnCart, updateProductsFromCart } from '@/cart/api';\nimport {\n DEFAULT_FORM_STATE,\n DEFAULT_CHECKBOXES_STATE,\n shouldShowGiftMessage,\n areGiftOptionsDisabled,\n} from '@/cart/lib/giftOptionsHelper';\nimport {\n GiftOptionsDataSourcesProps,\n GiftOptionsViewProps,\n GiftWrappingConfigProps,\n GiftFormDataType,\n ProductGiftOptionsConfig,\n} from '@/cart/types';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { state } from '@/cart/lib/state';\n\nexport interface UseGiftOptionsProps {\n item: Item | ProductGiftOptionsConfig;\n view: GiftOptionsViewProps;\n dataSource: GiftOptionsDataSourcesProps;\n initialLoading: boolean;\n handleItemsLoading?: (uid: string, state: boolean) => void;\n handleItemsError?: (uid: string, message?: string) => void;\n onItemUpdate?: ({ item }: { item: Item }) => void;\n onGiftOptionsChange?: (data: GiftFormDataType) => void;\n}\n\nexport const useGiftOptions = ({\n item,\n view,\n dataSource,\n initialLoading,\n handleItemsLoading,\n handleItemsError,\n onItemUpdate,\n onGiftOptionsChange,\n}: UseGiftOptionsProps) => {\n const isProductView = view === 'product';\n\n const dictionary = useText({\n requiredFieldError: 'Cart.GiftOptions.formText.requiredFieldError',\n });\n\n const [loading, setLoading] = useState(() => initialLoading);\n const [areGiftOptionsVisible, setAreGiftOptionsVisible] = useState({\n isGiftReceiptVisible: true,\n isPrintedCartVisible: true,\n isGiftWrappingVisible: true,\n isGiftOptionsVisible: true,\n });\n const [isGiftMessageVisible, setIsGiftMessageVisible] = useState(true);\n const [updateLoading, setUpdateLoading] = useState(false);\n const [fieldsDisabled, setFieldsDisabled] = useState(false);\n const [isDataChanged, setIsDataChanged] = useState(false);\n const [isFormTouched, setIsFormTouched] = useState(false);\n const [showModal, setShowModal] = useState<boolean>(false);\n const [giftWrappingConfig, setGiftWrappingConfig] = useState<\n GiftWrappingConfigProps[] | []\n >([]);\n const [cartData, setCartData] = useState<CartModel | null>(null);\n const [errorsField, setErrorsField] =\n useState<typeof DEFAULT_FORM_STATE>(DEFAULT_FORM_STATE);\n const [giftOptions, setGiftOptions] = useState<GiftFormDataType>(() => ({\n giftWrappingId: '',\n ...DEFAULT_FORM_STATE,\n ...DEFAULT_CHECKBOXES_STATE,\n }));\n\n const isFormFilled =\n giftOptions.recipientName?.trim() &&\n giftOptions.senderName?.trim() &&\n giftOptions.message?.trim();\n\n const isFormEmpty =\n !giftOptions.recipientName?.trim() &&\n !giftOptions.senderName?.trim() &&\n !giftOptions.message?.trim();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const applyGiftOptionsToCart = useCallback(\n async (updatedGiftOptions: GiftFormDataType) => {\n // Update loading state used to render loading indicator required only in order view\n setUpdateLoading(view === 'order');\n setFieldsDisabled(true);\n\n switch (view) {\n case 'product':\n {\n if ('uid' in item) {\n handleItemsLoading?.(item.uid, true);\n handleItemsError?.(item.uid);\n }\n\n const {\n recipientName,\n senderName,\n message,\n giftWrappingId,\n isGiftWrappingSelected,\n } = updatedGiftOptions;\n\n const giftOptions = {\n gift_message: {\n to: recipientName ?? '',\n from: senderName ?? '',\n message: message ?? '',\n },\n gift_wrapping_id: isGiftWrappingSelected ? giftWrappingId : null,\n };\n\n if ('uid' in item && 'quantity' in item) {\n await updateProductsFromCart([\n {\n uid: item.uid,\n quantity: item.quantity,\n giftOptions,\n },\n ])\n .then(() => {\n onItemUpdate?.({ item });\n })\n .finally(() => {\n handleItemsLoading?.(item.uid, false);\n setFieldsDisabled(false);\n setIsDataChanged(false);\n setUpdateLoading(false);\n })\n .catch((error: any) => {\n console.warn(error);\n });\n }\n }\n break;\n case 'order':\n await setGiftOptionsOnCart(updatedGiftOptions).finally(() => {\n setFieldsDisabled(false);\n setIsDataChanged(false);\n setUpdateLoading(false);\n });\n break;\n default:\n console.error(\n 'Incorrect \"view\" prop value provided for GiftOptions container (storefront-cart)'\n );\n break;\n }\n },\n [handleItemsError, handleItemsLoading, item, onItemUpdate, view]\n );\n\n const updateGiftOptions = useCallback(\n (\n name: string,\n value: string | boolean | number | undefined,\n extraGiftOptions: Record<string, string | boolean | number> = {}\n ) => {\n setGiftOptions((prevGiftOptions: GiftFormDataType) => {\n const isValidGiftFormKey = (\n key: string\n ): key is keyof GiftFormDataType => key in prevGiftOptions;\n\n const getPrevValue = (key: string) =>\n isValidGiftFormKey(key) ? prevGiftOptions[key] : undefined;\n\n const hasChanged =\n getPrevValue(name) !== value ||\n Object.keys(extraGiftOptions).some(\n (key) => getPrevValue(key) !== extraGiftOptions[key]\n );\n\n if (!hasChanged) {\n onGiftOptionsChange?.(prevGiftOptions);\n return prevGiftOptions;\n }\n\n const updatedGiftOptions = {\n ...prevGiftOptions,\n [name]: value,\n ...extraGiftOptions,\n };\n\n if (\n !updatedGiftOptions.recipientName &&\n !updatedGiftOptions.senderName &&\n !updatedGiftOptions.message\n ) {\n setIsFormTouched(true);\n }\n\n if (\n typeof value === 'boolean' ||\n [\n 'giftWrappingId',\n 'giftReceiptIncluded',\n 'printedCardIncluded',\n ].includes(name)\n ) {\n setIsFormTouched(false);\n typeof onGiftOptionsChange === 'function'\n ? onGiftOptionsChange(updatedGiftOptions)\n : applyGiftOptionsToCart(updatedGiftOptions);\n }\n\n setIsDataChanged(true);\n\n onGiftOptionsChange?.(updatedGiftOptions);\n return updatedGiftOptions;\n });\n },\n [applyGiftOptionsToCart, onGiftOptionsChange]\n );\n\n const handleFormMouseLeave = useCallback(\n async () => {\n // Fields disabled if other event handler already triggered\n if (fieldsDisabled) return;\n if (typeof onGiftOptionsChange === 'function') return;\n\n // Case when user removed all form fields - reset to initial state\n if (isFormEmpty && isFormTouched) {\n setErrorsField(DEFAULT_FORM_STATE);\n setIsFormTouched(false);\n await applyGiftOptionsToCart(giftOptions);\n }\n\n // Case when user edited one of form fields\n if (isDataChanged && isFormFilled) {\n setIsFormTouched(true);\n await applyGiftOptionsToCart(giftOptions);\n }\n },\n [\n applyGiftOptionsToCart,\n giftOptions,\n isDataChanged,\n isFormEmpty,\n isFormTouched,\n fieldsDisabled,\n onGiftOptionsChange,\n isFormFilled\n ]\n );\n\n const handleBlur = useCallback(\n async (event: Event) => {\n // Fields disabled if other event handler already triggered\n if (fieldsDisabled) return;\n if (typeof onGiftOptionsChange === 'function') return;\n\n const { name, value } = event.target as HTMLInputElement;\n\n setErrorsField((prevErrors: typeof DEFAULT_FORM_STATE) => ({\n ...prevErrors,\n [name]: value.trim() ? '' : dictionary.requiredFieldError,\n }));\n\n // Case when user removed all form fields - reset to initial state\n if (isFormEmpty && isFormTouched) {\n setErrorsField(DEFAULT_FORM_STATE);\n setIsFormTouched(false);\n await applyGiftOptionsToCart(giftOptions);\n }\n\n if (isDataChanged && isFormFilled) {\n await applyGiftOptionsToCart(giftOptions);\n }\n },\n [\n fieldsDisabled,\n isFormEmpty,\n isFormTouched,\n isDataChanged,\n isFormFilled,\n dictionary,\n applyGiftOptionsToCart,\n giftOptions,\n onGiftOptionsChange,\n ]\n );\n\n const onInputChange = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const name = target.name;\n const value = target.type === 'checkbox' ? target.checked : target.value;\n\n updateGiftOptions(name, value);\n },\n [updateGiftOptions]\n );\n\n useEffect(() => {\n if (isProductView) return;\n\n const dataEvent = events.on(\n // @ts-ignore\n dataSource === 'cart' ? 'cart/data' : 'order/data',\n (payload: CartModel) => {\n setCartData(payload);\n // Gift wrapping is allowed for the cart if at least one item has gift wrapping available\n const isCartGiftWrappingAllowed = payload?.items?.some(\n ({ giftWrappingAvailable }: { giftWrappingAvailable: boolean }) =>\n giftWrappingAvailable\n );\n const isCartGiftWrappingApplied = payload?.cartGiftWrapping?.some(\n (wrap: GiftWrappingConfigProps) => wrap.selected\n );\n\n // If gift wrapping is not allowed and it is applied, remove it\n if (!isCartGiftWrappingAllowed && isCartGiftWrappingApplied) {\n applyGiftOptionsToCart({\n ...giftOptions,\n giftWrappingId: '',\n isGiftWrappingSelected: false,\n });\n }\n },\n { eager: true }\n );\n return () => {\n dataEvent?.off();\n };\n }, [setCartData, applyGiftOptionsToCart, dataSource, giftOptions, isProductView]);\n\n const giftOptionsState: GiftFormDataType | null = useMemo(() => {\n if (!cartData && !item) return null;\n\n const giftWrappingOptions: GiftWrappingConfigProps[] = isProductView\n ? item?.productGiftWrapping?.map(\n (wrap: GiftWrappingConfigProps): GiftWrappingConfigProps => ({\n ...wrap,\n price:\n item?.giftWrappingPrice && item?.giftWrappingPrice?.value > 0\n ? item.giftWrappingPrice\n : wrap.price,\n })\n )\n : cartData?.cartGiftWrapping || [];\n\n const selectedWrap = giftWrappingOptions?.find((wrap) => wrap.selected);\n const selectedGiftWrappingId =\n selectedWrap?.uid ?? giftWrappingOptions?.[0]?.uid;\n\n const isGiftWrappingSelected = !!selectedWrap;\n\n const giftMessageConfig = isProductView\n ? item.giftMessage\n : cartData?.giftMessage;\n const printedCardIncluded = cartData?.printedCardIncluded;\n const giftReceiptIncluded = cartData?.giftReceiptIncluded;\n\n const giftMessageAvailable = shouldShowGiftMessage(item, isProductView);\n\n const allowGiftWrappingOnOrder = state.config?.allowGiftWrappingOnOrder;\n const allowGiftReceipt = state.config?.allowGiftReceipt;\n const allowPrintedCard = state.config?.allowPrintedCard;\n const isGiftWrappingAvailableForSome = cartData?.items?.some(\n (item: { giftWrappingAvailable: boolean }) => item.giftWrappingAvailable\n );\n const allowGiftWrappingOnProduct = item?.giftWrappingAvailable;\n const isGiftReceiptVisible = isProductView ? false : !!allowGiftReceipt;\n const isPrintedCartVisible = isProductView ? false : !!allowPrintedCard;\n const isGiftWrappingVisible = isProductView\n ? !!allowGiftWrappingOnProduct && !!giftWrappingOptions.length\n : !!allowGiftWrappingOnOrder &&\n !!giftWrappingOptions.length &&\n !!isGiftWrappingAvailableForSome;\n const checkBoxesIsHidden =\n !isGiftReceiptVisible && !isPrintedCartVisible && !isGiftWrappingVisible;\n\n setAreGiftOptionsVisible({\n isGiftReceiptVisible,\n isPrintedCartVisible,\n isGiftWrappingVisible,\n isGiftOptionsVisible: !checkBoxesIsHidden,\n });\n setIsGiftMessageVisible(giftMessageAvailable);\n\n return {\n ...(item && 'uid' in item ? { itemId: item.uid } : {}),\n ...(!isProductView\n ? {\n printedCardIncluded,\n giftReceiptIncluded,\n }\n : {}),\n ...giftMessageConfig,\n giftWrappingId: selectedGiftWrappingId,\n isGiftWrappingSelected,\n giftWrappingOptions,\n };\n }, [cartData, item, isProductView]);\n\n useEffect(() => {\n if (!giftOptionsState) return;\n\n const { giftWrappingOptions, ...giftOptionsFetchData } = giftOptionsState;\n\n setGiftOptions(giftOptionsFetchData);\n\n if (giftWrappingOptions?.length) {\n setGiftWrappingConfig(giftWrappingOptions);\n }\n\n setLoading(false);\n }, [giftOptionsState]);\n\n const isGiftOptionsApplied = useMemo(() => {\n return Object.entries(giftOptions)\n .filter(([key]) => key !== 'itemId' && key !== 'giftWrappingId')\n .some(([, value]) => Boolean(value));\n }, [giftOptions]);\n\n const isGiftOptionsHidden = useMemo(() => {\n return !loading && !!state?.config && areGiftOptionsDisabled(view, item);\n }, [item, loading, view]);\n\n return {\n loading,\n giftOptions,\n showModal,\n errorsField,\n updateLoading,\n cartData,\n fieldsDisabled,\n isGiftOptionsApplied,\n giftWrappingConfig,\n setFieldsDisabled,\n handleFormMouseLeave,\n onInputChange,\n updateGiftOptions,\n setShowModal,\n handleBlur,\n isGiftMessageVisible,\n areGiftOptionsVisible,\n isGiftOptionsHidden,\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 { GiftOptions as GiftOptionsComponent } from '@/cart/components';\nimport { Item } from '@/cart/data/models';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { useGiftOptions } from '@/cart/hooks/useGiftOptions';\nimport {\n GiftOptionsViewProps,\n GiftOptionsDataSourcesProps,\n GiftFormDataType,\n ProductGiftOptionsConfig,\n GiftOptionsReadOnlyViewProps,\n} from '@/cart/types';\nimport { ImageNodeRenderProps, ImageProps } from '@adobe-commerce/elsie/components';\n\nexport interface GiftOptionsProps {\n item: Item | ProductGiftOptionsConfig;\n view?: GiftOptionsViewProps;\n readOnlyFormOrderView: GiftOptionsReadOnlyViewProps;\n dataSource?: GiftOptionsDataSourcesProps;\n isEditable?: boolean;\n initialLoading?: boolean;\n handleItemsLoading?: (uid: string, state: boolean) => void;\n handleItemsError?: (uid: string, message?: string) => void;\n onItemUpdate?: ({ item }: { item: Item }) => void;\n onGiftOptionsChange?: (data: GiftFormDataType) => void;\n slots?: {\n SwatchImage?: SlotProps<{ \n item: Item | ProductGiftOptionsConfig\n imageSwatchContext: ImageNodeRenderProps['imageSwatchContext']\n defaultImageProps: ImageProps\n }>;\n };\n}\n\nexport const GiftOptions: Container<GiftOptionsProps> = ({\n item,\n view = 'order',\n readOnlyFormOrderView = 'primary',\n dataSource = 'cart',\n isEditable = true,\n initialLoading = true,\n slots,\n handleItemsLoading,\n handleItemsError,\n onItemUpdate,\n onGiftOptionsChange,\n}: GiftOptionsProps) => {\n const {\n isGiftMessageVisible,\n areGiftOptionsVisible,\n loading,\n giftOptions,\n showModal,\n errorsField,\n updateLoading,\n cartData,\n isGiftOptionsApplied,\n fieldsDisabled,\n giftWrappingConfig,\n handleFormMouseLeave,\n updateGiftOptions,\n setShowModal,\n onInputChange,\n handleBlur,\n isGiftOptionsHidden,\n } = useGiftOptions({\n item,\n view,\n dataSource,\n initialLoading,\n handleItemsLoading,\n handleItemsError,\n onItemUpdate,\n onGiftOptionsChange,\n });\n\n if (isGiftOptionsHidden) {\n return null;\n }\n\n return (\n <GiftOptionsComponent\n item={item}\n view={view}\n loading={loading}\n onBlur={handleBlur}\n giftOptions={giftOptions}\n showModal={showModal}\n isEditable={isEditable}\n errorsField={errorsField}\n setShowModal={setShowModal}\n updateLoading={updateLoading}\n updateGiftOptions={updateGiftOptions}\n cartData={cartData}\n isGiftOptionsApplied={isGiftOptionsApplied}\n fieldsDisabled={fieldsDisabled}\n giftWrappingConfig={giftWrappingConfig}\n handleFormMouseLeave={handleFormMouseLeave}\n readOnlyFormOrderView={readOnlyFormOrderView}\n onInputChange={onInputChange}\n isGiftMessageVisible={isGiftMessageVisible}\n areGiftOptionsVisible={areGiftOptionsVisible}\n imageSwatchImageNode={\n slots?.SwatchImage ? ({ imageSwatchContext, ...defaultImageProps }) => (\n // No need to provide default content, as the slot will only be rendered if it's actually provided.\n <Slot \n name=\"SwatchImage\"\n slotTag='span'\n contentTag='span'\n slot={slots.SwatchImage} \n context={{ item, imageSwatchContext, defaultImageProps }} \n />\n ) : undefined\n }\n />\n );\n};\n"],"names":["DEFAULT_FORM_STATE","DEFAULT_CHECKBOXES_STATE","shouldShowGiftMessage","item","isProductView","_a","state","allowGiftMessageOnOrderItems","_b","areGiftOptionsDisabled","view","allowGiftWrappingOnOrder","allowGiftWrappingOnOrderItems","allowGiftMessageOnOrder","allowGiftReceipt","allowPrintedCard","isGiftOptionsOnProductDisabled","isGiftOptionsOnOrderDisabled","useGiftOptions","dataSource","initialLoading","handleItemsLoading","handleItemsError","onItemUpdate","onGiftOptionsChange","dictionary","useText","loading","setLoading","useState","areGiftOptionsVisible","setAreGiftOptionsVisible","isGiftMessageVisible","setIsGiftMessageVisible","updateLoading","setUpdateLoading","fieldsDisabled","setFieldsDisabled","isDataChanged","setIsDataChanged","isFormTouched","setIsFormTouched","showModal","setShowModal","giftWrappingConfig","setGiftWrappingConfig","cartData","setCartData","errorsField","setErrorsField","giftOptions","setGiftOptions","isFormFilled","_c","isFormEmpty","_d","_e","_f","applyGiftOptionsToCart","useCallback","updatedGiftOptions","recipientName","senderName","message","giftWrappingId","isGiftWrappingSelected","updateProductsFromCart","error","setGiftOptionsOnCart","updateGiftOptions","name","value","extraGiftOptions","prevGiftOptions","isValidGiftFormKey","key","getPrevValue","handleFormMouseLeave","handleBlur","event","prevErrors","onInputChange","target","useEffect","dataEvent","events","payload","isCartGiftWrappingAllowed","giftWrappingAvailable","isCartGiftWrappingApplied","wrap","giftOptionsState","useMemo","giftWrappingOptions","selectedWrap","selectedGiftWrappingId","giftMessageConfig","printedCardIncluded","giftReceiptIncluded","giftMessageAvailable","isGiftWrappingAvailableForSome","allowGiftWrappingOnProduct","isGiftReceiptVisible","isPrintedCartVisible","isGiftWrappingVisible","giftOptionsFetchData","isGiftOptionsApplied","isGiftOptionsHidden","GiftOptions","readOnlyFormOrderView","isEditable","slots","jsx","GiftOptionsComponent","imageSwatchContext","defaultImageProps","Slot"],"mappings":"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"}
|
package/containers/MiniCart.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as r,jsxs as w}from"@dropins/tools/preact-jsx-runtime.js";import{useState as B,useEffect as H,useCallback as X}from"@dropins/tools/preact-compat.js";import{Slot as o}from"@dropins/tools/lib.js";import{s as m,p as O,updateProductsFromCart as j,getCartDataFromCache as Y}from"../api.js";import{events as V}from"@dropins/tools/event-bus.js";import{Button as h,Price as C}from"@dropins/tools/components.js";import{M as $}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import"../chunks/CartSummaryGrid.js";import{C as q}from"../chunks/CartSummaryList.js";import"../chunks/OrderSummary.js";import"../chunks/CartSummaryTable.js";import{useText as z}from"@dropins/tools/i18n.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/EmptyCart.js";const J=100,K=({children:W,initialData:x=null,hideFooter:L=!0,slots:t,routeProduct:g,routeCart:d,routeCheckout:a,routeEmptyCartCTA:v,showDiscount:D,showSavings:k,enableItemRemoval:P=!0,enableQuantityUpdate:T=!1,hideHeading:S=!1,undo:A=!1,confirmBeforeDelete:F=!1,...N})=>{var y,b,f;const[e,Q]=B(x),n=(y=m.config)==null?void 0:y.shoppingCartDisplaySetting;H(()=>{const i=V.on("cart/data",u=>{Q(u)},{eager:!0});return()=>{i==null||i.off()}},[]);const
|
|
3
|
+
import{jsx as r,jsxs as w}from"@dropins/tools/preact-jsx-runtime.js";import{useState as B,useEffect as H,useCallback as X}from"@dropins/tools/preact-compat.js";import{Slot as o}from"@dropins/tools/lib.js";import{s as m,p as O,updateProductsFromCart as j,getCartDataFromCache as Y}from"../api.js";import{events as V}from"@dropins/tools/event-bus.js";import{Button as h,Price as C}from"@dropins/tools/components.js";import{M as $}from"../chunks/components.js";import"@dropins/tools/preact-hooks.js";import"../chunks/CartSummaryGrid.js";import{C as q}from"../chunks/CartSummaryList.js";import"../chunks/OrderSummary.js";import"../chunks/CartSummaryTable.js";import{useText as z}from"@dropins/tools/i18n.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/EmptyCart.js";const J=100,K=({children:W,initialData:x=null,hideFooter:L=!0,slots:t,routeProduct:g,routeCart:d,routeCheckout:a,routeEmptyCartCTA:v,showDiscount:D,showSavings:k,enableItemRemoval:P=!0,enableQuantityUpdate:T=!1,hideHeading:S=!1,undo:A=!1,confirmBeforeDelete:F=!1,...N})=>{var y,b,f;const[e,Q]=B(x),n=(y=m.config)==null?void 0:y.shoppingCartDisplaySetting;H(()=>{const i=V.on("cart/data",u=>{Q(u)},{eager:!0});return()=>{i==null||i.off()}},[]);const p=z({cartLink:"Cart.MiniCart.cartLink",checkoutLink:"Cart.MiniCart.checkoutLink"}),I=(i,u)=>j([{uid:i,quantity:u}]),U=i=>I(i,0),c=e==null?void 0:e.hasOutOfStockItems,M=X(i=>{e&&!c&&(i.preventDefault(),O(e,m.locale),setTimeout(()=>{const u=a==null?void 0:a();u&&(window.location.href=u)},J))},[e,c,a]),E=r(o,{name:"ProductList",slot:t==null?void 0:t.ProductList,context:{itemQuantityUpdateHandler:I,itemRemoveHandler:U,totalQuantity:e==null?void 0:e.totalQuantity},children:r(q,{"data-testid":"default-cart-summary-list",routeProduct:g,routeEmptyCartCTA:v,initialData:e,maxItems:(b=m.config)==null?void 0:b.miniCartMaxItemsDisplay,showMaxItems:!!((f=m.config)!=null&&f.miniCartMaxItemsDisplay),hideHeading:S||!(e!=null&&e.totalQuantity),hideFooter:L,enableRemoveItem:P,enableUpdateItemQuantity:T,showDiscount:D,showSavings:k,undo:A,confirmBeforeDelete:F,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,ConfirmDeleteBanner:t==null?void 0:t.ConfirmDeleteBanner,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}})}),_=i=>r(o,{name:"ProductListFooter",slot:t==null?void 0:t.ProductListFooter,context:{data:i}}),R=i=>r(o,{name:"PreCheckoutSection",slot:t==null?void 0:t.PreCheckoutSection,context:{data:i}}),G=()=>(n==null?void 0:n.subtotal)==="INCLUDING_TAX"||(n==null?void 0:n.subtotal)==="INCLUDING_EXCLUDING_TAX"?{amount:e==null?void 0:e.subtotal.includingTax.value,currency:e==null?void 0:e.subtotal.includingTax.currency,"data-testid":"subtotal-including-tax",style:{font:"inherit"}}:{amount:e==null?void 0:e.subtotal.excludingTax.value,currency:e==null?void 0:e.subtotal.excludingTax.currency,"data-testid":"subtotal-excluding-tax",style:{font:"inherit"}};return r($,{...N,productListFooter:_(e),subtotal:e!=null&&e.totalQuantity?(e==null?void 0:e.subtotal)&&r(C,{...G()}):void 0,subtotalExcludingTaxes:e!=null&&e.totalQuantity?(e==null?void 0:e.subtotal)&&((n==null?void 0:n.subtotal)==="INCLUDING_EXCLUDING_TAX"?r(C,{amount:e==null?void 0:e.subtotal.excludingTax.value,currency:e==null?void 0:e.subtotal.excludingTax.currency,"data-testid":"subtotal-including-excluding-tax",style:{font:"inherit"}}):void 0):void 0,preCheckoutSection:R(e),ctas:e!=null&&e.totalQuantity?w("div",{children:[a&&r(h,{"data-testid":"route-checkout-button",variant:"primary",href:c?void 0:a(),disabled:c,"aria-disabled":c,onClick:M,children:p.checkoutLink}),d&&r(h,{"data-testid":"route-cart-button",variant:"tertiary",href:d(),children:p.cartLink})]}):void 0,products:E})};K.getInitialData=async function(){return Y()};export{K as MiniCart,K as default};
|
|
4
4
|
//# sourceMappingURL=MiniCart.js.map
|