@dropins/storefront-checkout 2.0.0 → 2.0.1
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/api.js +1 -0
- package/api.js.map +1 -0
- package/chunks/ConditionalWrapper.js +2 -1
- package/chunks/ConditionalWrapper.js.map +1 -0
- package/chunks/OrderError.js +1 -0
- package/chunks/OrderError.js.map +1 -0
- package/chunks/ServerErrorSignal.js +1 -0
- package/chunks/ServerErrorSignal.js.map +1 -0
- package/chunks/TermsAndConditions.js +3 -2
- package/chunks/TermsAndConditions.js.map +1 -0
- package/chunks/checkout.js +1 -0
- package/chunks/checkout.js.map +1 -0
- package/chunks/classes.js +1 -0
- package/chunks/classes.js.map +1 -0
- package/chunks/dom.js +1 -0
- package/chunks/dom.js.map +1 -0
- package/chunks/errors.js +1 -0
- package/chunks/errors.js.map +1 -0
- package/chunks/setBillingAddress.js +1 -0
- package/chunks/setBillingAddress.js.map +1 -0
- package/chunks/setGuestEmailOnCart.js +1 -0
- package/chunks/setGuestEmailOnCart.js.map +1 -0
- package/chunks/setPaymentMethod.js +1 -0
- package/chunks/setPaymentMethod.js.map +1 -0
- package/chunks/setShippingMethods.js +1 -0
- package/chunks/setShippingMethods.js.map +1 -0
- package/chunks/synchronizeCheckout.js +1 -0
- package/chunks/synchronizeCheckout.js.map +1 -0
- package/chunks/values.js +1 -0
- package/chunks/values.js.map +1 -0
- package/components/PaymentMethods/PaymentMethods.d.ts +2 -2
- package/components/ShippingMethods/ShippingMethods.d.ts +2 -2
- package/components/index.d.ts +0 -4
- package/containers/BillToShippingAddress.js +2 -1
- package/containers/BillToShippingAddress.js.map +1 -0
- package/containers/EstimateShipping.js +2 -1
- package/containers/EstimateShipping.js.map +1 -0
- package/containers/LoginForm.js +2 -1
- package/containers/LoginForm.js.map +1 -0
- package/containers/MergedCartBanner.js +2 -1
- package/containers/MergedCartBanner.js.map +1 -0
- package/containers/OutOfStock.js +1 -0
- package/containers/OutOfStock.js.map +1 -0
- package/containers/PaymentMethods.js +2 -1
- package/containers/PaymentMethods.js.map +1 -0
- package/containers/PlaceOrder.js +2 -1
- package/containers/PlaceOrder.js.map +1 -0
- package/containers/ServerError.js +1 -0
- package/containers/ServerError.js.map +1 -0
- package/containers/ShippingMethods.js +2 -1
- package/containers/ShippingMethods.js.map +1 -0
- package/containers/TermsAndConditions.js +2 -1
- package/containers/TermsAndConditions.js.map +1 -0
- package/containers/index.d.ts +0 -2
- package/fragments.js +1 -0
- package/fragments.js.map +1 -0
- package/package.json +1 -1
- package/render.js +4 -3
- package/render.js.map +1 -0
- package/chunks/Summary.js +0 -3
- package/chunks/events.js +0 -3
- package/components/LoginFormSummary/LoginFormSummary.d.ts +0 -10
- package/components/LoginFormSummary/index.d.ts +0 -18
- package/components/PaymentMethodsSummary/PaymentMethodsSummary.d.ts +0 -11
- package/components/PaymentMethodsSummary/index.d.ts +0 -19
- package/components/ShippingMethodsSummary/ShippingMethodsSummary.d.ts +0 -14
- package/components/ShippingMethodsSummary/index.d.ts +0 -19
- package/components/Summary/Summary.d.ts +0 -10
- package/components/Summary/index.d.ts +0 -19
- package/containers/LoginFormSummary/LoginFormSummary.d.ts +0 -14
- package/containers/LoginFormSummary/index.d.ts +0 -19
- package/containers/LoginFormSummary.d.ts +0 -3
- package/containers/LoginFormSummary.js +0 -3
- package/containers/PaymentMethodsSummary/PaymentMethodsSummary.d.ts +0 -18
- package/containers/PaymentMethodsSummary/index.d.ts +0 -19
- package/containers/PaymentMethodsSummary.d.ts +0 -3
- package/containers/PaymentMethodsSummary.js +0 -3
- package/containers/ShippingMethodsSummary/ShippingMethodsSummary.d.ts +0 -15
- package/containers/ShippingMethodsSummary/index.d.ts +0 -19
- package/containers/ShippingMethodsSummary.d.ts +0 -3
- package/containers/ShippingMethodsSummary.js +0 -3
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{AlertBanner as
|
|
3
|
+
import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{AlertBanner as h,Icon as I}from"@dropins/tools/components.js";import{c as B}from"../chunks/classes.js";import{events as c}from"@dropins/tools/event-bus.js";import{useState as M,useCallback as w,useEffect as u}from"@dropins/tools/preact-hooks.js";import*as f from"@dropins/tools/preact-compat.js";import{useText as x,Text as H}from"@dropins/tools/i18n.js";const V=n=>f.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},f.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M0 12C0 5.37931 5.37931 0 12 0C18.6207 0 24 5.37931 24 12C24 18.6207 18.6207 24 12 24C5.37931 24 0 18.6207 0 12ZM11.8885 5.06101C11.1405 5.06101 10.5357 5.66579 10.5357 6.4138V6.57295C10.5835 7.27321 11.1882 7.81433 11.8885 7.76658H12.0795C12.7797 7.70292 13.289 7.09815 13.2413 6.4138C13.2413 5.66579 12.6365 5.06101 11.8885 5.06101ZM13.1935 16.8223H14.1007C14.2599 16.8223 14.4031 16.9655 14.4031 17.1247V17.7294C14.4031 17.9045 14.2599 18.0318 14.1007 18.0318H9.8832C9.70813 18.0318 9.58081 17.8886 9.58081 17.7294V17.1247C9.58081 16.9496 9.72405 16.8223 9.8832 16.8223H10.7904V10.7905H9.8832C9.70813 10.7905 9.58081 10.6472 9.58081 10.4881V9.88329C9.58081 9.70823 9.72405 9.58091 9.8832 9.58091H12.5888C12.923 9.58091 13.1935 9.85146 13.1935 10.1857V16.8223Z",fill:"currentColor"})),R=({className:n,initialData:b,active:r=!0,...C})=>{const[s,o]=M(0),a=x({mergedCartBannerItems:t(H,{fields:{count:s},id:"Checkout.MergedCartBanner.items",plural:s})}),d=()=>{o(0)},l=w(e=>{var i;const m=(i=e==null?void 0:e.oldCartItems)==null?void 0:i.reduce((g,p)=>g+p.quantity,0);m>0&&o(m)},[]);return u(()=>{if(!r)return;const e=c.on("cart/merged",l,{eager:!0});return()=>{e==null||e.off()}},[r,l]),u(()=>{if(!r)return;const e=c.on("cart/reset",()=>{o(0)},{eager:!1});return()=>{e==null||e.off()}},[r]),!r||!s?null:t(h,{...C,"aria-label":a.mergedCartBannerItems,className:B(["checkout__banner",n]),"data-testid":"merged-cart-banner",icon:t(I,{source:V}),message:t("span",{children:a.mergedCartBannerItems}),variant:"neutral",onDismiss:d})};export{R as MergedCartBanner,R as default};
|
|
4
|
+
//# sourceMappingURL=MergedCartBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MergedCartBanner.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/InfoFilled.svg","/@dropins/storefront-checkout/src/containers/MergedCartBanner/MergedCartBanner.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgInfoFilled = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M0 12C0 5.37931 5.37931 0 12 0C18.6207 0 24 5.37931 24 12C24 18.6207 18.6207 24 12 24C5.37931 24 0 18.6207 0 12ZM11.8885 5.06101C11.1405 5.06101 10.5357 5.66579 10.5357 6.4138V6.57295C10.5835 7.27321 11.1882 7.81433 11.8885 7.76658H12.0795C12.7797 7.70292 13.289 7.09815 13.2413 6.4138C13.2413 5.66579 12.6365 5.06101 11.8885 5.06101ZM13.1935 16.8223H14.1007C14.2599 16.8223 14.4031 16.9655 14.4031 17.1247V17.7294C14.4031 17.9045 14.2599 18.0318 14.1007 18.0318H9.8832C9.70813 18.0318 9.58081 17.8886 9.58081 17.7294V17.1247C9.58081 16.9496 9.72405 16.8223 9.8832 16.8223H10.7904V10.7905H9.8832C9.70813 10.7905 9.58081 10.6472 9.58081 10.4881V9.88329C9.58081 9.70823 9.72405 9.58091 9.8832 9.58091H12.5888C12.923 9.58091 13.1935 9.85146 13.1935 10.1857V16.8223Z\", fill: \"currentColor\" }));\nexport default SvgInfoFilled;\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 '@/checkout/containers/MergedCartBanner/MergedCartBanner.css';\nimport {\n AlertBanner,\n AlertBannerProps,\n Icon,\n} from '@adobe-commerce/elsie/components';\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { InfoFilled } from '@adobe-commerce/elsie/icons';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { Container } from '@adobe-commerce/elsie/lib/types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\nexport interface MergedCartBannerProps extends AlertBannerProps {\n active?: boolean;\n}\n\nexport const MergedCartBanner: Container<MergedCartBannerProps> = ({\n className,\n initialData,\n active = true,\n ...props\n}) => {\n const [totalMergedItems, setTotalMergedItems] = useState(0);\n\n const translations = useText({\n mergedCartBannerItems: (\n <Text\n fields={{\n count: totalMergedItems,\n }}\n id=\"Checkout.MergedCartBanner.items\"\n plural={totalMergedItems}\n />\n ),\n });\n\n const onDismiss = () => {\n setTotalMergedItems(0);\n };\n\n const handleCartMerged = useCallback((data: { oldCartItems: any[] }) => {\n const oldCartItems = data?.oldCartItems?.reduce(\n (acc, item) => acc + item.quantity,\n 0\n );\n\n if (oldCartItems > 0) {\n setTotalMergedItems(oldCartItems);\n }\n }, []);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartMerged = events.on('cart/merged', handleCartMerged, {\n eager: true,\n });\n return () => {\n onCartMerged?.off();\n };\n }, [active, handleCartMerged]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartReset = events.on(\n 'cart/reset',\n () => {\n setTotalMergedItems(0);\n },\n {\n eager: false,\n }\n );\n return () => {\n onCartReset?.off();\n };\n }, [active]);\n\n if (!active || !totalMergedItems) return null;\n\n return (\n <AlertBanner\n {...props}\n aria-label={translations.mergedCartBannerItems}\n className={classes(['checkout__banner', className])}\n data-testid=\"merged-cart-banner\"\n icon={<Icon source={InfoFilled} />}\n message={<span>{translations.mergedCartBannerItems}</span>}\n variant=\"neutral\"\n onDismiss={onDismiss}\n />\n );\n};\n"],"names":["SvgInfoFilled","props","React","MergedCartBanner","className","initialData","active","totalMergedItems","setTotalMergedItems","useState","translations","useText","jsx","Text","onDismiss","handleCartMerged","useCallback","data","oldCartItems","_a","acc","item","useEffect","onCartMerged","events","onCartReset","AlertBanner","classes","Icon","InfoFilled"],"mappings":"qaACA,MAAMA,EAAiBC,GAA0BC,EAAM,cAAc,MAAO,CAAE,MAAO,GAAI,OAAQ,GAAI,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GAAGD,CAAO,EAAkBC,EAAM,cAAc,OAAQ,CAAE,SAAU,UAAW,SAAU,UAAW,EAAG,6vBAA8vB,KAAM,cAAgB,CAAA,CAAC,ECiC7hCC,EAAqD,CAAC,CACjE,UAAAC,EACA,YAAAC,EACA,OAAAC,EAAS,GACT,GAAGL,CACL,IAAM,CACJ,KAAM,CAACM,EAAkBC,CAAmB,EAAIC,EAAS,CAAC,EAEpDC,EAAeC,EAAQ,CAC3B,sBACEC,EAACC,EAAA,CACC,OAAQ,CACN,MAAON,CACT,EACA,GAAG,kCACH,OAAQA,CAAA,CAAA,CACV,CAEH,EAEKO,EAAY,IAAM,CACtBN,EAAoB,CAAC,CACvB,EAEMO,EAAmBC,EAAaC,GAAkC,OAChE,MAAAC,GAAeC,EAAAF,GAAA,YAAAA,EAAM,eAAN,YAAAE,EAAoB,OACvC,CAACC,EAAKC,IAASD,EAAMC,EAAK,SAC1B,GAGEH,EAAe,GACjBV,EAAoBU,CAAY,CAEpC,EAAG,EAAE,EA8BL,OA5BAI,EAAU,IAAM,CACd,GAAI,CAAChB,EAAQ,OAEb,MAAMiB,EAAeC,EAAO,GAAG,cAAeT,EAAkB,CAC9D,MAAO,EAAA,CACR,EACD,MAAO,IAAM,CACXQ,GAAA,MAAAA,EAAc,KAChB,CAAA,EACC,CAACjB,EAAQS,CAAgB,CAAC,EAE7BO,EAAU,IAAM,CACd,GAAI,CAAChB,EAAQ,OAEb,MAAMmB,EAAcD,EAAO,GACzB,aACA,IAAM,CACJhB,EAAoB,CAAC,CACvB,EACA,CACE,MAAO,EAAA,CAEX,EACA,MAAO,IAAM,CACXiB,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAACnB,CAAM,CAAC,EAEP,CAACA,GAAU,CAACC,EAAyB,KAGvCK,EAACc,EAAA,CACE,GAAGzB,EACJ,aAAYS,EAAa,sBACzB,UAAWiB,EAAQ,CAAC,mBAAoBvB,CAAS,CAAC,EAClD,cAAY,qBACZ,KAAMQ,EAACgB,EAAK,CAAA,OAAQC,CAAY,CAAA,EAChC,QAASjB,EAAC,OAAM,CAAA,SAAAF,EAAa,sBAAsB,EACnD,QAAQ,UACR,UAAAI,CAAA,CACF,CAEJ","x_google_ignoreList":[0]}
|
package/containers/OutOfStock.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
import{jsxs as n,jsx as o}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{Card as l,Icon as h,Image as O}from"@dropins/tools/components.js";import"../chunks/TermsAndConditions.js";import{classes as d}from"@dropins/tools/lib.js";import{S as p}from"../chunks/OrderError.js";import{useText as S}from"@dropins/tools/i18n.js";/* empty css */import"../chunks/errors.js";import{events as _}from"@dropins/tools/event-bus.js";import"@dropins/tools/preact-compat.js";/* empty css *//* empty css */import{useState as g,useCallback as v,useEffect as N}from"@dropins/tools/preact-hooks.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";const w=({className:r,items:u,onRemoveOutOfStock:s,routeCart:t,...a})=>{const i=S({title:"Checkout.OutOfStock.title",message:"Checkout.OutOfStock.message",reviewCart:"Checkout.OutOfStock.actions.reviewCart",removeOutOfStock:"Checkout.OutOfStock.actions.removeOutOfStock"});return n(l,{className:d(["checkout-out-of-stock",r]),"data-testid":"checkout-out-of-stock",variant:"secondary",...a,children:[n("h4",{className:"checkout-out-of-stock__title",children:[o(h,{size:"16",source:p,stroke:"1"}),i.title]}),o("p",{className:"checkout-out-of-stock__message",children:i.message}),o("ol",{className:"checkout-out-of-stock__items",children:u.map(m=>o("li",{className:"checkout-out-of-stock__item","data-testid":"out-of-stock-item",children:o(O,{alt:m.image.alt,height:"100",loading:"eager",params:{width:100},src:m.image.src,width:"100"})},m.sku))}),n("div",{className:"checkout-out-of-stock__actions",children:[t&&o("a",{className:"checkout-out-of-stock__action","data-testid":"review-cart",href:t,children:i.reviewCart}),s&&o("button",{className:"checkout-out-of-stock__action","data-testid":"remove-out-of-stock",type:"button",onClick:s,children:i.removeOutOfStock})]})]})},G=({onCartProductsUpdate:r,routeCart:u,active:s=!0})=>{const[t,a]=g([]),i=v(()=>{if(!r)return;const e=t.filter(c=>c.outOfStock).map(c=>({uid:c.uid,quantity:0}));r(e)},[t,r]);if(N(()=>{if(!s)return;const e=_.on("cart/data",c=>{const k=(c==null?void 0:c.items)||[];a(k.filter(f=>f.outOfStock||f.insufficientQuantity))},{eager:!0});return()=>{e==null||e.off()}},[s]),!s||t.length===0)return null;const m=!t.some(e=>e.insufficientQuantity);return o(w,{items:t,routeCart:u==null?void 0:u(),onRemoveOutOfStock:m?i:void 0})};export{G as OutOfStock,G as default};
|
|
4
|
+
//# sourceMappingURL=OutOfStock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutOfStock.js","sources":["/@dropins/storefront-checkout/src/components/OutOfStock/OutOfStock.tsx","/@dropins/storefront-checkout/src/containers/OutOfStock/OutOfStock.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 '@/checkout/components/OutOfStock/OutOfStock.css';\nimport { Item as CartItem } from '@/checkout/types/cart';\nimport { Card, Icon, Image } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { OrderError } from '@adobe-commerce/elsie/icons';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface OutOfStockProps extends HTMLAttributes<HTMLDivElement> {\n items: CartItem[];\n onRemoveOutOfStock?: (event: Event) => void;\n routeCart?: string;\n}\n\nexport const OutOfStock: FunctionComponent<OutOfStockProps> = ({\n className,\n items,\n onRemoveOutOfStock,\n routeCart,\n ...props\n}) => {\n const translations = useText({\n title: 'Checkout.OutOfStock.title',\n message: 'Checkout.OutOfStock.message',\n reviewCart: 'Checkout.OutOfStock.actions.reviewCart',\n removeOutOfStock: 'Checkout.OutOfStock.actions.removeOutOfStock',\n });\n\n return (\n <Card\n className={classes(['checkout-out-of-stock', className])}\n data-testid=\"checkout-out-of-stock\"\n variant=\"secondary\"\n {...props}\n >\n <h4 className=\"checkout-out-of-stock__title\">\n <Icon size=\"16\" source={OrderError} stroke=\"1\" />\n {translations.title}\n </h4>\n\n <p className=\"checkout-out-of-stock__message\">{translations.message}</p>\n\n <ol className=\"checkout-out-of-stock__items\">\n {items.map((item) => (\n <li\n key={item.sku}\n className=\"checkout-out-of-stock__item\"\n data-testid=\"out-of-stock-item\"\n >\n <Image\n alt={item.image.alt}\n height=\"100\"\n loading=\"eager\"\n params={{ width: 100 }}\n src={item.image.src}\n width=\"100\"\n />\n </li>\n ))}\n </ol>\n\n <div className=\"checkout-out-of-stock__actions\">\n {routeCart && (\n <a\n className=\"checkout-out-of-stock__action\"\n data-testid=\"review-cart\"\n href={routeCart}\n >\n {translations.reviewCart}\n </a>\n )}\n\n {onRemoveOutOfStock && (\n <button\n className=\"checkout-out-of-stock__action\"\n data-testid=\"remove-out-of-stock\"\n type=\"button\"\n onClick={onRemoveOutOfStock}\n >\n {translations.removeOutOfStock}\n </button>\n )}\n </div>\n </Card>\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 { OutOfStock as OutOfStockComponent } from '@/checkout/components';\nimport { Item as ItemModel } from '@/checkout/types/cart';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\nexport type UpdateProductsFromCart = Array<{\n uid: string;\n quantity: number;\n}>;\n\nexport interface OutOfStockProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'icon'> {\n onCartProductsUpdate?: (items: UpdateProductsFromCart) => void;\n routeCart?: () => string;\n active?: boolean;\n}\n\nexport const OutOfStock: Container<OutOfStockProps> = ({\n onCartProductsUpdate,\n routeCart,\n active = true,\n}) => {\n const [items, setItems] = useState<ItemModel[]>([]);\n\n const removeOutOfStockItems = useCallback(() => {\n if (!onCartProductsUpdate) return;\n\n const update = items\n .filter((item) => item.outOfStock)\n .map((item) => ({ uid: item.uid, quantity: 0 }));\n\n onCartProductsUpdate(update);\n }, [items, onCartProductsUpdate]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartData = events.on(\n 'cart/data',\n (data) => {\n const items = (data?.items || []) as ItemModel[];\n setItems(\n items.filter((item: ItemModel) => {\n return item.outOfStock || item.insufficientQuantity;\n })\n );\n },\n { eager: true }\n );\n\n return () => {\n onCartData?.off();\n };\n }, [active]);\n\n if (!active || items.length === 0) return null;\n\n const canRemoveOutOfStock = !items.some((item) => item.insufficientQuantity);\n\n return (\n <OutOfStockComponent\n items={items}\n routeCart={routeCart?.()}\n onRemoveOutOfStock={\n canRemoveOutOfStock ? removeOutOfStockItems : undefined\n }\n />\n );\n};\n"],"names":["OutOfStock","className","items","onRemoveOutOfStock","routeCart","props","translations","useText","jsxs","Card","classes","jsx","Icon","OrderError","item","Image","onCartProductsUpdate","active","setItems","useState","removeOutOfStockItems","useCallback","update","useEffect","onCartData","events","data","canRemoveOutOfStock","OutOfStockComponent"],"mappings":"ovBAgCO,MAAMA,EAAiD,CAAC,CAC7D,UAAAC,EACA,MAAAC,EACA,mBAAAC,EACA,UAAAC,EACA,GAAGC,CACL,IAAM,CACJ,MAAMC,EAAeC,EAAQ,CAC3B,MAAO,4BACP,QAAS,8BACT,WAAY,yCACZ,iBAAkB,8CAAA,CACnB,EAGC,OAAAC,EAACC,EAAA,CACC,UAAWC,EAAQ,CAAC,wBAAyBT,CAAS,CAAC,EACvD,cAAY,wBACZ,QAAQ,YACP,GAAGI,EAEJ,SAAA,CAACG,EAAA,KAAA,CAAG,UAAU,+BACZ,SAAA,CAAAG,EAACC,GAAK,KAAK,KAAK,OAAQC,EAAY,OAAO,IAAI,EAC9CP,EAAa,KAAA,EAChB,EAECK,EAAA,IAAA,CAAE,UAAU,iCAAkC,WAAa,QAAQ,IAEnE,KAAG,CAAA,UAAU,+BACX,SAAMT,EAAA,IAAKY,GACVH,EAAC,KAAA,CAEC,UAAU,8BACV,cAAY,oBAEZ,SAAAA,EAACI,EAAA,CACC,IAAKD,EAAK,MAAM,IAChB,OAAO,MACP,QAAQ,QACR,OAAQ,CAAE,MAAO,GAAI,EACrB,IAAKA,EAAK,MAAM,IAChB,MAAM,KAAA,CAAA,CACR,EAXKA,EAAK,GAab,CAAA,EACH,EAEAN,EAAC,MAAI,CAAA,UAAU,iCACZ,SAAA,CACCJ,GAAAO,EAAC,IAAA,CACC,UAAU,gCACV,cAAY,cACZ,KAAMP,EAEL,SAAaE,EAAA,UAAA,CAChB,EAGDH,GACCQ,EAAC,SAAA,CACC,UAAU,gCACV,cAAY,sBACZ,KAAK,SACL,QAASR,EAER,SAAaG,EAAA,gBAAA,CAAA,CAChB,CAEJ,CAAA,CAAA,CAAA,CACF,CAEJ,ECnEaN,EAAyC,CAAC,CACrD,qBAAAgB,EACA,UAAAZ,EACA,OAAAa,EAAS,EACX,IAAM,CACJ,KAAM,CAACf,EAAOgB,CAAQ,EAAIC,EAAsB,CAAA,CAAE,EAE5CC,EAAwBC,EAAY,IAAM,CAC9C,GAAI,CAACL,EAAsB,OAE3B,MAAMM,EAASpB,EACZ,OAAQY,GAASA,EAAK,UAAU,EAChC,IAAKA,IAAU,CAAE,IAAKA,EAAK,IAAK,SAAU,GAAI,EAEjDE,EAAqBM,CAAM,CAAA,EAC1B,CAACpB,EAAOc,CAAoB,CAAC,EAuBhC,GArBAO,EAAU,IAAM,CACd,GAAI,CAACN,EAAQ,OAEb,MAAMO,EAAaC,EAAO,GACxB,YACCC,GAAS,CACFxB,MAAAA,GAASwB,GAAA,YAAAA,EAAM,QAAS,CAAC,EAC/BR,EACEhB,EAAM,OAAQY,GACLA,EAAK,YAAcA,EAAK,oBAChC,CACH,CACF,EACA,CAAE,MAAO,EAAK,CAChB,EAEA,MAAO,IAAM,CACXU,GAAA,MAAAA,EAAY,KACd,CAAA,EACC,CAACP,CAAM,CAAC,EAEP,CAACA,GAAUf,EAAM,SAAW,EAAU,OAAA,KAE1C,MAAMyB,EAAsB,CAACzB,EAAM,KAAMY,GAASA,EAAK,oBAAoB,EAGzE,OAAAH,EAACiB,EAAA,CACC,MAAA1B,EACA,UAAWE,GAAA,YAAAA,IACX,mBACEuB,EAAsBP,EAAwB,MAAA,CAElD,CAEJ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as W,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{h as X,s as Y}from"../chunks/errors.js";import{classes as L,VComponent as ee,Slot as j}from"@dropins/tools/lib.js";import{events as A}from"@dropins/tools/event-bus.js";import{W as te,i as ne,h as oe,g as re}from"../chunks/ConditionalWrapper.js";import{n as ae,g as x}from"../chunks/values.js";import{s as ce}from"../chunks/setPaymentMethod.js";/* empty css */import{Skeleton as se,SkeletonRow as E,IllustratedMessage as ie,Icon as D,InLineAlert as le,ToggleButton as de,RadioButton as me}from"@dropins/tools/components.js";import{s as ue}from"../chunks/dom.js";import*as T from"@dropins/tools/preact-compat.js";import{useRef as he,useEffect as pe}from"@dropins/tools/preact-compat.js";import{useText as Z}from"@dropins/tools/i18n.js";import{useState as _,useCallback as P,useEffect as R,useMemo as fe}from"@dropins/tools/preact-hooks.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";import"../fragments.js";import"../chunks/synchronizeCheckout.js";const ye=n=>T.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...n},T.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M17.93 14.8V18.75H5.97C4.75 18.75 3.75 17.97 3.75 17V6.5M3.75 6.5C3.75 5.53 4.74 4.75 5.97 4.75H15.94V8.25H5.97C4.75 8.25 3.75 7.47 3.75 6.5Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),T.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M19.35 11.64H14.04V14.81H19.35V11.64Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),T.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M17.9304 11.64V8.25H15.1504",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"})),ke=()=>W(se,{"data-testid":"payment-methods-skeleton",children:[t(E,{size:"medium",variant:"heading"}),t(E,{size:"medium",variant:"empty"}),t(E,{fullWidth:!0,size:"xlarge"}),t(E,{fullWidth:!0,size:"xlarge"})]}),ge=({UIComponentType:n="ToggleButton",busy:r,code:s,icon:u,onSelectionChange:o,selected:a,title:i})=>{const h={busy:r,className:"checkout-payment-methods__method",label:i,name:"payment-method",onChange:()=>o({code:s,title:i}),value:s};return n==="ToggleButton"?t(de,{...h,icon:u?t(D,{source:u}):void 0,selected:a}):t(me,{...h,checked:a,icon:u??void 0})},ve=({className:n,error:r=null,busy:s=!1,onDismissError:u,onSelectionChange:o=()=>{},options:a,paymentMethodContent:i,selection:h,title:g,UIComponentType:w})=>{const C=Z({EmptyState:"Checkout.PaymentMethods.emptyState"}),k=r!==null,v=he(null);return pe(()=>{k&&v.current&&ue(v.current)},[k]),W("div",{className:L(["checkout-payment-methods",n]),"data-testid":"checkout-payment-methods",children:[g&&t(ee,{className:"checkout-payment-methods__title",node:g}),!s&&a.length===0&&t(ie,{"data-testid":"checkout-payment-methods-empty",icon:t(D,{source:ye}),message:t("p",{children:C.EmptyState})}),W("div",{className:L(["checkout-payment-methods__wrapper",["checkout-payment-methods__wrapper--busy",s]]),"data-testid":"checkout-payment-methods-wrapper",children:[t("div",{className:L(["checkout-payment-methods__methods",["checkout-payment-methods--full-width",a.length%2!==0]]),children:a==null?void 0:a.map(p=>t(ge,{UIComponentType:w,busy:s,code:p.code,icon:p.icon,selected:(h==null?void 0:h.code)===p.code,title:p.displayLabel??!0?p.title:"",onSelectionChange:o},p.code))}),i&&t("div",{className:"checkout-payment-methods__content",children:i})]}),k&&t("div",{ref:v,className:"checkout-payment-methods__error","data-testid":"checkout-payment-methods-alert",children:t(le,{heading:r,type:"error",variant:"primary",onDismiss:u})})]})},Me=te(ve,ke);function Se(n,r){return n?r.some(s=>s.code===n.code):!1}function Pe(n,r){return!n||!r?!1:n.code===r.code}function Ce(n){return n?!!n.code&&!!n.title:!1}const Ae=({UIComponentType:n="ToggleButton",active:r=!0,autoSync:s=!0,displayTitle:u=!0,slots:o,onCartSyncError:a,onSelectionChange:i})=>{var N,O;const[h,g]=_(null),[w,C]=_(!1),[k,v]=_(null),[p,b]=_([]),l=o==null?void 0:o.Methods,$=X.value,q=p.filter(e=>{var c;return((c=l==null?void 0:l[e.code])==null?void 0:c.enabled)!==!1}).map(e=>{const c=(l==null?void 0:l[e.code])||{};return{...e,...c}}),{cartSyncError:z,defaultTitle:H}=Z({cartSyncError:"Checkout.PaymentMethods.cartSyncError",defaultTitle:"Checkout.PaymentMethods.title"}),F=P(()=>{g(null)},[]),m=P(e=>{g(null),v(e),ae({selectedPaymentMethod:e})},[]),M=P(async(e,c)=>{if(!(ne()||oe()))return;const f=l==null?void 0:l[e.code];((f==null?void 0:f.autoSync)??s)&&ce({code:e.code}).catch(y=>{m(c??null),a==null||a({method:e,error:y}),a||g(z)})},[l,s,m,a,z]),G=P(async e=>{const c=x("selectedPaymentMethod");m(e),i==null||i(e),await M(e,c)},[i,m,M]),S=P(e=>{if(!e||e.isEmpty){m(null),b([]);return}const d=e.availablePaymentMethods??[];if(b(d),d.length===0){m(null);return}const f=e.selectedPaymentMethod??null,U=Ce(f),y=x("selectedPaymentMethod"),V=Se(y,d),Q=Pe(y,f);if(y&&V&&!Q){M(y,f);return}if((!y||!V)&&U){m(f);return}if((!y||!V)&&!U){const B=d[0];m(B),M(B)}},[m,M]);R(()=>{if(!r)return;const e=re();if(e){C(!0);const d=x("selectedPaymentMethod");d&&v(d),S(e);return}const c=A.on("checkout/initialized",d=>{C(!0),S(d)},{eager:!0});return()=>{c==null||c.off()}},[r,S]),R(()=>{if(!r)return;const e=A.on("checkout/updated",S,{eager:!1});return()=>{e==null||e.off()}},[r,S]);const I=k?(O=(N=o==null?void 0:o.Methods)==null?void 0:N[k.code])==null?void 0:O.render:null,J=I?t(j,{context:{cartId:Y.cartId??"",replaceHTML(e){this.replaceWith(e)}},name:"PaymentMethodContent",slot:I},I):void 0,K=fe(()=>{if(u)return t(j,{name:"checkout-payment-methods-title",slot:o==null?void 0:o.Title,children:t("h2",{children:H})})},[u,o==null?void 0:o.Title,H]);return t(Me,{UIComponentType:n,busy:$,error:h,initialized:w,options:q,paymentMethodContent:J,selection:k,title:K,visible:r,onDismissError:F,onSelectionChange:G})};export{Ae as PaymentMethods,Ae as default};
|
|
4
|
+
//# sourceMappingURL=PaymentMethods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaymentMethods.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Wallet.svg","/@dropins/storefront-checkout/src/components/PaymentMethods/PaymentMethodsSkeleton.tsx","/@dropins/storefront-checkout/src/components/PaymentMethods/PaymentMethods.tsx","/@dropins/storefront-checkout/src/containers/PaymentMethods/PaymentMethods.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgWallet = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M17.93 14.8V18.75H5.97C4.75 18.75 3.75 17.97 3.75 17V6.5M3.75 6.5C3.75 5.53 4.74 4.75 5.97 4.75H15.94V8.25H5.97C4.75 8.25 3.75 7.47 3.75 6.5Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M19.35 11.64H14.04V14.81H19.35V11.64Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M17.9304 11.64V8.25H15.1504\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgWallet;\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 { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const PaymentMethodsSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"payment-methods-skeleton\">\n <SkeletonRow size=\"medium\" variant=\"heading\" />\n <SkeletonRow size=\"medium\" variant=\"empty\" />\n <SkeletonRow fullWidth={true} size=\"xlarge\" />\n <SkeletonRow fullWidth={true} size=\"xlarge\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport '@/checkout/components/PaymentMethods/PaymentMethods.css';\nimport { PaymentMethodsSkeleton } from '@/checkout/components/PaymentMethods/PaymentMethodsSkeleton';\nimport { PaymentMethodConfig } from '@/checkout/containers';\nimport { PaymentMethod } from '@/checkout/data/models/payment-method';\nimport { scrollToElement } from '@/checkout/lib';\nimport { UIComponentType } from '@/checkout/types/ComponentTypes';\nimport {\n Icon,\n IllustratedMessage,\n InLineAlert,\n RadioButton,\n ToggleButton,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Wallet } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useEffect, useRef } from 'preact/compat';\n\ninterface ExtendedPaymentMethod extends PaymentMethodConfig, PaymentMethod {}\n\nexport interface PaymentMethodsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n error?: string | null;\n busy?: boolean;\n onDismissError?: () => void;\n onSelectionChange?: (value: PaymentMethod) => void;\n options?: ExtendedPaymentMethod[];\n paymentMethodContent?: VNode;\n selection: PaymentMethod | null;\n title?: VNode;\n UIComponentType?: UIComponentType;\n}\n\ninterface PaymentOptionProps {\n UIComponentType?: UIComponentType;\n busy?: boolean;\n code: string;\n icon?: string;\n onSelectionChange: (value: PaymentMethod) => void;\n selected: boolean;\n title: string;\n}\n\nconst PaymentOption: FunctionComponent<PaymentOptionProps> = ({\n UIComponentType = 'ToggleButton',\n busy,\n code,\n icon,\n onSelectionChange,\n selected,\n title,\n}) => {\n const commonProps = {\n busy,\n className: 'checkout-payment-methods__method',\n label: title,\n name: 'payment-method',\n onChange: () => onSelectionChange({ code, title }),\n value: code,\n };\n\n return UIComponentType === 'ToggleButton' ? (\n <ToggleButton\n {...commonProps}\n // @ts-ignore\n icon={icon ? <Icon source={icon} /> : undefined}\n selected={selected}\n />\n ) : (\n <RadioButton {...commonProps} checked={selected} icon={icon ?? undefined} />\n );\n};\n\nconst PaymentMethodsComponent: FunctionComponent<PaymentMethodsProps> = ({\n className,\n error = null,\n busy = false,\n onDismissError,\n onSelectionChange = () => {},\n options,\n paymentMethodContent,\n selection,\n title,\n UIComponentType,\n}) => {\n const translations = useText({\n EmptyState: 'Checkout.PaymentMethods.emptyState',\n });\n\n const hasError = error !== null;\n const errorRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (hasError && errorRef.current) {\n scrollToElement(errorRef.current);\n }\n }, [hasError]);\n\n return (\n <div\n className={classes(['checkout-payment-methods', className])}\n data-testid=\"checkout-payment-methods\"\n >\n {title && (\n <VComponent className=\"checkout-payment-methods__title\" node={title} />\n )}\n\n {!busy && options!.length === 0 && (\n <IllustratedMessage\n data-testid=\"checkout-payment-methods-empty\"\n icon={<Icon source={Wallet} />}\n message={<p>{translations.EmptyState}</p>}\n />\n )}\n\n <div\n className={classes([\n 'checkout-payment-methods__wrapper',\n ['checkout-payment-methods__wrapper--busy', busy],\n ])}\n data-testid=\"checkout-payment-methods-wrapper\"\n >\n <div\n className={classes([\n 'checkout-payment-methods__methods',\n ['checkout-payment-methods--full-width', options!.length % 2 !== 0],\n ])}\n >\n {options?.map((method) => (\n <PaymentOption\n key={method.code}\n UIComponentType={UIComponentType}\n busy={busy}\n code={method.code}\n icon={method.icon}\n selected={selection?.code === method.code}\n title={method.displayLabel ?? true ? method.title : ''}\n onSelectionChange={onSelectionChange}\n />\n ))}\n </div>\n\n {paymentMethodContent && (\n <div className=\"checkout-payment-methods__content\">\n {paymentMethodContent}\n </div>\n )}\n </div>\n\n {hasError && (\n <div\n ref={errorRef}\n className=\"checkout-payment-methods__error\"\n data-testid=\"checkout-payment-methods-alert\"\n >\n <InLineAlert\n heading={error}\n type=\"error\"\n variant=\"primary\"\n onDismiss={onDismissError}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const PaymentMethods = WithConditionals(\n PaymentMethodsComponent,\n PaymentMethodsSkeleton\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 { setPaymentMethod } from '@/checkout/api';\nimport { PaymentMethods as PaymentMethodsComponent } from '@/checkout/components/PaymentMethods/PaymentMethods';\nimport { Cart } from '@/checkout/data/models/cart';\nimport { PaymentMethod } from '@/checkout/data/models/payment-method';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasShippingAddress,\n isVirtualCart,\n notifyValues,\n} from '@/checkout/lib';\nimport { hasPendingCartUpdates } from '@/checkout/lib/enqueueRequest';\nimport { state } from '@/checkout/lib/state';\nimport { UIComponentType } from '@/checkout/types/ComponentTypes';\nimport { TitleProps } from '@/checkout/types/TitleProps';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\n\nexport interface PaymentMethodRenderCtx {\n cartId: string;\n replaceHTML: (domElement: HTMLElement) => void;\n}\n\nexport interface PaymentMethodConfig {\n displayLabel?: boolean;\n enabled?: boolean;\n icon?: string;\n autoSync?: boolean;\n render?: SlotProps<PaymentMethodRenderCtx>;\n}\n\nexport interface PaymentMethodsSlot {\n [code: string]: PaymentMethodConfig;\n}\n\ninterface CartSyncError {\n method: PaymentMethod;\n error: Error;\n}\n\nexport interface PaymentMethodsProps\n extends HTMLAttributes<HTMLDivElement>,\n TitleProps {\n slots?: {\n Methods?: PaymentMethodsSlot;\n } & TitleProps['slots'];\n UIComponentType?: UIComponentType;\n active?: boolean;\n autoSync?: boolean;\n onCartSyncError?: (error: CartSyncError) => void;\n onSelectionChange?: (method: PaymentMethod) => void;\n}\n\nfunction isValidSelection(\n selection: PaymentMethod | null,\n options: PaymentMethod[]\n) {\n if (!selection) return false;\n return options.some((option) => option.code === selection.code);\n}\n\nfunction isEqual(a: PaymentMethod | null, b: PaymentMethod | null) {\n if (!a || !b) return false;\n return a.code === b.code;\n}\n\nfunction isValidPaymentMethod(method: PaymentMethod | null) {\n if (!method) return false;\n return !!method.code && !!method.title;\n}\n\nexport const PaymentMethods: Container<PaymentMethodsProps> = ({\n UIComponentType = 'ToggleButton',\n active = true,\n autoSync = true,\n displayTitle = true,\n slots,\n onCartSyncError,\n onSelectionChange,\n}) => {\n const [error, setError] = useState<string | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [selection, setSelection] = useState<PaymentMethod | null>(null);\n const [options, setOptions] = useState<PaymentMethod[]>([]);\n const slotMethods = slots?.Methods;\n const hasPendingUpdates = hasPendingCartUpdates.value;\n\n const enabledOptions = options\n .filter((method) => {\n return slotMethods?.[method.code]?.enabled !== false;\n })\n .map((method) => {\n const slotMethod = slotMethods?.[method.code] || {};\n\n return {\n ...method,\n ...slotMethod,\n };\n });\n\n const { cartSyncError, defaultTitle } = useText({\n cartSyncError: 'Checkout.PaymentMethods.cartSyncError',\n defaultTitle: 'Checkout.PaymentMethods.title',\n });\n\n const handleDismissError = useCallback(() => {\n setError(null);\n }, []);\n\n const setUserSelection = useCallback((selection: PaymentMethod | null) => {\n setError(null);\n setSelection(selection);\n notifyValues({ selectedPaymentMethod: selection });\n }, []);\n\n const setUserSelectionOnCart = useCallback(\n async (selection: PaymentMethod, fallback?: PaymentMethod | null) => {\n const canSetUserSelectionOnCart = isVirtualCart() || hasShippingAddress();\n if (!canSetUserSelectionOnCart) return;\n\n const methodConfig = slotMethods?.[selection.code];\n const shouldAutoSync = methodConfig?.autoSync ?? autoSync;\n\n if (!shouldAutoSync) return;\n\n setPaymentMethod({ code: selection.code }).catch((error) => {\n setUserSelection(fallback ?? null);\n onCartSyncError?.({ method: selection, error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [slotMethods, autoSync, setUserSelection, onCartSyncError, cartSyncError]\n );\n\n const handleSelectionChange = useCallback(\n async (selection: PaymentMethod) => {\n const prevSelection = getValue('selectedPaymentMethod');\n\n setUserSelection(selection);\n onSelectionChange?.(selection);\n\n await setUserSelectionOnCart(selection, prevSelection);\n },\n [onSelectionChange, setUserSelection, setUserSelectionOnCart]\n );\n\n const handleCheckoutData = useCallback(\n (data: Cart | null) => {\n const isEmptyCart = !data || data.isEmpty;\n\n if (isEmptyCart) {\n setUserSelection(null);\n setOptions([]);\n return;\n }\n\n const availableOptions = data.availablePaymentMethods ?? [];\n setOptions(availableOptions);\n\n if (availableOptions.length === 0) {\n setUserSelection(null);\n return;\n }\n\n const cartSelection = data.selectedPaymentMethod ?? null;\n const hasCartSelection = isValidPaymentMethod(cartSelection);\n const userSelection = getValue('selectedPaymentMethod');\n const isAvailable = isValidSelection(userSelection, availableOptions);\n const haveSameSelection = isEqual(userSelection, cartSelection);\n\n // User has valid selection that differs from cart\n if (userSelection && isAvailable && !haveSameSelection) {\n setUserSelectionOnCart(userSelection, cartSelection);\n return;\n }\n\n // User has invalid selection but cart has valid selection\n if ((!userSelection || !isAvailable) && hasCartSelection) {\n setUserSelection(cartSelection);\n return;\n }\n\n // Neither user nor cart has valid selection\n if ((!userSelection || !isAvailable) && !hasCartSelection) {\n const newSelection = availableOptions[0];\n setUserSelection(newSelection);\n setUserSelectionOnCart(newSelection);\n }\n },\n [setUserSelection, setUserSelectionOnCart]\n );\n\n useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\n setIsInitialized(true);\n // When component becomes active, restore key state so handleCheckoutData can work properly\n const userSelection = getValue('selectedPaymentMethod');\n if (userSelection) {\n setSelection(userSelection);\n }\n handleCheckoutData(pastUpdate);\n return;\n }\n\n const onCheckoutInit = events.on(\n 'checkout/initialized',\n (data: Cart | null) => {\n setIsInitialized(true);\n handleCheckoutData(data);\n },\n { eager: true }\n );\n\n return () => {\n onCheckoutInit?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n handleCheckoutData,\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n const selectedPaymentMethodHandler = selection\n ? slots?.Methods?.[selection.code]?.render\n : null;\n\n const paymentMethodContent = selectedPaymentMethodHandler ? (\n <Slot\n key={selectedPaymentMethodHandler}\n context={{\n cartId: state.cartId ?? '',\n replaceHTML(domElement: HTMLElement) {\n this.replaceWith(domElement);\n },\n }}\n name=\"PaymentMethodContent\"\n slot={selectedPaymentMethodHandler}\n />\n ) : undefined;\n\n const titleContent = useMemo(() => {\n if (!displayTitle) return undefined;\n\n return (\n <Slot name=\"checkout-payment-methods-title\" slot={slots?.Title}>\n <h2>{defaultTitle}</h2>\n </Slot>\n );\n }, [displayTitle, slots?.Title, defaultTitle]);\n\n return (\n <PaymentMethodsComponent\n UIComponentType={UIComponentType}\n busy={hasPendingUpdates}\n error={error}\n initialized={isInitialized}\n options={enabledOptions}\n paymentMethodContent={paymentMethodContent}\n selection={selection}\n title={titleContent}\n visible={active}\n onDismissError={handleDismissError}\n onSelectionChange={handleSelectionChange}\n />\n );\n};\n"],"names":["SvgWallet","props","React","PaymentMethodsSkeleton","jsxs","Skeleton","jsx","SkeletonRow","PaymentOption","UIComponentType","busy","code","icon","onSelectionChange","selected","title","commonProps","ToggleButton","Icon","RadioButton","PaymentMethodsComponent","className","error","onDismissError","options","paymentMethodContent","selection","translations","useText","hasError","errorRef","useRef","useEffect","scrollToElement","classes","VComponent","IllustratedMessage","Wallet","method","InLineAlert","PaymentMethods","WithConditionals","isValidSelection","option","isEqual","a","b","isValidPaymentMethod","active","autoSync","displayTitle","slots","onCartSyncError","setError","useState","isInitialized","setIsInitialized","setSelection","setOptions","slotMethods","hasPendingUpdates","hasPendingCartUpdates","enabledOptions","_a","slotMethod","cartSyncError","defaultTitle","handleDismissError","useCallback","setUserSelection","notifyValues","setUserSelectionOnCart","fallback","isVirtualCart","hasShippingAddress","methodConfig","setPaymentMethod","handleSelectionChange","prevSelection","getValue","handleCheckoutData","data","availableOptions","cartSelection","hasCartSelection","userSelection","isAvailable","haveSameSelection","newSelection","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","events","onCheckoutUpdated","selectedPaymentMethodHandler","_b","Slot","state","domElement","titleContent","useMemo"],"mappings":"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","x_google_ignoreList":[0]}
|
package/containers/PlaceOrder.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as U,jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{h as I,U as v,s as B}from"../chunks/errors.js";import{classes as j,Slot as w}from"@dropins/tools/lib.js";import{events as d}from"@dropins/tools/event-bus.js";import{
|
|
3
|
+
import{jsxs as U,jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{h as I,U as v,s as B}from"../chunks/errors.js";import{classes as j,Slot as w}from"@dropins/tools/lib.js";import{events as d}from"@dropins/tools/event-bus.js";import{W as M,g as N}from"../chunks/ConditionalWrapper.js";import{g as y}from"../chunks/values.js";/* empty css */import{Skeleton as T,SkeletonRow as g,Button as W}from"@dropins/tools/components.js";import{s as _}from"../chunks/ServerErrorSignal.js";import{useState as E,useCallback as m,useEffect as f}from"@dropins/tools/preact-hooks.js";import{useText as H}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";const L=()=>U(T,{"data-testid":"place-order-skeleton",children:[o(g,{size:"small",variant:"empty"}),o(g,{size:"small"})]}),Q=({children:c,className:r,disabled:s=!1,onClick:a})=>o("div",{className:j(["checkout-place-order",r]),children:o(W,{className:"checkout-place-order__button","data-testid":"place-order-button",disabled:s,size:"medium",type:"submit",variant:"primary",onClick:a,children:c},"placeOrder")}),R=M(Q,L),te=({disabled:c=!1,active:r=!0,handleValidation:s,handlePlaceOrder:a,slots:i,...S})=>{var C;const[x,p]=E(!1),[P,h]=E(!1),b=I.value,l=H({CheckoutUnexpectedError:"Checkout.ServerError.unexpected",placeOrderButton:"Checkout.PlaceOrder.button"}),k=m(e=>{_.value=e instanceof TypeError||e instanceof v?l.CheckoutUnexpectedError:e.message},[l]),z=m(async()=>{var e;try{if(s&&!s())return;await a({cartId:B.cartId,code:((e=y("selectedPaymentMethod"))==null?void 0:e.code)??""})}catch(t){k(t)}},[s,a,k]),n=m(e=>{(!e||e.isEmpty)&&h(!1)},[]);return f(()=>{if(r===!1)return;const e=d.on("cart/initialized",t=>{const u=(t==null?void 0:t.items)||[];h(u.some(O=>O.outOfStock||O.insufficientQuantity))},{eager:!0});return()=>{e==null||e.off()}},[r]),f(()=>{if(!r)return;const e=N();if(e){p(!0),n(e);return}const t=d.on("checkout/initialized",u=>{p(!0),n(u)},{eager:!0});return()=>{t==null||t.off()}},[r,n]),f(()=>{if(!r)return;const e=d.on("checkout/updated",t=>{n(t)},{eager:!1});return()=>{e==null||e.off()}},[r,n]),o(R,{...S,disabled:c||P||b,initialized:x,visible:r,onClick:z,children:o(w,{context:{code:((C=y("selectedPaymentMethod"))==null?void 0:C.code)??""},name:"Content",slot:i==null?void 0:i.Content,children:l.placeOrderButton})})};export{te as PlaceOrder,te as default};
|
|
4
|
+
//# sourceMappingURL=PlaceOrder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaceOrder.js","sources":["/@dropins/storefront-checkout/src/components/PlaceOrder/PlaceOrderSkeleton.tsx","/@dropins/storefront-checkout/src/components/PlaceOrder/PlaceOrder.tsx","/@dropins/storefront-checkout/src/containers/PlaceOrder/PlaceOrder.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 { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const PlaceOrderSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"place-order-skeleton\">\n <SkeletonRow size=\"small\" variant=\"empty\" />\n <SkeletonRow size=\"small\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/index';\nimport '@/checkout/components/PlaceOrder/PlaceOrder.css';\nimport { PlaceOrderSkeleton } from '@/checkout/components/PlaceOrder/PlaceOrderSkeleton';\nimport { Button } from '@adobe-commerce/elsie/components';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface PlaceOrderProps extends HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n onClick: (event: Event) => Promise<void>;\n}\n\nconst PlaceOrderComponent: FunctionComponent<PlaceOrderProps> = ({\n children,\n className,\n disabled = false,\n onClick,\n}) => {\n return (\n <div className={classes(['checkout-place-order', className])}>\n <Button\n key=\"placeOrder\"\n className=\"checkout-place-order__button\"\n data-testid=\"place-order-button\"\n disabled={disabled}\n size=\"medium\"\n type=\"submit\"\n variant=\"primary\"\n onClick={onClick}\n >\n {children}\n </Button>\n </div>\n );\n};\n\nexport const PlaceOrder = WithConditionals(\n PlaceOrderComponent,\n PlaceOrderSkeleton\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 { UnexpectedError } from '@/checkout/api';\nimport { PlaceOrder as PlaceOrderComponent } from '@/checkout/components/PlaceOrder/PlaceOrder';\nimport { Cart } from '@/checkout/data/models/cart';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasPendingCartUpdates,\n state,\n} from '@/checkout/lib';\nimport { serverErrorSignal } from '@/checkout/signals';\nimport { Item as ItemModel } from '@/checkout/types/cart';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot, SlotProps } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\nexport interface ContentSlotContext {\n code: string;\n}\n\nexport interface HandlePlaceOrderContext {\n code: string;\n cartId: string;\n}\n\nexport interface PlaceOrderProps extends HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n active?: boolean;\n handleValidation?: () => boolean;\n handlePlaceOrder: (ctx: HandlePlaceOrderContext) => Promise<void>;\n slots?: {\n Content?: SlotProps<ContentSlotContext>;\n };\n}\n\nexport const PlaceOrder: Container<PlaceOrderProps> = ({\n disabled: disabledViaProp = false,\n active = true,\n handleValidation,\n handlePlaceOrder,\n slots,\n ...props\n}) => {\n const [isInitialized, setIsInitialized] = useState(false);\n const [hasOutOfStockItems, setHasOutOfStockItems] = useState(false);\n\n const hasPendingUpdates = hasPendingCartUpdates.value;\n\n const translations = useText({\n CheckoutUnexpectedError: 'Checkout.ServerError.unexpected',\n placeOrderButton: 'Checkout.PlaceOrder.button',\n });\n\n const handlePlaceOrderError = useCallback(\n (error: any) => {\n serverErrorSignal.value =\n error instanceof TypeError || error instanceof UnexpectedError\n ? translations.CheckoutUnexpectedError\n : error.message;\n },\n [translations]\n );\n\n const handleClick = useCallback(async () => {\n try {\n if (handleValidation && !handleValidation()) return;\n\n await handlePlaceOrder({\n cartId: state.cartId!,\n code: getValue('selectedPaymentMethod')?.code ?? '',\n });\n } catch (error: any) {\n handlePlaceOrderError(error);\n }\n }, [handleValidation, handlePlaceOrder, handlePlaceOrderError]);\n\n const handleCheckoutData = useCallback((data: Cart | null) => {\n const isEmptyCart = !data || data.isEmpty;\n\n if (isEmptyCart) {\n setHasOutOfStockItems(false);\n }\n }, []);\n\n useEffect(() => {\n if (active === false) return;\n\n const onCartData = events.on(\n 'cart/initialized',\n (data) => {\n const items = (data?.items || []) as ItemModel[];\n setHasOutOfStockItems(\n items.some((item) => item.outOfStock || item.insufficientQuantity)\n );\n },\n { eager: true }\n );\n\n return () => {\n onCartData?.off();\n };\n }, [active]);\n\n useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\n setIsInitialized(true);\n handleCheckoutData(pastUpdate);\n return;\n }\n\n const onCheckoutInit = events.on(\n 'checkout/initialized',\n (data) => {\n setIsInitialized(true);\n handleCheckoutData(data);\n },\n { eager: true }\n );\n\n return () => {\n onCheckoutInit?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n (data) => {\n handleCheckoutData(data);\n },\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n return (\n <PlaceOrderComponent\n {...props}\n disabled={disabledViaProp || hasOutOfStockItems || hasPendingUpdates}\n initialized={isInitialized}\n visible={active}\n onClick={handleClick}\n >\n <Slot\n context={{ code: getValue('selectedPaymentMethod')?.code ?? '' }}\n name=\"Content\"\n slot={slots?.Content}\n >\n {translations.placeOrderButton}\n </Slot>\n </PlaceOrderComponent>\n );\n};\n"],"names":["PlaceOrderSkeleton","jsxs","Skeleton","jsx","SkeletonRow","PlaceOrderComponent","children","className","disabled","onClick","classes","Button","PlaceOrder","WithConditionals","disabledViaProp","active","handleValidation","handlePlaceOrder","slots","props","isInitialized","setIsInitialized","useState","hasOutOfStockItems","setHasOutOfStockItems","hasPendingUpdates","hasPendingCartUpdates","translations","useText","handlePlaceOrderError","useCallback","error","serverErrorSignal","UnexpectedError","handleClick","state","_a","getValue","handleCheckoutData","data","useEffect","onCartData","events","items","item","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","onCheckoutUpdated","Slot"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
import{jsx as t,jsxs as l}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{IllustratedMessage as p,Icon as f,Button as d}from"@dropins/tools/components.js";import"../chunks/TermsAndConditions.js";import{classes as a}from"@dropins/tools/lib.js";/* empty css */import"../chunks/errors.js";import"@dropins/tools/event-bus.js";import{s as h}from"../chunks/dom.js";import"@dropins/tools/preact-compat.js";/* empty css */import{S as v}from"../chunks/OrderError.js";import{useText as k}from"@dropins/tools/i18n.js";/* empty css */import{useRef as g,useEffect as m}from"@dropins/tools/preact-hooks.js";import{s as n}from"../chunks/ServerErrorSignal.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";const C=({className:i,contactSupport:o,errorMessage:e,onClick:c,errorMessageRef:s})=>{const r=k({Title:"Checkout.ServerError.title",Message:"Checkout.ServerError.message",ContactSupport:"Checkout.ServerError.contactSupport",Button:"Checkout.ServerError.button"}),u=e!==""?e:r.Title;return t(p,{action:t(d,{className:a(["checkout-server-error__button"]),name:"server-error-button",onClick:c,children:r.Button}),"aria-describedby":"checkout-server-error__message","aria-invalid":"true","aria-live":"polite",className:a(["checkout-server-error",i]),"data-testid":"checkout-server-error",heading:u,icon:t(f,{className:a(["checkout-server-error__icon"]),source:v}),message:l("p",{ref:s,"data-testid":"checkout-server-error-message",id:a(["checkout-server-error__message"]),children:[r.Message,t("br",{}),t("span",{children:o??r.ContactSupport})]})})},F=({active:i=!0,onRetry:o,onServerError:e,autoScroll:c=!1})=>{const s=g(null),r=n.value,u=async()=>{o==null||o(),n.value=void 0};return m(()=>{r&&(e==null||e(r))},[r,e]),m(()=>{!c||!r||!s.current||h(s.current)},[r,c]),!i||!r?null:t(C,{errorMessage:r,errorMessageRef:s,onClick:u})};export{F as ServerError,F as default};
|
|
4
|
+
//# sourceMappingURL=ServerError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerError.js","sources":["/@dropins/storefront-checkout/src/components/ServerError/ServerError.tsx","/@dropins/storefront-checkout/src/containers/ServerError/ServerError.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 '@/checkout/components/ServerError/ServerError.css';\nimport {\n Button,\n Icon,\n IllustratedMessage,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { OrderError } from '@adobe-commerce/elsie/icons';\nimport { classes } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, RefObject } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface ServerErrorProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'icon'> {\n errorMessageRef?: RefObject<HTMLParagraphElement>;\n errorMessage: string;\n contactSupport?: string;\n onClick?: (e: any) => void;\n}\n\nexport const ServerError: FunctionComponent<ServerErrorProps> = ({\n className,\n contactSupport,\n errorMessage,\n onClick,\n errorMessageRef,\n}) => {\n const translations = useText({\n Title: 'Checkout.ServerError.title',\n Message: 'Checkout.ServerError.message',\n ContactSupport: 'Checkout.ServerError.contactSupport',\n Button: 'Checkout.ServerError.button',\n });\n\n const heading = errorMessage !== '' ? errorMessage : translations.Title;\n\n return (\n <IllustratedMessage\n action={\n <Button\n className={classes(['checkout-server-error__button'])}\n name=\"server-error-button\"\n onClick={onClick}\n >\n {translations.Button}\n </Button>\n }\n aria-describedby=\"checkout-server-error__message\"\n aria-invalid=\"true\"\n aria-live=\"polite\"\n className={classes(['checkout-server-error', className])}\n data-testid=\"checkout-server-error\"\n heading={heading}\n icon={\n <Icon\n className={classes(['checkout-server-error__icon'])}\n source={OrderError}\n />\n }\n message={\n <p\n ref={errorMessageRef}\n data-testid=\"checkout-server-error-message\"\n id={classes(['checkout-server-error__message'])}\n >\n {translations.Message}\n <br />\n <span>{contactSupport ?? translations.ContactSupport}</span>\n </p>\n }\n />\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 { ServerError as ServerErrorComponent } from '@/checkout/components';\nimport { scrollToElement } from '@/checkout/lib';\nimport { serverErrorSignal } from '@/checkout/signals/ServerErrorSignal';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface ServerErrorProps {\n autoScroll?: boolean;\n onRetry?: () => void;\n onServerError?: (error: string) => void;\n active?: boolean;\n}\n\nexport const ServerError: Container<ServerErrorProps> = ({\n active = true,\n onRetry,\n onServerError,\n autoScroll = false,\n}) => {\n const errorMessageRef = useRef<HTMLParagraphElement>(null);\n const errorMessage = serverErrorSignal.value;\n\n const handleClick = async () => {\n onRetry?.();\n serverErrorSignal.value = undefined;\n };\n\n useEffect(() => {\n if (!errorMessage) return;\n onServerError?.(errorMessage);\n }, [errorMessage, onServerError]);\n\n useEffect(() => {\n if (!autoScroll || !errorMessage || !errorMessageRef.current) return;\n scrollToElement(errorMessageRef.current);\n }, [errorMessage, autoScroll]);\n\n if (!active || !errorMessage) return null;\n\n return (\n <ServerErrorComponent\n errorMessage={errorMessage}\n errorMessageRef={errorMessageRef}\n onClick={handleClick}\n />\n );\n};\n"],"names":["ServerError","className","contactSupport","errorMessage","onClick","errorMessageRef","translations","useText","heading","jsx","IllustratedMessage","Button","classes","Icon","OrderError","jsxs","active","onRetry","onServerError","autoScroll","useRef","serverErrorSignal","handleClick","useEffect","scrollToElement","ServerErrorComponent"],"mappings":"uzBAqCO,MAAMA,EAAmD,CAAC,CAC/D,UAAAC,EACA,eAAAC,EACA,aAAAC,EACA,QAAAC,EACA,gBAAAC,CACF,IAAM,CACJ,MAAMC,EAAeC,EAAQ,CAC3B,MAAO,6BACP,QAAS,+BACT,eAAgB,sCAChB,OAAQ,6BAAA,CACT,EAEKC,EAAUL,IAAiB,GAAKA,EAAeG,EAAa,MAGhE,OAAAG,EAACC,EAAA,CACC,OACED,EAACE,EAAA,CACC,UAAWC,EAAQ,CAAC,+BAA+B,CAAC,EACpD,KAAK,sBACL,QAAAR,EAEC,SAAaE,EAAA,MAAA,CAChB,EAEF,mBAAiB,iCACjB,eAAa,OACb,YAAU,SACV,UAAWM,EAAQ,CAAC,wBAAyBX,CAAS,CAAC,EACvD,cAAY,wBACZ,QAAAO,EACA,KACEC,EAACI,EAAA,CACC,UAAWD,EAAQ,CAAC,6BAA6B,CAAC,EAClD,OAAQE,CAAA,CACV,EAEF,QACEC,EAAC,IAAA,CACC,IAAKV,EACL,cAAY,gCACZ,GAAIO,EAAQ,CAAC,gCAAgC,CAAC,EAE7C,SAAA,CAAaN,EAAA,UACb,KAAG,EAAA,EACHG,EAAA,OAAA,CAAM,SAAkBP,GAAAI,EAAa,cAAe,CAAA,CAAA,CAAA,CAAA,CACvD,CAEJ,CAEJ,EC3DaN,EAA2C,CAAC,CACvD,OAAAgB,EAAS,GACT,QAAAC,EACA,cAAAC,EACA,WAAAC,EAAa,EACf,IAAM,CACE,MAAAd,EAAkBe,EAA6B,IAAI,EACnDjB,EAAekB,EAAkB,MAEjCC,EAAc,SAAY,CACpBL,GAAA,MAAAA,IACVI,EAAkB,MAAQ,MAC5B,EAYA,OAVAE,EAAU,IAAM,CACTpB,IACLe,GAAA,MAAAA,EAAgBf,GAAY,EAC3B,CAACA,EAAce,CAAa,CAAC,EAEhCK,EAAU,IAAM,CACV,CAACJ,GAAc,CAAChB,GAAgB,CAACE,EAAgB,SACrDmB,EAAgBnB,EAAgB,OAAO,CAAA,EACtC,CAACF,EAAcgB,CAAU,CAAC,EAEzB,CAACH,GAAU,CAACb,EAAqB,KAGnCM,EAACgB,EAAA,CACC,aAAAtB,EACA,gBAAAE,EACA,QAASiB,CAAA,CACX,CAEJ"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsxs as
|
|
3
|
+
import{jsxs as H,jsx as n,Fragment as q}from"@dropins/tools/preact-jsx-runtime.js";import{h as ee,a as te}from"../chunks/errors.js";import{classes as x,VComponent as ne,Slot as re}from"@dropins/tools/lib.js";import{s as oe,t as ie}from"../chunks/setShippingMethods.js";import{events as W}from"@dropins/tools/event-bus.js";import{W as se,h as z,g as ce}from"../chunks/ConditionalWrapper.js";import{n as ae,g as A}from"../chunks/values.js";/* empty css */import{Skeleton as le,SkeletonRow as B,IllustratedMessage as ue,Icon as pe,InLineAlert as de,RadioButton as he,Price as F,ToggleButton as me}from"@dropins/tools/components.js";import{s as fe}from"../chunks/dom.js";import{useRef as ge,useEffect as T,useState as w,useCallback as k,useMemo as ke}from"@dropins/tools/preact-hooks.js";import*as a from"@dropins/tools/preact-compat.js";import{useText as $}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/synchronizeCheckout.js";import"../fragments.js";const ve=i=>a.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...i},a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M2.47266 4.90002H15.1851V10.9645H21.2495L23 12.715V17.6124H20.073",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M15.1758 5.87573H19.0019L21.0394 10.7636",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M9.76151 16.7898C9.76151 18.0525 8.72845 19.076 7.46582 19.076C6.20318 19.076 5.17969 18.0429 5.17969 16.7803C5.17969 15.5176 6.20318 14.4941 7.46582 14.4941C8.72845 14.4941 9.75195 15.5176 9.76151 16.7803C9.76151 16.7803 9.76151 16.7803 9.76151 16.7898Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M19.8726 16.7898C19.8726 18.062 18.8491 19.0855 17.5769 19.0855C16.3047 19.0855 15.2812 18.062 15.2812 16.7898C15.2812 15.5176 16.3047 14.4941 17.5769 14.4941C18.8491 14.4941 19.8726 15.5176 19.8726 16.7898Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M8.08792 7.63574H1.69824",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M7.11229 10.3619H1",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M5.16084 13.0402H1.92773",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M9.76172 16.7611H15.2809",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),a.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M2.38672 16.7611H5.17025",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"})),Ee=()=>H(le,{"data-testid":"shipping-methods-skeleton",children:[n(B,{size:"small",variant:"heading"}),n(B,{size:"small",variant:"empty"}),n(B,{fullWidth:!0,size:"medium"}),n(B,{fullWidth:!0,size:"medium"})]}),Se=({className:i,busy:t=!1,onSelectionChange:u=()=>{},options:v,selection:d,title:l,UIComponentType:p="RadioButton",error:h=null,onDismissError:V=()=>{},...R})=>{const E=$({EmptyState:"Checkout.ShippingMethods.emptyState"}),S=h!==null,C=ge(null);T(()=>{S&&C.current&&fe(C.current)},[S]);const j=(r,P)=>{const M={busy:t,className:"checkout-shipping-methods__method",key:r.value,name:"shipping-method",value:r.value,onChange:()=>u(r)};return P==="RadioButton"?n(he,{...M,checked:(d==null?void 0:d.value)===r.value,"data-testid":"shipping-method-radioButton",description:r.title,disabled:t,id:r.value,label:H(q,{children:[n(F,{amount:r.amount.value,currency:r.amount.currency})," ",n("span",{children:r.carrier.title})]})}):n(me,{...M,"data-testid":"shipping-method-toggleButton",label:H(q,{children:[n("span",{children:r.carrier.title}),n(F,{amount:r.amount.value,currency:r.amount.currency})]}),selected:(d==null?void 0:d.value)===r.value})};return H("div",{...R,className:x(["checkout-shipping-methods",i]),"data-testid":"checkout-shipping-methods",children:[l&&n(ne,{className:"checkout-shipping-methods__title",node:l}),n("div",{className:x(["checkout-shipping-methods__content"]),children:n("div",{className:x(["checkout-shipping-methods__options",["checkout-shipping-methods__options--busy",t],["checkout-shipping-methods__options--toggleButton",p==="ToggleButton"]]),"data-testid":"checkout-shipping-methods-options",children:v.length===0?n(ue,{"data-testid":"checkout-shipping-methods-empty",icon:n(pe,{source:ve}),message:n("p",{children:E.EmptyState})}):v.map(r=>j(r,p))})}),S&&n("div",{ref:C,className:"checkout-shipping-methods__error","data-testid":"checkout-shipping-methods-alert",children:n(de,{heading:h,type:"error",variant:"primary",onDismiss:V})})]})},Ce=se(Se,Ee);function Me(i,t){return i?t.some(u=>D(u,i)):!1}function D(i,t){return!i||!t||i.amount.value!==t.amount.value?!1:i.code===t.code&&i.carrier.code===t.carrier.code}function Le(i){const t=W.lastPayload("shipping/estimate");t&&W.emit("shipping/estimate",{...t,shippingMethod:ie(i)})}const Ie=({UIComponentType:i="RadioButton",active:t=!0,autoSync:u=!0,displayTitle:v=!0,initialData:d,slots:l,onCartSyncError:p,onSelectionChange:h,...V})=>{const[R,E]=w(null),[S,C]=w(!1),[j,r]=w(),[P,M]=w(null),G=ee.value,J=te.value,{cartSyncError:I,defaultTitle:N}=$({cartSyncError:"Checkout.ShippingMethods.cartSyncError",defaultTitle:"Checkout.ShippingMethods.title"}),K=k(()=>{E(null)},[]),c=k(e=>{E(null),M(o=>D(o,e)?o:(ae({selectedShippingMethod:e}),e))},[]),L=k(async(e,o)=>{if(!u||!z())return;const s={method_code:e.code,carrier_code:e.carrier.code};oe([s]).catch(m=>{c(o??null),p==null||p({method:e,error:m}),p||E(I)})},[u,c,p,I]),Q=k(async e=>{const o=A("selectedShippingMethod");c(e),h==null||h(e),z()||Le(e),await L(e,o)},[h,c,L]),_=k(e=>{var O;const o=!e||e.isEmpty,s=!!(e!=null&&e.isVirtual);if(o||s){C(s),c(null),r([]);return}const m=(O=e.shippingAddresses)==null?void 0:O[0];if(!m)return;const f=m.availableShippingMethods??[];if(r(f),f.length===0){c(null);return}const y=m.selectedShippingMethod??null,g=A("selectedShippingMethod"),U=Me(g,f),Y=D(g,y);if(g&&U&&!Y){L(g,y);return}if((!g||!U)&&y){c(y);return}if((!g||!U)&&!y){const Z=f[0];c(Z),u&&L(Z)}},[L,c,u]),b=k(e=>{if(e===void 0)return;const{shippingMethod:o,availableShippingMethods:s}=e,m=(s==null?void 0:s.find(f=>f.code===(o==null?void 0:o.methodCode)&&f.carrier.code===(o==null?void 0:o.carrierCode)))??null;r(s),c(m)},[c]);T(()=>{if(!t)return;const e=ce();if(e){const s=A("selectedShippingMethod");s&&M(s),_(e);return}const o=W.on("checkout/initialized",_,{eager:!0});return()=>{o==null||o.off()}},[t,_]),T(()=>{if(!t)return;const e=W.on("checkout/updated",_,{eager:!1});return()=>{e==null||e.off()}},[t,_]),T(()=>{if(!t||z())return;const e=W.on("shipping/estimate",b,{eager:!0});return()=>{e==null||e.off()}},[t,b]);const X=ke(()=>{if(v)return n(re,{name:"checkout-shipping-methods-title",slot:l==null?void 0:l.Title,children:n("h3",{children:N})})},[v,l==null?void 0:l.Title,N]);return n(Ce,{...V,UIComponentType:i,busy:G||J,error:R,initialized:j!==void 0,options:j??[],selection:P,title:X,visible:t&&!S,onDismissError:K,onSelectionChange:Q})};export{Ie as ShippingMethods,Ie as default,Le as emitShippingEstimateEvent};
|
|
4
|
+
//# sourceMappingURL=ShippingMethods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShippingMethods.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Delivery.svg","/@dropins/storefront-checkout/src/components/ShippingMethods/ShippingMethodsSkeleton.tsx","/@dropins/storefront-checkout/src/components/ShippingMethods/ShippingMethods.tsx","/@dropins/storefront-checkout/src/containers/ShippingMethods/ShippingMethods.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgDelivery = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M2.47266 4.90002H15.1851V10.9645H21.2495L23 12.715V17.6124H20.073\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M15.1758 5.87573H19.0019L21.0394 10.7636\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M9.76151 16.7898C9.76151 18.0525 8.72845 19.076 7.46582 19.076C6.20318 19.076 5.17969 18.0429 5.17969 16.7803C5.17969 15.5176 6.20318 14.4941 7.46582 14.4941C8.72845 14.4941 9.75195 15.5176 9.76151 16.7803C9.76151 16.7803 9.76151 16.7803 9.76151 16.7898Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M19.8726 16.7898C19.8726 18.062 18.8491 19.0855 17.5769 19.0855C16.3047 19.0855 15.2812 18.062 15.2812 16.7898C15.2812 15.5176 16.3047 14.4941 17.5769 14.4941C18.8491 14.4941 19.8726 15.5176 19.8726 16.7898Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M8.08792 7.63574H1.69824\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M7.11229 10.3619H1\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M5.16084 13.0402H1.92773\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M9.76172 16.7611H15.2809\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M2.38672 16.7611H5.17025\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgDelivery;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { FunctionComponent } from 'preact';\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\n\nexport const ShippingMethodsSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"shipping-methods-skeleton\">\n <SkeletonRow size=\"small\" variant=\"heading\" />\n <SkeletonRow size=\"small\" variant=\"empty\" />\n <SkeletonRow fullWidth={true} size=\"medium\" />\n <SkeletonRow fullWidth={true} size=\"medium\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport '@/checkout/components/ShippingMethods/ShippingMethods.css';\nimport { ShippingMethodsSkeleton } from '@/checkout/components/ShippingMethods/ShippingMethodsSkeleton';\nimport { ShippingMethod } from '@/checkout/data/models';\nimport { scrollToElement } from '@/checkout/lib';\nimport { UIComponentType } from '@/checkout/types/ComponentTypes';\nimport {\n Icon,\n IllustratedMessage,\n InLineAlert,\n Price,\n RadioButton,\n ToggleButton,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Delivery } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface ShippingMethodsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n UIComponentType?: UIComponentType;\n busy?: boolean;\n error?: string | null;\n onDismissError?: () => void;\n onSelectionChange?: (method: ShippingMethod) => void;\n options: ShippingMethod[];\n selection: ShippingMethod | null;\n title?: VNode;\n}\n\nconst ShippingMethodsComponent: FunctionComponent<ShippingMethodsProps> = ({\n className,\n busy = false,\n onSelectionChange = () => {},\n options,\n selection,\n title,\n UIComponentType = 'RadioButton',\n error = null,\n onDismissError = () => {},\n ...props\n}) => {\n const translations = useText({\n EmptyState: 'Checkout.ShippingMethods.emptyState',\n });\n\n const hasError = error !== null;\n const errorRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (hasError && errorRef.current) {\n scrollToElement(errorRef.current);\n }\n }, [hasError]);\n\n const renderShippingMethod = (\n method: ShippingMethod,\n type: UIComponentType\n ) => {\n const commonProps = {\n busy,\n className: 'checkout-shipping-methods__method',\n key: method.value,\n name: 'shipping-method',\n value: method.value,\n onChange: () => onSelectionChange(method),\n };\n\n if (type === 'RadioButton') {\n return (\n <RadioButton\n {...commonProps}\n checked={selection?.value === method.value}\n data-testid=\"shipping-method-radioButton\"\n description={method.title}\n disabled={busy}\n id={method.value}\n label={\n <>\n <Price\n amount={method.amount.value}\n currency={method.amount.currency}\n />\n \n <span>{method.carrier.title}</span>\n </>\n }\n />\n );\n }\n\n return (\n <ToggleButton\n {...commonProps}\n data-testid=\"shipping-method-toggleButton\"\n label={\n <>\n <span>{method.carrier.title}</span>\n <Price\n amount={method.amount.value}\n currency={method.amount.currency}\n />\n </>\n }\n selected={selection?.value === method.value}\n />\n );\n };\n\n return (\n <div\n {...props}\n className={classes(['checkout-shipping-methods', className])}\n data-testid=\"checkout-shipping-methods\"\n >\n {title && (\n <VComponent className=\"checkout-shipping-methods__title\" node={title} />\n )}\n\n <div className={classes(['checkout-shipping-methods__content'])}>\n <div\n className={classes([\n 'checkout-shipping-methods__options',\n ['checkout-shipping-methods__options--busy', busy],\n [\n 'checkout-shipping-methods__options--toggleButton',\n UIComponentType === 'ToggleButton',\n ],\n ])}\n data-testid=\"checkout-shipping-methods-options\"\n >\n {options.length === 0 ? (\n <IllustratedMessage\n data-testid=\"checkout-shipping-methods-empty\"\n icon={<Icon source={Delivery} />}\n message={<p>{translations.EmptyState}</p>}\n />\n ) : (\n options.map((method: ShippingMethod) =>\n renderShippingMethod(method, UIComponentType)\n )\n )}\n </div>\n </div>\n\n {hasError && (\n <div\n ref={errorRef}\n className=\"checkout-shipping-methods__error\"\n data-testid=\"checkout-shipping-methods-alert\"\n >\n <InLineAlert\n heading={error}\n type=\"error\"\n variant=\"primary\"\n onDismiss={onDismissError}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const ShippingMethods = WithConditionals(\n ShippingMethodsComponent,\n ShippingMethodsSkeleton\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 { setShippingMethodsOnCart as setShippingMethod } from '@/checkout/api';\nimport { ShippingMethods as ShippingMethodsComponent } from '@/checkout/components/ShippingMethods';\nimport { Cart, ShippingEstimate, ShippingMethod } from '@/checkout/data/models';\nimport { transformShippingEstimateShippingMethod } from '@/checkout/data/transforms';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasPendingCartUpdates,\n hasPendingShippingEstimate,\n hasShippingAddress,\n notifyValues,\n} from '@/checkout/lib';\nimport { UIComponentType } from '@/checkout/types/ComponentTypes';\nimport { TitleProps } from '@/checkout/types/TitleProps';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container, Slot } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\n\ninterface CartSyncError {\n method: ShippingMethod;\n error: Error;\n}\n\nexport interface ShippingMethodsProps\n extends HTMLAttributes<HTMLDivElement>,\n TitleProps {\n UIComponentType?: UIComponentType;\n active?: boolean;\n autoSync?: boolean;\n onCartSyncError?: (error: CartSyncError) => void;\n onSelectionChange?: (method: ShippingMethod) => void;\n}\n\nfunction isMethodAvailable(\n method: ShippingMethod | null,\n options: ShippingMethod[]\n) {\n if (!method) return false;\n return options.some((option) => isEqual(option, method));\n}\n\nfunction isEqual(a: ShippingMethod | null, b: ShippingMethod | null) {\n if (!a || !b) return false;\n if (a.amount.value !== b.amount.value) return false;\n return a.code === b.code && a.carrier.code === b.carrier.code;\n}\n\nexport function emitShippingEstimateEvent(selection: ShippingMethod) {\n const shippingEstimatedEvent = events.lastPayload('shipping/estimate');\n\n if (!shippingEstimatedEvent) return;\n\n events.emit('shipping/estimate', {\n ...shippingEstimatedEvent,\n shippingMethod: transformShippingEstimateShippingMethod(selection),\n });\n}\n\nexport const ShippingMethods: Container<ShippingMethodsProps> = ({\n UIComponentType = 'RadioButton',\n active = true,\n autoSync = true,\n displayTitle = true,\n initialData,\n slots,\n onCartSyncError,\n onSelectionChange,\n ...props\n}) => {\n const [error, setError] = useState<string | null>(null);\n const [isVirtual, setIsVirtual] = useState(false);\n const [options, setOptions] = useState<ShippingMethod[] | undefined>();\n const [selection, setSelection] = useState<ShippingMethod | null>(null);\n\n const hasPendingUpdates = hasPendingCartUpdates.value;\n const hasPendingEstimations = hasPendingShippingEstimate.value;\n\n const { cartSyncError, defaultTitle } = useText({\n cartSyncError: 'Checkout.ShippingMethods.cartSyncError',\n defaultTitle: 'Checkout.ShippingMethods.title',\n });\n\n const handleDismissError = useCallback(() => {\n setError(null);\n }, []);\n\n const setUserSelection = useCallback(\n (shippingMethod: ShippingMethod | null) => {\n setError(null);\n setSelection((prev) => {\n if (isEqual(prev, shippingMethod)) return prev;\n notifyValues({ selectedShippingMethod: shippingMethod });\n return shippingMethod;\n });\n },\n []\n );\n\n const setUserSelectionOnCart = useCallback(\n async (selection: ShippingMethod, fallback?: ShippingMethod | null) => {\n if (!autoSync || !hasShippingAddress()) return;\n\n const shippingMethodInput = {\n method_code: selection.code,\n carrier_code: selection.carrier.code,\n };\n\n setShippingMethod([shippingMethodInput]).catch((error) => {\n setUserSelection(fallback ?? null);\n onCartSyncError?.({ method: selection, error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [autoSync, setUserSelection, onCartSyncError, cartSyncError]\n );\n\n const handleSelectionChange = useCallback(\n async (selection: ShippingMethod) => {\n const prevSelection = getValue('selectedShippingMethod');\n\n setUserSelection(selection);\n onSelectionChange?.(selection);\n\n if (!hasShippingAddress()) {\n emitShippingEstimateEvent(selection);\n }\n\n await setUserSelectionOnCart(selection, prevSelection);\n },\n [onSelectionChange, setUserSelection, setUserSelectionOnCart]\n );\n\n const handleCheckoutData = useCallback(\n (data: Cart | null) => {\n const isEmptyCart = !data || data.isEmpty;\n const isVirtualCart = Boolean(data?.isVirtual);\n\n if (isEmptyCart || isVirtualCart) {\n setIsVirtual(isVirtualCart);\n setUserSelection(null);\n setOptions([]);\n return;\n }\n\n const primaryAddress = data!.shippingAddresses?.[0];\n\n // If there is no primary address, options are handled by the shipping estimation\n if (!primaryAddress) return;\n\n const availableOptions = primaryAddress.availableShippingMethods ?? [];\n setOptions(availableOptions);\n\n // If there are no available options, reset the user selection\n if (availableOptions.length === 0) {\n setUserSelection(null);\n return;\n }\n\n const cartSelection = primaryAddress.selectedShippingMethod ?? null;\n\n const userSelection = getValue('selectedShippingMethod');\n const isAvailable = isMethodAvailable(userSelection, availableOptions);\n const haveSameSelection = isEqual(userSelection, cartSelection);\n\n // Handle user selection that's available but different from cart\n if (userSelection && isAvailable && !haveSameSelection) {\n setUserSelectionOnCart(userSelection, cartSelection);\n return;\n }\n\n // If no user selection or not available, decide what to do based on cart and available options\n if ((!userSelection || !isAvailable) && cartSelection) {\n setUserSelection(cartSelection);\n return;\n }\n\n if ((!userSelection || !isAvailable) && !cartSelection) {\n const newSelection = availableOptions[0];\n setUserSelection(newSelection);\n\n // Only sync to cart if autoSync is enabled\n if (autoSync) {\n setUserSelectionOnCart(newSelection);\n }\n }\n },\n [setUserSelectionOnCart, setUserSelection, autoSync]\n );\n\n const handleShippingEstimate = useCallback(\n (estimation: ShippingEstimate | undefined) => {\n if (estimation === undefined) return;\n\n const { shippingMethod, availableShippingMethods } = estimation;\n const selectedShippingMethod =\n availableShippingMethods?.find(\n (method) =>\n method.code === shippingMethod?.methodCode &&\n method.carrier.code === shippingMethod?.carrierCode\n ) ?? null;\n\n setOptions(availableShippingMethods);\n setUserSelection(selectedShippingMethod);\n },\n [setUserSelection]\n );\n\n useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\n // When component becomes active, restore key state so handleCheckoutData can work properly\n const userSelection = getValue('selectedShippingMethod');\n if (userSelection) {\n setSelection(userSelection);\n }\n\n handleCheckoutData(pastUpdate);\n return;\n }\n\n const onCheckoutInit = events.on(\n 'checkout/initialized',\n handleCheckoutData,\n { eager: true }\n );\n\n return () => {\n onCheckoutInit?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n handleCheckoutData,\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n if (!active || hasShippingAddress()) return;\n\n const onShippingEstimate = events.on(\n 'shipping/estimate',\n handleShippingEstimate,\n { eager: true }\n );\n\n return () => {\n onShippingEstimate?.off();\n };\n }, [active, handleShippingEstimate]);\n\n const titleContent = useMemo(() => {\n if (!displayTitle) return undefined;\n\n return (\n <Slot name=\"checkout-shipping-methods-title\" slot={slots?.Title}>\n <h3>{defaultTitle}</h3>\n </Slot>\n );\n }, [displayTitle, slots?.Title, defaultTitle]);\n\n return (\n <ShippingMethodsComponent\n {...props}\n UIComponentType={UIComponentType}\n busy={hasPendingUpdates || hasPendingEstimations}\n error={error}\n initialized={options !== undefined}\n options={options ?? []}\n selection={selection}\n title={titleContent}\n visible={active && !isVirtual}\n onDismissError={handleDismissError}\n onSelectionChange={handleSelectionChange}\n />\n );\n};\n"],"names":["SvgDelivery","props","React","ShippingMethodsSkeleton","jsxs","Skeleton","jsx","SkeletonRow","ShippingMethodsComponent","className","busy","onSelectionChange","options","selection","title","UIComponentType","error","onDismissError","translations","useText","hasError","errorRef","useRef","useEffect","scrollToElement","renderShippingMethod","method","type","commonProps","RadioButton","Fragment","Price","ToggleButton","classes","VComponent","IllustratedMessage","Icon","Delivery","InLineAlert","ShippingMethods","WithConditionals","isMethodAvailable","option","isEqual","a","b","emitShippingEstimateEvent","shippingEstimatedEvent","events","transformShippingEstimateShippingMethod","active","autoSync","displayTitle","initialData","slots","onCartSyncError","setError","useState","isVirtual","setIsVirtual","setOptions","setSelection","hasPendingUpdates","hasPendingCartUpdates","hasPendingEstimations","hasPendingShippingEstimate","cartSyncError","defaultTitle","handleDismissError","useCallback","setUserSelection","shippingMethod","prev","notifyValues","setUserSelectionOnCart","fallback","hasShippingAddress","shippingMethodInput","setShippingMethod","handleSelectionChange","prevSelection","getValue","handleCheckoutData","data","isEmptyCart","isVirtualCart","primaryAddress","_a","availableOptions","cartSelection","userSelection","isAvailable","haveSameSelection","newSelection","handleShippingEstimate","estimation","availableShippingMethods","selectedShippingMethod","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","onCheckoutUpdated","onShippingEstimate","titleContent","useMemo","Slot"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as e,jsxs as M}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{Skeleton as v,SkeletonRow as S,Checkbox as b}from"@dropins/tools/components.js";import{p as N}from"../chunks/TermsAndConditions.js";import{classes as f,VComponent as U,Slot as w}from"@dropins/tools/lib.js";/* empty css */import{s as E}from"../chunks/errors.js";import{A as V}from"../chunks/checkout.js";import{events as W}from"@dropins/tools/event-bus.js";import{g as
|
|
3
|
+
import{jsx as e,jsxs as M}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{Skeleton as v,SkeletonRow as S,Checkbox as b}from"@dropins/tools/components.js";import{p as N}from"../chunks/TermsAndConditions.js";import{classes as f,VComponent as U,Slot as w}from"@dropins/tools/lib.js";/* empty css */import{s as E}from"../chunks/errors.js";import{A as V}from"../chunks/checkout.js";import{events as W}from"@dropins/tools/event-bus.js";import{W as j,g as y}from"../chunks/ConditionalWrapper.js";import"@dropins/tools/preact-compat.js";/* empty css *//* empty css */import{useState as g,useEffect as D}from"@dropins/tools/preact-hooks.js";import{useText as H,MarkupText as L}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";const P=({html:n})=>{const t=N.sanitize(n,{ADD_ATTR:["target"]});return t===""?null:e("span",{dangerouslySetInnerHTML:{__html:t}})},R=()=>e(v,{className:"checkout-terms-and-conditions-skeleton","data-testid":"checkout-terms-and-conditions-skeleton",children:e(S,{fullWidth:!0,size:"small",variant:"row"})}),$=({className:n,agreements:t,error:r,...s})=>e("div",{className:"checkout-terms-and-conditions","data-testid":"checkout-terms-and-conditions",children:M("form",{...s,noValidate:!0,className:f(["checkout-terms-and-conditions__form",n]),"data-testid":"checkout-terms-and-conditions-form",name:"checkout-terms-and-conditions__form",children:[t&&e(U,{className:f(["checkout-terms-and-conditions__agreements"]),"data-testid":"checkout-terms-and-conditions-agreements",node:t}),r&&e("div",{className:"checkout-terms-and-conditions__error","data-testid":"checkout-terms-and-conditions-error",children:r})]})}),q=j($,R),ae=({active:n=!0,slots:t,...r})=>{var c;const[s,d]=g(!1),[k,m]=g(""),{errorMessage:_}=H({errorMessage:"Checkout.TermsAndConditions.error"}),i=((c=E.config)==null?void 0:c.agreementsEnabled)===!1,A=()=>{m("")},C=()=>{m(_)};return D(()=>{if(!n||i)return;if(y()){d(!0);return}const o=W.on("checkout/initialized",()=>{d(!0)},{eager:!0});return()=>{o==null||o.off()}},[n,i]),e(q,{...r,agreements:e(w,{context:{appendAgreement(l){this._registerMethod((...o)=>{const u=l(...o);if(!u)return;const{mode:T,name:p,text:a,translationId:h}=u;if(!a&&!h){console.warn(`The agreement ${p} is misconfigured. Please provide a text or a translationId.`);return}const x=a?e(P,{html:a}):e(L,{id:h}),z=e(b,{checked:T===V.AUTO,label:x,name:p,required:!0,onChange:A,onInvalid:C});this._setProps(I=>({children:[...I.children||[],z]}))})}},name:"Agreements",slot:t==null?void 0:t.Agreements}),error:k,initialized:s,visible:n&&!i})};export{ae as TermsAndConditions,ae as default};
|
|
4
|
+
//# sourceMappingURL=TermsAndConditions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TermsAndConditions.js","sources":["/@dropins/storefront-checkout/src/components/Markup/Markup.tsx","/@dropins/storefront-checkout/src/components/TermsAndConditions/TermsAndConditionsSkeleton.tsx","/@dropins/storefront-checkout/src/components/TermsAndConditions/TermsAndConditions.tsx","/@dropins/storefront-checkout/src/containers/TermsAndConditions/TermsAndConditions.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 DOMPurify from 'dompurify';\nimport { FunctionComponent } from 'preact';\n\ninterface MarkupProps {\n html: string;\n}\n\nexport const Markup: FunctionComponent<MarkupProps> = ({ html }) => {\n const sanitizedHtml = DOMPurify.sanitize(html, { ADD_ATTR: ['target'] });\n if (sanitizedHtml === '') return null;\n // eslint-disable-next-line react/no-danger\n return <span dangerouslySetInnerHTML={{ __html: sanitizedHtml }} />;\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 { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const TermsAndConditionsSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n className=\"checkout-terms-and-conditions-skeleton\"\n data-testid=\"checkout-terms-and-conditions-skeleton\"\n >\n <SkeletonRow fullWidth={true} size=\"small\" variant=\"row\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { WithConditionals } from '@/checkout/components';\nimport '@/checkout/components/TermsAndConditions/TermsAndConditions.css';\nimport { TermsAndConditionsSkeleton } from '@/checkout/components/TermsAndConditions/TermsAndConditionsSkeleton';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface TermsAndConditionsProps\n extends HTMLAttributes<HTMLFormElement> {\n agreements?: VNode;\n error?: string;\n}\n\nconst TermsAndConditionsComponent: FunctionComponent<\n TermsAndConditionsProps\n> = ({ className, agreements, error, ...props }) => {\n return (\n <div\n className=\"checkout-terms-and-conditions\"\n data-testid=\"checkout-terms-and-conditions\"\n >\n <form\n {...props}\n noValidate\n className={classes(['checkout-terms-and-conditions__form', className])}\n data-testid=\"checkout-terms-and-conditions-form\"\n name=\"checkout-terms-and-conditions__form\"\n >\n {agreements && (\n <VComponent\n className={classes(['checkout-terms-and-conditions__agreements'])}\n data-testid=\"checkout-terms-and-conditions-agreements\"\n node={agreements}\n />\n )}\n\n {error && (\n <div\n className=\"checkout-terms-and-conditions__error\"\n data-testid=\"checkout-terms-and-conditions-error\"\n >\n {error}\n </div>\n )}\n </form>\n </div>\n );\n};\n\nexport const TermsAndConditions = WithConditionals(\n TermsAndConditionsComponent,\n TermsAndConditionsSkeleton\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 { Markup } from '@/checkout/components';\nimport { TermsAndConditions as TermsAndConditionsComponent } from '@/checkout/components/TermsAndConditions';\nimport { AgreementMode } from '@/checkout/data/models';\nimport { getLatestCheckoutUpdate, state } from '@/checkout/lib';\nimport { Checkbox } from '@adobe-commerce/elsie/components';\nimport { MarkupText, useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Container,\n Slot,\n SlotMethod,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport interface TermsAndConditionsProps {\n active?: boolean;\n slots?: {\n Agreements?: SlotProps<{\n appendAgreement: SlotMethod<{\n name: string;\n mode: AgreementMode;\n translationId?: string;\n text?: string;\n }>;\n }>;\n };\n}\n\nexport const TermsAndConditions: Container<TermsAndConditionsProps> = ({\n active = true,\n slots,\n ...props\n}) => {\n const [isInitialized, setIsInitialized] = useState(false);\n const [error, setError] = useState<string>('');\n\n const { errorMessage } = useText({\n errorMessage: 'Checkout.TermsAndConditions.error',\n });\n\n const disabledViaConfig = state.config?.agreementsEnabled === false;\n\n const handleChange = () => {\n setError('');\n };\n\n const handleInvalid = () => {\n setError(errorMessage);\n };\n\n useEffect(() => {\n if (!active || disabledViaConfig) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\n setIsInitialized(true);\n return;\n }\n\n const onCheckoutInit = events.on(\n 'checkout/initialized',\n () => {\n setIsInitialized(true);\n },\n { eager: true }\n );\n return () => {\n onCheckoutInit?.off();\n };\n }, [active, disabledViaConfig]);\n\n return (\n <TermsAndConditionsComponent\n {...props}\n agreements={\n <Slot\n context={{\n appendAgreement(callback) {\n this._registerMethod((...attrs) => {\n const _agreement = callback(...attrs);\n\n if (!_agreement) return;\n\n const { mode, name, text, translationId } = _agreement;\n\n if (!text && !translationId) {\n console.warn(\n `The agreement ${name} is misconfigured. Please provide a text or a translationId.`\n );\n return;\n }\n\n const label = text ? (\n <Markup html={text} />\n ) : (\n <MarkupText id={translationId!} />\n );\n\n const agreement = (\n <Checkbox\n checked={mode === AgreementMode.AUTO}\n label={label}\n name={name}\n required={true}\n onChange={handleChange}\n onInvalid={handleInvalid}\n />\n );\n\n this._setProps((prev: any) => ({\n children: [...(prev.children || []), agreement],\n }));\n });\n },\n }}\n name=\"Agreements\"\n slot={slots?.Agreements}\n />\n }\n error={error}\n initialized={isInitialized}\n visible={active && !disabledViaConfig}\n />\n );\n};\n"],"names":["Markup","html","sanitizedHtml","DOMPurify","TermsAndConditionsSkeleton","jsx","Skeleton","SkeletonRow","TermsAndConditionsComponent","className","agreements","error","props","jsxs","classes","VComponent","TermsAndConditions","WithConditionals","active","slots","isInitialized","setIsInitialized","useState","setError","errorMessage","useText","disabledViaConfig","_a","state","handleChange","handleInvalid","useEffect","getLatestCheckoutUpdate","onCheckoutInit","events","Slot","callback","attrs","_agreement","mode","name","text","translationId","label","MarkupText","agreement","Checkbox","AgreementMode","prev"],"mappings":"42BAwBO,MAAMA,EAAyC,CAAC,CAAE,KAAAC,KAAW,CAC5D,MAAAC,EAAgBC,EAAU,SAASF,EAAM,CAAE,SAAU,CAAC,QAAQ,EAAG,EACnE,OAAAC,IAAkB,GAAW,OAEzB,OAAK,CAAA,wBAAyB,CAAE,OAAQA,GAAiB,CACnE,ECTaE,EAAgD,IAEzDC,EAACC,EAAA,CACC,UAAU,yCACV,cAAY,yCAEZ,WAACC,EAAY,CAAA,UAAW,GAAM,KAAK,QAAQ,QAAQ,KAAM,CAAA,CAAA,CAC3D,ECGEC,EAEF,CAAC,CAAE,UAAAC,EAAW,WAAAC,EAAY,MAAAC,EAAO,GAAGC,KAEpCP,EAAC,MAAA,CACC,UAAU,gCACV,cAAY,gCAEZ,SAAAQ,EAAC,OAAA,CACE,GAAGD,EACJ,WAAU,GACV,UAAWE,EAAQ,CAAC,sCAAuCL,CAAS,CAAC,EACrE,cAAY,qCACZ,KAAK,sCAEJ,SAAA,CACCC,GAAAL,EAACU,EAAA,CACC,UAAWD,EAAQ,CAAC,2CAA2C,CAAC,EAChE,cAAY,2CACZ,KAAMJ,CAAA,CACR,EAGDC,GACCN,EAAC,MAAA,CACC,UAAU,uCACV,cAAY,sCAEX,SAAAM,CAAA,CAAA,CACH,CAAA,CAAA,CAEJ,CACF,EAISK,EAAqBC,EAChCT,EACAJ,CACF,ECvBaY,GAAyD,CAAC,CACrE,OAAAE,EAAS,GACT,MAAAC,EACA,GAAGP,CACL,IAAM,OACJ,KAAM,CAACQ,EAAeC,CAAgB,EAAIC,EAAS,EAAK,EAClD,CAACX,EAAOY,CAAQ,EAAID,EAAiB,EAAE,EAEvC,CAAE,aAAAE,CAAa,EAAIC,EAAQ,CAC/B,aAAc,mCAAA,CACf,EAEKC,IAAoBC,EAAAC,EAAM,SAAN,YAAAD,EAAc,qBAAsB,GAExDE,EAAe,IAAM,CACzBN,EAAS,EAAE,CACb,EAEMO,EAAgB,IAAM,CAC1BP,EAASC,CAAY,CACvB,EAEA,OAAAO,EAAU,IAAM,CACV,GAAA,CAACb,GAAUQ,EAAmB,OAIlC,GAFmBM,EAAwB,EAE3B,CACdX,EAAiB,EAAI,EACrB,MAAA,CAGF,MAAMY,EAAiBC,EAAO,GAC5B,uBACA,IAAM,CACJb,EAAiB,EAAI,CACvB,EACA,CAAE,MAAO,EAAK,CAChB,EACA,MAAO,IAAM,CACXY,GAAA,MAAAA,EAAgB,KAClB,CAAA,EACC,CAACf,EAAQQ,CAAiB,CAAC,EAG5BrB,EAACG,EAAA,CACE,GAAGI,EACJ,WACEP,EAAC8B,EAAA,CACC,QAAS,CACP,gBAAgBC,EAAU,CACnB,KAAA,gBAAgB,IAAIC,IAAU,CAC3B,MAAAC,EAAaF,EAAS,GAAGC,CAAK,EAEpC,GAAI,CAACC,EAAY,OAEjB,KAAM,CAAE,KAAAC,EAAM,KAAAC,EAAM,KAAAC,EAAM,cAAAC,CAAkB,EAAAJ,EAExC,GAAA,CAACG,GAAQ,CAACC,EAAe,CACnB,QAAA,KACN,iBAAiBF,CAAI,8DACvB,EACA,MAAA,CAGI,MAAAG,EAAQF,EACZpC,EAACL,EAAO,CAAA,KAAMyC,CAAM,CAAA,EAEpBpC,EAACuC,EAAW,CAAA,GAAIF,CAAgB,CAAA,EAG5BG,EACJxC,EAACyC,EAAA,CACC,QAASP,IAASQ,EAAc,KAChC,MAAAJ,EACA,KAAAH,EACA,SAAU,GACV,SAAUX,EACV,UAAWC,CAAA,CACb,EAGG,KAAA,UAAWkB,IAAe,CAC7B,SAAU,CAAC,GAAIA,EAAK,UAAY,GAAKH,CAAS,CAAA,EAC9C,CAAA,CACH,CAAA,CAEL,EACA,KAAK,aACL,KAAM1B,GAAA,YAAAA,EAAO,UAAA,CACf,EAEF,MAAAR,EACA,YAAaS,EACb,QAASF,GAAU,CAACQ,CAAA,CACtB,CAEJ"}
|
package/containers/index.d.ts
CHANGED
|
@@ -17,13 +17,11 @@
|
|
|
17
17
|
export * from './BillToShippingAddress';
|
|
18
18
|
export * from './EstimateShipping';
|
|
19
19
|
export * from './LoginForm';
|
|
20
|
-
export * from './LoginFormSummary';
|
|
21
20
|
export * from './MergedCartBanner';
|
|
22
21
|
export * from './OutOfStock';
|
|
23
22
|
export * from './PaymentMethods';
|
|
24
23
|
export * from './PlaceOrder';
|
|
25
24
|
export * from './ServerError';
|
|
26
25
|
export * from './ShippingMethods';
|
|
27
|
-
export * from './ShippingMethodsSummary';
|
|
28
26
|
export * from './TermsAndConditions';
|
|
29
27
|
//# sourceMappingURL=index.d.ts.map
|
package/fragments.js
CHANGED
|
@@ -142,3 +142,4 @@ const e=`
|
|
|
142
142
|
email
|
|
143
143
|
}
|
|
144
144
|
`;export{_ as AVAILABLE_PAYMENT_METHOD_FRAGMENT,e as BILLING_CART_ADDRESS_FRAGMENT,i as CHECKOUT_DATA_FRAGMENT,r as CUSTOMER_FRAGMENT,a as SELECTED_PAYMENT_METHOD_FRAGMENT,t as SHIPPING_CART_ADDRESS_FRAGMENT};
|
|
145
|
+
//# sourceMappingURL=fragments.js.map
|
package/fragments.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragments.js","sources":["/@dropins/storefront-checkout/src/api/graphql/CartAddressFragment.graphql.ts","/@dropins/storefront-checkout/src/api/graphql/CartPaymentMethodFragment.graphql.ts","/@dropins/storefront-checkout/src/api/graphql/CheckoutDataFragment.graphql.ts","/@dropins/storefront-checkout/src/api/graphql/CustomerFragment.graphql.ts"],"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\nexport const BILLING_CART_ADDRESS_FRAGMENT = /* GraphQL */ `\n fragment BILLING_CART_ADDRESS_FRAGMENT on BillingCartAddress {\n id\n city\n country {\n code\n label\n }\n firstname\n lastname\n company\n postcode\n vat_id\n region {\n region_id\n code\n label\n }\n street\n telephone\n custom_attributes {\n ... on AttributeValue {\n code\n value\n }\n }\n prefix\n suffix\n middlename\n fax\n }\n`;\n\nexport const SHIPPING_CART_ADDRESS_FRAGMENT = /* GraphQL */ `\n fragment SHIPPING_CART_ADDRESS_FRAGMENT on ShippingCartAddress {\n id\n firstname\n lastname\n company\n street\n city\n postcode\n vat_id\n region {\n region_id\n code\n label\n }\n country {\n code\n label\n }\n telephone\n custom_attributes {\n ... on AttributeValue {\n code\n value\n }\n }\n available_shipping_methods {\n amount {\n currency\n value\n }\n available\n carrier_code\n carrier_title\n error_message\n method_code\n method_title\n price_excl_tax {\n value\n currency\n }\n price_incl_tax {\n value\n currency\n }\n }\n selected_shipping_method {\n amount {\n value\n currency\n }\n carrier_code\n carrier_title\n method_code\n method_title\n price_excl_tax {\n value\n currency\n }\n price_incl_tax {\n value\n currency\n }\n }\n same_as_billing\n prefix\n suffix\n middlename\n fax\n }\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 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\nexport const AVAILABLE_PAYMENT_METHOD_FRAGMENT = /* GraphQL */ `\n fragment AVAILABLE_PAYMENT_METHOD_FRAGMENT on AvailablePaymentMethod {\n code\n title\n }\n`;\n\nexport const SELECTED_PAYMENT_METHOD_FRAGMENT = /* GraphQL */ `\n fragment SELECTED_PAYMENT_METHOD_FRAGMENT on SelectedPaymentMethod {\n code\n title\n }\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n BILLING_CART_ADDRESS_FRAGMENT,\n SHIPPING_CART_ADDRESS_FRAGMENT,\n} from './CartAddressFragment.graphql';\nimport {\n AVAILABLE_PAYMENT_METHOD_FRAGMENT,\n SELECTED_PAYMENT_METHOD_FRAGMENT,\n} from './CartPaymentMethodFragment.graphql';\n\nexport const CHECKOUT_DATA_FRAGMENT = /* GraphQL */ `\n fragment CHECKOUT_DATA_FRAGMENT on Cart {\n id\n is_virtual\n email\n total_quantity\n billing_address {\n ...BILLING_CART_ADDRESS_FRAGMENT\n }\n shipping_addresses {\n ...SHIPPING_CART_ADDRESS_FRAGMENT\n }\n available_payment_methods {\n ...AVAILABLE_PAYMENT_METHOD_FRAGMENT\n }\n selected_payment_method {\n ...SELECTED_PAYMENT_METHOD_FRAGMENT\n }\n }\n\n ${BILLING_CART_ADDRESS_FRAGMENT}\n ${SHIPPING_CART_ADDRESS_FRAGMENT}\n ${AVAILABLE_PAYMENT_METHOD_FRAGMENT}\n ${SELECTED_PAYMENT_METHOD_FRAGMENT}\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\nexport const CUSTOMER_FRAGMENT = /* GraphQL */ `\n fragment CUSTOMER_FRAGMENT on Customer {\n firstname\n lastname\n email\n }\n`;\n"],"names":["BILLING_CART_ADDRESS_FRAGMENT","SHIPPING_CART_ADDRESS_FRAGMENT","AVAILABLE_PAYMENT_METHOD_FRAGMENT","SELECTED_PAYMENT_METHOD_FRAGMENT","CHECKOUT_DATA_FRAGMENT","CUSTOMER_FRAGMENT"],"mappings":"AAiBa,MAAAA,EAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiC9CC,EAA+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECjC/CC,EAAkD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlDC,EAAiD;AAAA;AAAA;AAAA;AAAA;AAAA,ECEjDC,EAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBhDJ,CAA6B;AAAA,IAC7BC,CAA8B;AAAA,IAC9BC,CAAiC;AAAA,IACjCC,CAAgC;AAAA,EChCvBE,EAAkC;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-checkout", "version": "2.0.
|
|
1
|
+
{"name": "@dropins/storefront-checkout", "version": "2.0.1", "@dropins/tools": "^1.4.0", "license": "SEE LICENSE IN LICENSE.md"}
|
package/render.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
(function(n,o){try{if(typeof document<"u"){const t=document.createElement("style"),r=o.styleId;for(const e in o.attributes)t.setAttribute(e,o.attributes[e]);t.setAttribute("data-dropin",r),t.appendChild(document.createTextNode(n));const a=document.querySelector('style[data-dropin="sdk"]');if(a)a.after(t);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(t):document.head.append(t)}}}catch(t){console.error("dropin-styles (injectCodeFunction)",t)}})(`.checkout__banner{margin-bottom:var(--spacing-xbig)}
|
|
4
|
-
.checkout-estimate-shipping{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-xxsmall);align-items:center;color:var(--color-neutral-800)}.checkout-estimate-shipping__label,.checkout-estimate-shipping__price{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.checkout-estimate-shipping__label--muted{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);color:var(--color-neutral-700)}.checkout-estimate-shipping__price--muted{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-estimate-shipping__price{text-align:right}.checkout-estimate-shipping__label--bold,.checkout-estimate-shipping__price--bold{font:var(--type-body-1-emphasized-font);letter-spacing:var(--type-body-1-emphasized-letter-spacing)}.checkout-estimate-shipping__caption{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);color:var(--color-neutral-700)}.cart-order-summary__shipping .dropin-skeleton{grid-template-columns:1fr}.checkout-login-form__heading{display:grid;grid-template-columns:1fr max-content;grid-auto-rows:max-content;margin:0 0 var(--spacing-medium) 0;align-items:center}.checkout-login-form__heading:empty{display:none}.checkout-login-form__content{grid-auto-rows:max-content}.checkout-login-form__content .dropin-field__hint a{font-weight:400}.checkout-login-form__customer-details{display:grid;grid-auto-flow:row;gap:var(--spacing-xxsmall)}.checkout-login-form__customer-name{font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.checkout-login-form__customer-email{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);color:var(--color-neutral-700)}.checkout-login-form__title,.checkout-login-form__title h2{grid-column-start:1;color:var(--color-neutral-800);font:var(--type-headline-2-default-font);letter-spacing:var(--type-headline-2-default-letter-spacing);margin:0}.checkout-login-form__heading-label,.checkout-login-form__sign-in,.checkout-login-form__sign-out{grid-column-start:2;color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);justify-self:flex-end}.checkout-login-form__heading-label a,a.checkout-login-form__link{font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing);margin-left:var(--spacing-xxsmall)}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-login-form__heading{grid-template-columns:1fr;grid-template-rows:1fr}.checkout-login-form__heading-label{grid-column-start:1;align-self:flex-start;justify-self:flex-start;margin-top:var(--spacing-medium)}}.checkout-
|
|
5
|
-
.checkout-shipping-methods__title,.checkout-shipping-methods__title h3{color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:0 0 var(--spacing-medium) 0}.checkout-shipping-methods__content{position:relative;display:block}.checkout-shipping-methods__method{margin-bottom:var(--spacing-medium);width:fit-content;cursor:pointer;font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-shipping-methods__method:last-child{margin-bottom:0}.dropin-radio-button__label .dropin-price{color:var(--color-neutral-800);font-weight:400}.checkout-shipping-methods__options--
|
|
4
|
+
.checkout-estimate-shipping{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-xxsmall);align-items:center;color:var(--color-neutral-800)}.checkout-estimate-shipping__label,.checkout-estimate-shipping__price{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.checkout-estimate-shipping__label--muted{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);color:var(--color-neutral-700)}.checkout-estimate-shipping__price--muted{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-estimate-shipping__price{text-align:right}.checkout-estimate-shipping__label--bold,.checkout-estimate-shipping__price--bold{font:var(--type-body-1-emphasized-font);letter-spacing:var(--type-body-1-emphasized-letter-spacing)}.checkout-estimate-shipping__caption{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);color:var(--color-neutral-700)}.cart-order-summary__shipping .dropin-skeleton{grid-template-columns:1fr}.checkout-login-form__heading{display:grid;grid-template-columns:1fr max-content;grid-auto-rows:max-content;margin:0 0 var(--spacing-medium) 0;align-items:center}.checkout-login-form__heading:empty{display:none}.checkout-login-form__content{grid-auto-rows:max-content}.checkout-login-form__content .dropin-field__hint a{font-weight:400}.checkout-login-form__customer-details{display:grid;grid-auto-flow:row;gap:var(--spacing-xxsmall)}.checkout-login-form__customer-name{font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.checkout-login-form__customer-email{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);color:var(--color-neutral-700)}.checkout-login-form__title,.checkout-login-form__title h2{grid-column-start:1;color:var(--color-neutral-800);font:var(--type-headline-2-default-font);letter-spacing:var(--type-headline-2-default-letter-spacing);margin:0}.checkout-login-form__heading-label,.checkout-login-form__sign-in,.checkout-login-form__sign-out{grid-column-start:2;color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);justify-self:flex-end}.checkout-login-form__heading-label a,a.checkout-login-form__link{font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing);margin-left:var(--spacing-xxsmall)}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-login-form__heading{grid-template-columns:1fr;grid-template-rows:1fr}.checkout-login-form__heading-label{grid-column-start:1;align-self:flex-start;justify-self:flex-start;margin-top:var(--spacing-medium)}}.checkout-out-of-stock.dropin-card{border-color:var(--color-warning-500)}.checkout-out-of-stock .dropin-card__content{gap:var(--spacing-small);padding:var(--spacing-small)}.checkout-out-of-stock__title{color:var(--color-neutral-900);font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing);margin:0;display:flex;gap:var(--spacing-xxsmall);align-items:center;justify-content:left;text-align:center}.checkout-out-of-stock__message{color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:0}.checkout-out-of-stock__items{display:grid;grid-template-columns:repeat(5,100px);grid-gap:var(--spacing-small);list-style:none;padding:0;margin:0}.checkout-out-of-stock__item img{width:100%;height:auto}.checkout-out-of-stock__actions{display:flex;gap:var(--spacing-small);justify-content:flex-end}a.checkout-out-of-stock__action{color:var(--color-brand-500);font:var(--type-details-caption-1-font);letter-spacing:var(--type-details-caption-1-letter-spacing)}.checkout-out-of-stock__action{color:var(--color-brand-500);font:var(--type-details-caption-1-font);letter-spacing:var(--type-details-caption-1-letter-spacing);background:none;border:none;padding:0;cursor:pointer}.checkout-out-of-stock__action:hover{--textColor: var(--color-brand-700);text-decoration:solid underline var(--textColor);text-underline-offset:6px}@media only screen and (width >= 320px) and (width <= 768px){.checkout-out-of-stock__items{grid-template-columns:repeat(3,100px)}}.checkout-server-error{position:relative;text-align:center}.checkout-server-error__icon .error-icon{color:var(--color-alert-500)}.checkout-server-error a{font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing)}.checkout-terms-and-conditions{display:grid}.checkout-terms-and-conditions__error{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);color:var(--color-alert-800);text-align:left;margin-top:var(--spacing-xsmall)}.checkout-terms-and-conditions__error:empty{display:none}
|
|
5
|
+
.checkout-shipping-methods__title,.checkout-shipping-methods__title h3{color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:0 0 var(--spacing-medium) 0}.checkout-shipping-methods__content{position:relative;display:block}.checkout-shipping-methods__method{margin-bottom:var(--spacing-medium);width:fit-content;cursor:pointer;font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-shipping-methods__method:last-child{margin-bottom:0}.dropin-radio-button__label .dropin-price{color:var(--color-neutral-800);font-weight:400}.checkout-shipping-methods__options--busy{opacity:.4;pointer-events:none}.checkout-shipping-methods__spinner{margin:0 auto;position:absolute;z-index:999;left:0;right:0;top:calc(50% - (var(--size) / 2));bottom:0}.checkout-shipping-methods__options--toggleButton{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-medium)}.checkout-shipping-methods__options--toggleButton .dropin-toggle-button__content{justify-content:start;display:grid;grid-template-columns:1fr min-content}.checkout-shipping-methods__options--toggleButton .checkout-shipping-methods__method{margin-bottom:0;width:auto}.checkout-shipping-methods__error{margin-top:var(--spacing-medium)}
|
|
6
6
|
.checkout-place-order{display:grid;padding-bottom:var(--spacing-big)}.checkout-place-order__button{align-self:flex-end;justify-self:flex-end}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-place-order{background-color:var(--color-neutral-200);padding:var(--spacing-medium) var(--spacing-medium) var(--spacing-big) var(--spacing-medium)}.checkout-place-order__button{align-self:center;justify-self:stretch}}
|
|
7
|
-
.checkout-payment-methods__title,.checkout-payment-methods__title h2{color:var(--color-neutral-800);font:var(--type-headline-2-default-font);letter-spacing:var(--type-headline-2-default-letter-spacing);margin:0 0 var(--spacing-medium) 0}.checkout-payment-methods__wrapper{position:relative;display:grid}.checkout-payment-methods__wrapper--
|
|
7
|
+
.checkout-payment-methods__title,.checkout-payment-methods__title h2{color:var(--color-neutral-800);font:var(--type-headline-2-default-font);letter-spacing:var(--type-headline-2-default-letter-spacing);margin:0 0 var(--spacing-medium) 0}.checkout-payment-methods__wrapper{position:relative;display:grid}.checkout-payment-methods__wrapper--busy{opacity:.4;pointer-events:none}.checkout-payment-methods__methods{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-medium)}.checkout-payment-methods__content{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);margin-top:var(--spacing-xbig)}.checkout-payment-methods__content>div[data-slot=PaymentMethodSlot]:not(:empty){margin-top:var(--spacing-medium)}.checkout-payment-methods--full-width{grid-template-columns:1fr}.checkout-payment-methods__spinner{margin:0 auto;position:absolute;z-index:999;left:0;right:0;top:calc(50% - (var(--size) / 2));bottom:0}.checkout__content [data-slot=PaymentMethods]:empty{display:none}.checkout-payment-methods__error{margin-top:var(--spacing-medium)}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-payment-methods__methods{grid-template-columns:1fr}}
|
|
8
8
|
.checkout-bill-to-shipping-address label{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);gap:0}.checkout-bill-to-shipping-address__error{margin-top:var(--spacing-medium)}`,{styleId:"checkout"});
|
|
9
9
|
import{jsx as f}from"@dropins/tools/preact-jsx-runtime.js";import{Render as d}from"@dropins/tools/lib.js";import"./chunks/errors.js";import{events as y}from"@dropins/tools/event-bus.js";import{c as g}from"./chunks/synchronizeCheckout.js";import{UIProvider as p}from"@dropins/tools/components.js";import{useState as b,useEffect as h}from"@dropins/tools/preact-hooks.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";import"./fragments.js";function O(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var S=function(r){return w(r)&&!E(r)};function w(e){return!!e&&typeof e=="object"}function E(e){var r=Object.prototype.toString.call(e);return r==="[object RegExp]"||r==="[object Date]"||j(e)}var v=typeof Symbol=="function"&&Symbol.for,P=v?Symbol.for("react.element"):60103;function j(e){return e.$$typeof===P}function M(e){return Array.isArray(e)?[]:{}}function i(e,r){return r.clone!==!1&&r.isMergeableObject(e)?o(M(e),e,r):e}function A(e,r,t){return e.concat(r).map(function(a){return i(a,t)})}function T(e,r){if(!r.customMerge)return o;var t=r.customMerge(e);return typeof t=="function"?t:o}function I(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(r){return Object.propertyIsEnumerable.call(e,r)}):[]}function u(e){return Object.keys(e).concat(I(e))}function m(e,r){try{return r in e}catch{return!1}}function C(e,r){return m(e,r)&&!(Object.hasOwnProperty.call(e,r)&&Object.propertyIsEnumerable.call(e,r))}function x(e,r,t){var a={};return t.isMergeableObject(e)&&u(e).forEach(function(n){a[n]=i(e[n],t)}),u(r).forEach(function(n){C(e,n)||(m(e,n)&&t.isMergeableObject(r[n])?a[n]=T(n,t)(e[n],r[n],t):a[n]=i(r[n],t))}),a}function o(e,r,t){t=t||{},t.arrayMerge=t.arrayMerge||A,t.isMergeableObject=t.isMergeableObject||S,t.cloneUnlessOtherwiseSpecified=i;var a=Array.isArray(r),n=Array.isArray(e),s=a===n;return s?a?t.arrayMerge(e,r,t):x(e,r,t):i(r,t)}o.all=function(r,t){if(!Array.isArray(r))throw new Error("first argument should be an array");return r.reduce(function(a,n){return o(a,n,t)},{})};var D=o,_=D;const L=O(_),R={BillToShippingAddress:{cartSyncError:"We were unable to save your changes. Please try again later.",title:"Bill to shipping address"},EmptyCart:{button:"Start shopping",title:"Your cart is empty"},EstimateShipping:{estimated:"Estimated Shipping",freeShipping:"Free",label:"Shipping",taxToBeDetermined:"TBD",withoutTaxes:"Excluding taxes",withTaxes:"Including taxes"},LoginForm:{account:"Already have an account?",ariaLabel:"Email",emailExists:{alreadyHaveAccount:"It looks like you already have an account.",forFasterCheckout:"for a faster checkout.",signInButton:"Sign in"},floatingLabel:"Email *",invalidEmailError:"Please enter a valid email address.",missingEmailError:"Enter an email address.",cartSyncError:"We were unable to save your changes. Please try again later.",placeholder:"Enter your email address",signIn:"Sign In",signOut:"Sign Out",switch:"Do you want to switch account?",title:"Contact details"},MergedCartBanner:{items:{many:"{{count}} items from a previous session were added to your cart. Please review your new subtotal.",one:"1 item from a previous session was added to your cart. Please review your new subtotal."}},OutOfStock:{actions:{removeOutOfStock:"Remove out of stock items",reviewCart:"Review cart"},alert:"Out of stock!",lowInventory:{many:"Only {{count}} left!",one:"Last item!"},message:"The following items are out of stock:",title:"Your cart contains items that are out of stock"},PaymentMethods:{cartSyncError:"We were unable to save your changes. Please try again later.",emptyState:"No payment methods available",title:"Payment"},PlaceOrder:{button:"Place Order"},ServerError:{button:"Try again",contactSupport:"If you continue to have issues, please contact support.",title:"We were unable to process your order",unexpected:"An unexpected error occurred while processing your order. Please try again later."},ShippingMethods:{cartSyncError:"We were unable to save your changes. Please try again later.",emptyState:"This order can't be shipped to the address provided. Please review the address details you entered and make sure they're correct.",title:"Shipping options"},Summary:{Edit:"Edit"},TermsAndConditions:{error:"Please accept the Terms and Conditions to continue.",label:"I have read, understand, and accept our <a href='https://www.adobe.com/legal/terms.html' target='_blank'>Terms of Use, Terms of Sales, Privacy Policy, and Return Policy</a>."},title:"Checkout"},U={Checkout:R},B={default:U},k=({children:e})=>{var s;const[r,t]=b(),a=(s=g.getConfig())==null?void 0:s.langDefinitions;h(()=>{const c=y.on("locale",l=>{l!==r&&t(l)},{eager:!0});return()=>{c==null||c.off()}},[r]);const n=L(B,a??{});return f(p,{lang:r,langDefinitions:n,children:e})},G=new d(f(k,{}));export{k as Provider,G as render};
|
|
10
|
+
//# sourceMappingURL=render.js.map
|