@dropins/storefront-checkout 2.0.1-beta1 → 2.1.0-beta2

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.
Files changed (97) hide show
  1. package/api/fragments.d.ts +4 -1
  2. package/{lib/network-error.d.ts → api/getNegotiableQuote/getNegotiableQuote.d.ts} +7 -7
  3. package/{signals/ServerErrorSignal.d.ts → api/getNegotiableQuote/graphql/getNegotiableQuote.graphql.d.ts} +3 -3
  4. package/{errors → api/getNegotiableQuote/graphql}/index.d.ts +2 -2
  5. package/{signals → api/getNegotiableQuote}/index.d.ts +2 -2
  6. package/api/graphql/CartAddressFragment.graphql.d.ts +1 -1
  7. package/api/graphql/NegotiableQuoteAddressFragment.graphql.d.ts +19 -0
  8. package/api/graphql/NegotiableQuoteFragment.graphql.d.ts +18 -0
  9. package/api/graphql/{CartPaymentMethodFragment.graphql.d.ts → PaymentMethodFragment.graphql.d.ts} +1 -1
  10. package/api/graphql/ShippingMethodFragment.graphql.d.ts +19 -0
  11. package/api/index.d.ts +5 -1
  12. package/api/setNegotiableQuoteBillingAddress/graphql/index.d.ts +18 -0
  13. package/api/setNegotiableQuoteBillingAddress/graphql/setNegotiableQuoteBillingAddress.graphql.d.ts +18 -0
  14. package/api/setNegotiableQuoteBillingAddress/index.d.ts +18 -0
  15. package/api/setNegotiableQuoteBillingAddress/setNegotiableQuoteBillingAddress.d.ts +6 -0
  16. package/api/setNegotiableQuotePaymentMethod/graphql/index.d.ts +18 -0
  17. package/api/setNegotiableQuotePaymentMethod/graphql/setNegotiableQuotePaymentMethod.graphql.d.ts +18 -0
  18. package/api/setNegotiableQuotePaymentMethod/index.d.ts +18 -0
  19. package/api/setNegotiableQuotePaymentMethod/setNegotiableQuotePaymentMethod.d.ts +6 -0
  20. package/api/setNegotiableQuoteShippingAddress/graphql/index.d.ts +18 -0
  21. package/api/setNegotiableQuoteShippingAddress/graphql/setNegotiableQuoteShippingAddress.graphql.d.ts +18 -0
  22. package/api/setNegotiableQuoteShippingAddress/index.d.ts +18 -0
  23. package/api/setNegotiableQuoteShippingAddress/setNegotiableQuoteShippingAddress.d.ts +6 -0
  24. package/api/setNegotiableQuoteShippingMethods/graphql/index.d.ts +18 -0
  25. package/api/setNegotiableQuoteShippingMethods/graphql/setNegotiableQuoteShippingMethods.graphql.d.ts +18 -0
  26. package/api/setNegotiableQuoteShippingMethods/index.d.ts +18 -0
  27. package/api/setNegotiableQuoteShippingMethods/setNegotiableQuoteShippingMethods.d.ts +18 -0
  28. package/api.js +78 -7
  29. package/api.js.map +1 -1
  30. package/chunks/checkout.js.map +1 -1
  31. package/chunks/fetch-graphql.js +14 -0
  32. package/chunks/fetch-graphql.js.map +1 -0
  33. package/chunks/setBillingAddress.js +2 -2
  34. package/chunks/setBillingAddress.js.map +1 -1
  35. package/chunks/setGuestEmailOnCart.js +4 -4
  36. package/chunks/setGuestEmailOnCart.js.map +1 -1
  37. package/chunks/setPaymentMethod.js +2 -2
  38. package/chunks/setPaymentMethod.js.map +1 -1
  39. package/chunks/setShippingMethods.js +3 -3
  40. package/chunks/setShippingMethods.js.map +1 -1
  41. package/chunks/synchronizeCheckout.js +3 -3
  42. package/chunks/synchronizeCheckout.js.map +1 -1
  43. package/containers/BillToShippingAddress.js +1 -1
  44. package/containers/BillToShippingAddress.js.map +1 -1
  45. package/containers/EstimateShipping.js +1 -1
  46. package/containers/EstimateShipping.js.map +1 -1
  47. package/containers/LoginForm.js +1 -1
  48. package/containers/LoginForm.js.map +1 -1
  49. package/containers/OutOfStock.js +1 -1
  50. package/containers/OutOfStock.js.map +1 -1
  51. package/containers/PaymentMethods.js +1 -1
  52. package/containers/PaymentMethods.js.map +1 -1
  53. package/containers/PlaceOrder.js +1 -1
  54. package/containers/PlaceOrder.js.map +1 -1
  55. package/containers/ServerError.js +1 -1
  56. package/containers/ServerError.js.map +1 -1
  57. package/containers/ShippingMethods.js +1 -1
  58. package/containers/ShippingMethods.js.map +1 -1
  59. package/containers/TermsAndConditions.js +1 -1
  60. package/containers/TermsAndConditions.js.map +1 -1
  61. package/data/models/address.d.ts +5 -8
  62. package/data/models/api.d.ts +3 -3
  63. package/data/models/cart.d.ts +14 -7
  64. package/data/models/checkout.d.ts +14 -0
  65. package/data/models/country.d.ts +1 -1
  66. package/data/models/index.d.ts +2 -1
  67. package/data/models/{price.d.ts → money.d.ts} +2 -2
  68. package/data/models/quote.d.ts +15 -0
  69. package/data/models/shipping-estimate.d.ts +4 -4
  70. package/data/models/shipping-method.d.ts +4 -4
  71. package/data/transforms/index.d.ts +6 -1
  72. package/data/transforms/{transform-address.d.ts → transform-cart-address.d.ts} +12 -13
  73. package/data/transforms/transform-cart.d.ts +1 -1
  74. package/data/transforms/transform-country.d.ts +8 -0
  75. package/data/transforms/transform-negotiable-quote.d.ts +7 -0
  76. package/data/transforms/transform-payment-methods.d.ts +1 -1
  77. package/data/transforms/transform-quote-address.d.ts +75 -0
  78. package/data/transforms/transform-region.d.ts +8 -0
  79. package/fragments.js +126 -43
  80. package/fragments.js.map +1 -1
  81. package/lib/enqueueRequest.d.ts +1 -0
  82. package/lib/errors/classifiers.d.ts +36 -0
  83. package/lib/errors/customErrors.d.ts +39 -0
  84. package/lib/errors/index.d.ts +20 -0
  85. package/lib/errors/mapErrorToCode.d.ts +4 -0
  86. package/lib/index.d.ts +1 -1
  87. package/lib/state.d.ts +1 -0
  88. package/package.json +1 -1
  89. package/render.js +1 -1
  90. package/render.js.map +1 -1
  91. package/tests/constants.d.ts +1 -0
  92. package/tests/fixtures/fragments/cart.d.ts +1 -2
  93. package/chunks/ServerErrorSignal.js +0 -4
  94. package/chunks/ServerErrorSignal.js.map +0 -1
  95. package/chunks/errors.js +0 -14
  96. package/chunks/errors.js.map +0 -1
  97. package/errors/errors.d.ts +0 -30
@@ -1 +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
+ {"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":"2vBAgCO,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,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
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};
3
+ import{jsxs as W,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{h as X,s as Y}from"../chunks/fetch-graphql.js";import{classes as L,VComponent as ee,Slot as j}from"@dropins/tools/lib.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{events as A}from"@dropins/tools/event-bus.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
4
  //# sourceMappingURL=PaymentMethods.js.map
@@ -1 +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]}
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]}
@@ -1,4 +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{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};
3
+ import{jsxs as g,jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{W as y,g as b}from"../chunks/ConditionalWrapper.js";/* empty css */import{Skeleton as A,SkeletonRow as I,Button as x}from"@dropins/tools/components.js";import{classes as z,Slot as W}from"@dropins/tools/lib.js";import{I as D,U as V,h as K,s as H}from"../chunks/fetch-graphql.js";import{events as u}from"@dropins/tools/event-bus.js";import{g as U}from"../chunks/values.js";import{useState as k,useCallback as m,useEffect as f}from"@dropins/tools/preact-hooks.js";import{useText as L}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";var p=(e=>(e.INVALID_INPUT="INVALID_INPUT",e.SERVER_ERROR="SERVER_ERROR",e.UNAUTHENTICATED="UNAUTHENTICATED",e.UNKNOWN_ERROR="UNKNOWN_ERROR",e))(p||{});const j=["PlaceOrderError"],v=[{code:"INVALID_INPUT",matches:e=>e instanceof D},{code:"UNAUTHENTICATED",matches:e=>e instanceof V},{code:"SERVER_ERROR",matches:e=>!e||typeof e!="object"||!("name"in e)?!1:j.includes(e.name)}];function B(e){const n=v.find(s=>s.matches(e));return n?n.code:p.UNKNOWN_ERROR}const w=()=>g(A,{"data-testid":"place-order-skeleton",children:[o(I,{size:"small",variant:"empty"}),o(I,{size:"small"})]}),M=({children:e,className:n,disabled:s=!1,onClick:i})=>o("div",{className:z(["checkout-place-order",n]),children:o(x,{className:"checkout-place-order__button","data-testid":"place-order-button",disabled:s,size:"medium",type:"submit",variant:"primary",onClick:i,children:e},"placeOrder")}),Q=y(M,w),se=({disabled:e=!1,active:n=!0,handleValidation:s,handlePlaceOrder:i,slots:l,...C})=>{var h;const[S,R]=k(!1),[T,E]=k(!1),_=K.value,d=L({CheckoutUnexpectedError:"Checkout.ServerError.unexpected",placeOrderButton:"Checkout.PlaceOrder.button"}),N=m(t=>{const r=B(t),a=r===p.UNKNOWN_ERROR?d.CheckoutUnexpectedError:t.message;u.emit("checkout/error",{message:a,code:r})},[d]),P=m(async()=>{var t;try{if(s&&!s())return;await i({cartId:H.cartId,code:((t=U("selectedPaymentMethod"))==null?void 0:t.code)??""})}catch(r){N(r)}},[s,i,N]),c=m(t=>{(!t||t.isEmpty)&&E(!1)},[]);return f(()=>{if(n===!1)return;const t=u.on("cart/initialized",r=>{const a=(r==null?void 0:r.items)||[];E(a.some(O=>O.outOfStock||O.insufficientQuantity))},{eager:!0});return()=>{t==null||t.off()}},[n]),f(()=>{if(!n)return;const t=b();if(t){R(!0),c(t);return}const r=u.on("checkout/initialized",a=>{R(!0),c(a)},{eager:!0});return()=>{r==null||r.off()}},[n,c]),f(()=>{if(!n)return;const t=u.on("checkout/updated",r=>{c(r)},{eager:!1});return()=>{t==null||t.off()}},[n,c]),o(Q,{...C,disabled:e||T||_,initialized:S,visible:n,onClick:P,children:o(W,{context:{code:((h=U("selectedPaymentMethod"))==null?void 0:h.code)??""},name:"Content",slot:l==null?void 0:l.Content,children:d.placeOrderButton})})};export{se as PlaceOrder,se as default};
4
4
  //# sourceMappingURL=PlaceOrder.js.map
@@ -1 +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
+ {"version":3,"file":"PlaceOrder.js","sources":["/@dropins/storefront-checkout/src/lib/errors/classifiers.ts","/@dropins/storefront-checkout/src/lib/errors/mapErrorToCode.ts","/@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 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\nimport { InvalidInput, Unauthenticated } from './customErrors';\n\nexport type ErrorCode = string;\n\nexport enum ErrorCodes {\n INVALID_INPUT = 'INVALID_INPUT',\n SERVER_ERROR = 'SERVER_ERROR',\n UNAUTHENTICATED = 'UNAUTHENTICATED',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\nconst KNOWN_SERVER_ERRORS = ['PlaceOrderError'];\n\nexport interface ErrorClassifier {\n /**\n * The specific code to return if this classifier matches.\n */\n code: ErrorCode;\n /**\n * A function that returns `true` if it recognizes the error.\n * It must safely handle `unknown` inputs.\n */\n matches: (error: unknown) => boolean;\n}\n\n// Array of all known error classifiers.\n// The order is important! The first one to match will be used.\nexport const classifiers: ErrorClassifier[] = [\n {\n code: ErrorCodes.INVALID_INPUT,\n matches: (error: unknown): boolean => {\n return error instanceof InvalidInput;\n },\n },\n {\n code: ErrorCodes.UNAUTHENTICATED,\n matches: (error: unknown): boolean => {\n return error instanceof Unauthenticated;\n },\n },\n {\n code: ErrorCodes.SERVER_ERROR,\n matches: (error: unknown): boolean => {\n if (!error || typeof error !== 'object' || !('name' in error)) {\n return false;\n }\n\n return KNOWN_SERVER_ERRORS.includes((error as { name: string }).name);\n },\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\nimport {\n classifiers,\n ErrorCode,\n ErrorCodes,\n} from '@/checkout/lib/errors/classifiers';\n\nexport function mapErrorToCode(error: unknown): ErrorCode {\n const matchingClassifier = classifiers.find((classifier) =>\n classifier.matches(error)\n );\n\n if (matchingClassifier) {\n return matchingClassifier.code;\n }\n\n return ErrorCodes.UNKNOWN_ERROR;\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 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 { 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 { ErrorCodes, mapErrorToCode } from '@/checkout/lib/errors';\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 const code = mapErrorToCode(error);\n\n const message =\n code === ErrorCodes.UNKNOWN_ERROR\n ? translations.CheckoutUnexpectedError\n : error.message;\n\n events.emit('checkout/error', { message, code });\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":["ErrorCodes","KNOWN_SERVER_ERRORS","classifiers","error","InvalidInput","Unauthenticated","mapErrorToCode","matchingClassifier","classifier","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","code","message","events","handleClick","state","_a","getValue","handleCheckoutData","data","useEffect","onCartData","items","item","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","onCheckoutUpdated","Slot"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
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};
3
+ import{jsx as o,jsxs as f}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{IllustratedMessage as h,Icon as d,Button as v}from"@dropins/tools/components.js";import"../chunks/TermsAndConditions.js";import{classes as i}from"@dropins/tools/lib.js";/* empty css */import"../chunks/fetch-graphql.js";import{events as g}from"@dropins/tools/event-bus.js";import{s as k}from"../chunks/dom.js";import"@dropins/tools/preact-compat.js";/* empty css */import{S}from"../chunks/OrderError.js";import{useText as C}from"@dropins/tools/i18n.js";/* empty css */import{useState as E,useRef as _,useEffect as l}from"@dropins/tools/preact-hooks.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";const b=({className:n,contactSupport:s,errorMessage:e,onClick:a,errorMessageRef:t})=>{const r=C({Title:"Checkout.ServerError.title",Message:"Checkout.ServerError.message",ContactSupport:"Checkout.ServerError.contactSupport",Button:"Checkout.ServerError.button"}),c=e!==""?e:r.Title;return o(h,{action:o(v,{className:i(["checkout-server-error__button"]),name:"server-error-button",onClick:a,children:r.Button}),"aria-describedby":"checkout-server-error__message","aria-invalid":"true","aria-live":"polite",className:i(["checkout-server-error",n]),"data-testid":"checkout-server-error",heading:c,icon:o(d,{className:i(["checkout-server-error__icon"]),source:S}),message:f("p",{ref:t,"data-testid":"checkout-server-error-message",id:i(["checkout-server-error__message"]),children:[r.Message,o("br",{}),o("span",{children:s??r.ContactSupport})]})})},J=({active:n=!0,onRetry:s,onServerError:e,autoScroll:a=!1})=>{const[t,r]=E(null),c=_(null),p=async()=>{s==null||s(),r(null)};return l(()=>{const u=g.on("checkout/error",m=>{r(m||null),m&&e&&e(m.message)},{eager:!0});return()=>{u==null||u.off()}},[e]),l(()=>{!a||!t||!c.current||k(c.current)},[t,a]),!n||!t?null:o(b,{errorMessage:t.message,errorMessageRef:c,onClick:p})};export{J as ServerError,J as default};
4
4
  //# sourceMappingURL=ServerError.js.map
@@ -1 +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
+ {"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 { CheckoutError } from '@/checkout/data/models/checkout';\nimport { scrollToElement } from '@/checkout/lib';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useEffect, useRef, useState } 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 [error, setError] = useState<CheckoutError | null>(null);\n const errorMessageRef = useRef<HTMLParagraphElement>(null);\n\n const handleClick = async () => {\n onRetry?.();\n setError(null);\n };\n\n useEffect(() => {\n const subscription = events.on(\n 'checkout/error',\n (error: CheckoutError | undefined) => {\n setError(error || null);\n if (error && onServerError) {\n onServerError(error.message);\n }\n },\n { eager: true }\n );\n\n return () => {\n subscription?.off();\n };\n }, [onServerError]);\n\n useEffect(() => {\n if (!autoScroll || !error || !errorMessageRef.current) return;\n scrollToElement(errorMessageRef.current);\n }, [error, autoScroll]);\n\n if (!active || !error) return null;\n\n return (\n <ServerErrorComponent\n errorMessage={error.message}\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","error","setError","useState","useRef","handleClick","useEffect","subscription","events","scrollToElement","ServerErrorComponent"],"mappings":"qyBAqCO,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,EC1DaN,EAA2C,CAAC,CACvD,OAAAgB,EAAS,GACT,QAAAC,EACA,cAAAC,EACA,WAAAC,EAAa,EACf,IAAM,CACJ,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAA+B,IAAI,EACvDjB,EAAkBkB,EAA6B,IAAI,EAEnDC,EAAc,SAAY,CACpBP,GAAA,MAAAA,IACVI,EAAS,IAAI,CACf,EAwBA,OAtBAI,EAAU,IAAM,CACd,MAAMC,EAAeC,EAAO,GAC1B,iBACCP,GAAqC,CACpCC,EAASD,GAAS,IAAI,EAClBA,GAASF,GACXA,EAAcE,EAAM,OAAO,CAE/B,EACA,CAAE,MAAO,EAAK,CAChB,EAEA,MAAO,IAAM,CACXM,GAAA,MAAAA,EAAc,KAChB,CAAA,EACC,CAACR,CAAa,CAAC,EAElBO,EAAU,IAAM,CACV,CAACN,GAAc,CAACC,GAAS,CAACf,EAAgB,SAC9CuB,EAAgBvB,EAAgB,OAAO,CAAA,EACtC,CAACe,EAAOD,CAAU,CAAC,EAElB,CAACH,GAAU,CAACI,EAAc,KAG5BX,EAACoB,EAAA,CACC,aAAcT,EAAM,QACpB,gBAAAf,EACA,QAASmB,CAAA,CACX,CAEJ"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
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};
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/fetch-graphql.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{W as se,h as z,g as ce}from"../chunks/ConditionalWrapper.js";import{n as ae,g as A}from"../chunks/values.js";import{events as W}from"@dropins/tools/event-bus.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"../fragments.js";import"../chunks/synchronizeCheckout.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
4
  //# sourceMappingURL=ShippingMethods.js.map
@@ -1 +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 &nbsp;\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
+ {"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 &nbsp;\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]}