@dropins/storefront-checkout 3.3.0-beta.0 → 3.3.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/api.js +266 -0
- package/api.js.map +1 -0
- package/chunks/PaymentOnAccount.js +1 -1
- package/chunks/PaymentOnAccount.js.map +1 -1
- package/chunks/PurchaseOrder.js +1 -1
- package/chunks/PurchaseOrder.js.map +1 -1
- package/chunks/components.js +2 -2
- package/chunks/components.js.map +1 -1
- package/chunks/events.js +4 -0
- package/chunks/events.js.map +1 -0
- package/chunks/render.js +1 -1
- package/chunks/render.js.map +1 -1
- package/chunks/ui.js +4 -0
- package/chunks/ui.js.map +1 -0
- package/containers/AddressValidation.js +1 -1
- package/containers/AddressValidation.js.map +1 -1
- package/containers/BillToShippingAddress.js +1 -1
- package/containers/BillToShippingAddress.js.map +1 -1
- package/containers/EstimateShipping.js +1 -1
- package/containers/EstimateShipping.js.map +1 -1
- package/containers/LoginForm.js +1 -1
- package/containers/LoginForm.js.map +1 -1
- package/containers/MergedCartBanner.js +1 -1
- package/containers/MergedCartBanner.js.map +1 -1
- package/containers/OutOfStock.js +1 -1
- package/containers/OutOfStock.js.map +1 -1
- package/containers/PaymentMethods.js +1 -1
- package/containers/PaymentMethods.js.map +1 -1
- package/containers/PaymentOnAccount.js +1 -1
- package/containers/PlaceOrder.js +1 -1
- package/containers/PlaceOrder.js.map +1 -1
- package/containers/PurchaseOrder.js +1 -1
- package/containers/ServerError.js +1 -1
- package/containers/ServerError.js.map +1 -1
- package/containers/ShippingMethods.js +1 -1
- package/containers/ShippingMethods.js.map +1 -1
- package/containers/TermsAndConditions.js +1 -1
- package/containers/TermsAndConditions.js.map +1 -1
- package/fragments.js +275 -1
- package/fragments.js.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils.js +1 -537
- package/lib/utils.js.map +1 -1
- package/package.json +1 -1
- package/render.js +1 -1
package/chunks/events.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/*! Copyright 2026 Adobe
|
|
2
|
+
All Rights Reserved. */
|
|
3
|
+
import{k as s}from"../api.js";function u(n){var r;return n===void 0?!!((r=s())!=null&&r.isVirtual):!!(n!=null&&n.isVirtual)}function l(n){return!n||n.isEmpty}function o(n){var e;if(!n)return null;const r=n.shippingAddresses||[];return r.length===0?null:(e=r[0])==null?void 0:e.selectedShippingMethod}function p(n,r="shipping"){var i;return n?(r==="shipping"?(i=n.shippingAddresses)==null?void 0:i[0]:n.billingAddress)??null:null}function g(n){if(!n)return null;const{selectedPaymentMethod:r}=n;return!r||!(r!=null&&r.code)?null:n.selectedPaymentMethod}export{l as a,p as b,g as c,o as g,u as i};
|
|
4
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sources":["/@dropins/storefront-checkout/src/lib/utils/events.ts"],"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 *******************************************************************/\nimport type { Cart } from '@/checkout/data/models/cart';\nimport { getCheckoutData } from '@/checkout/lib/events';\n\ntype CartData = Cart | null;\n\nexport function isVirtualCart(data?: CartData) {\n if (data === undefined) {\n return Boolean(getCheckoutData()?.isVirtual);\n }\n return Boolean(data?.isVirtual);\n}\n\nexport function isEmptyCart(data: CartData) {\n return !data || data.isEmpty;\n}\n\nexport function getCartShippingMethod(data: CartData) {\n if (!data) return null;\n const shippingAddresses = data.shippingAddresses || [];\n if (shippingAddresses.length === 0) return null;\n return shippingAddresses[0]?.selectedShippingMethod;\n}\n\nexport function getCartAddress(\n data: CartData,\n type: 'shipping' | 'billing' = 'shipping'\n): Record<string, any> | null {\n if (!data) return null;\n\n const address =\n type === 'shipping' ? data.shippingAddresses?.[0] : data.billingAddress;\n\n return address ?? null;\n}\n\nexport function getCartPaymentMethod(data: CartData) {\n if (!data) return null;\n const { selectedPaymentMethod } = data;\n if (!selectedPaymentMethod || !selectedPaymentMethod?.code) return null;\n\n return data.selectedPaymentMethod;\n}\n"],"names":["isVirtualCart","data","_a","getCheckoutData","isEmptyCart","getCartShippingMethod","shippingAddresses","getCartAddress","type","getCartPaymentMethod","selectedPaymentMethod"],"mappings":"8BAqBO,SAASA,EAAcC,EAAiB,OAC7C,OAAIA,IAAS,OACJ,IAAQC,EAAAC,EAAgB,IAAhB,MAAAD,EAAmB,WAE7B,GAAQD,GAAA,MAAAA,EAAM,UACvB,CAEO,SAASG,EAAYH,EAAgB,CACnC,MAAA,CAACA,GAAQA,EAAK,OACvB,CAEO,SAASI,EAAsBJ,EAAgB,OAChD,GAAA,CAACA,EAAa,OAAA,KACZ,MAAAK,EAAoBL,EAAK,mBAAqB,CAAC,EACjD,OAAAK,EAAkB,SAAW,EAAU,MACpCJ,EAAAI,EAAkB,CAAC,IAAnB,YAAAJ,EAAsB,sBAC/B,CAEgB,SAAAK,EACdN,EACAO,EAA+B,WACH,OACxB,OAACP,GAGHO,IAAS,YAAaN,EAAAD,EAAK,oBAAL,YAAAC,EAAyB,GAAKD,EAAK,iBAEzC,KALA,IAMpB,CAEO,SAASQ,EAAqBR,EAAgB,CAC/C,GAAA,CAACA,EAAa,OAAA,KACZ,KAAA,CAAE,sBAAAS,GAA0BT,EAClC,MAAI,CAACS,GAAyB,EAACA,GAAA,MAAAA,EAAuB,MAAa,KAE5DT,EAAK,qBACd"}
|
package/chunks/render.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
All Rights Reserved. */
|
|
3
3
|
(function(n,o){try{if(typeof document<"u"){const t=document.createElement("style"),i=o.styleId;for(const e in o.attributes)t.setAttribute(e,o.attributes[e]);t.setAttribute("data-dropin",i),t.appendChild(document.createTextNode(n));const a=document.querySelector('style[data-dropin="sdk"]');if(a)a.after(t);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(t):document.head.append(t)}}}catch(t){console.error("dropin-styles (injectCodeFunction)",t)}})(`.checkout-address-validation{display:grid;gap:var(--spacing-medium)}.checkout-address-validation__options--busy{opacity:.4;pointer-events:none}.checkout-address-validation__title{margin-bottom:var(--spacing-small)}.checkout-address-validation__subtitle{color:var(--color-neutral-700);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-address-validation__options{display:grid;gap:var(--spacing-xbig);grid-template-columns:1fr 1fr}.checkout-address-validation__option{margin:0}.checkout-address-validation__option-title{margin-bottom:var(--spacing-xsmall)}.checkout-bill-to-shipping-address label{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);gap:0}.checkout-bill-to-shipping-address__error{margin-top:var(--spacing-medium)}.checkout-estimate-shipping{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-xxsmall);align-items:center;color:var(--color-neutral-800)}.checkout-estimate-shipping__label,.checkout-estimate-shipping__price{font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.checkout-estimate-shipping__label--muted{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);color:var(--color-neutral-700)}.checkout-estimate-shipping__price--muted{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-estimate-shipping__price{text-align:right}.checkout-estimate-shipping__label--bold,.checkout-estimate-shipping__price--bold{font:var(--type-body-1-emphasized-font);letter-spacing:var(--type-body-1-emphasized-letter-spacing)}.checkout-estimate-shipping__caption{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);color:var(--color-neutral-700)}.cart-order-summary__shipping .dropin-skeleton{grid-template-columns:1fr}.checkout-login-form__heading{display:grid;grid-template-columns:1fr max-content;grid-auto-rows:max-content;margin:0 0 var(--spacing-medium) 0;align-items:center}.checkout-login-form__heading:empty{display:none}.checkout-login-form__content{grid-auto-rows:max-content}.checkout-login-form__content .dropin-field__hint a{font-weight:400}.checkout-login-form__customer-details{display:grid;grid-auto-flow:row;gap:var(--spacing-xxsmall)}.checkout-login-form__customer-name{font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-default-letter-spacing)}.checkout-login-form__customer-email{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);color:var(--color-neutral-700)}.checkout-login-form__title,.checkout-login-form__title h2{grid-column-start:1;color:var(--color-neutral-800);font:var(--type-headline-2-default-font);letter-spacing:var(--type-headline-2-default-letter-spacing);margin:0}.checkout-login-form__heading-label,.checkout-login-form__sign-in,.checkout-login-form__sign-out{grid-column-start:2;color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);justify-self:flex-end}.checkout-login-form__heading-label a,a.checkout-login-form__link{font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing);margin-left:var(--spacing-xxsmall)}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-login-form__heading{grid-template-columns:1fr;grid-template-rows:1fr}.checkout-login-form__heading-label{grid-column-start:1;align-self:flex-start;justify-self:flex-start;margin-top:var(--spacing-medium)}}.checkout-out-of-stock.dropin-card{border-color:var(--color-warning-500)}.checkout-out-of-stock .dropin-card__content{gap:var(--spacing-small);padding:var(--spacing-small)}.checkout-out-of-stock__title{color:var(--color-neutral-900);font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing);margin:0;display:flex;gap:var(--spacing-xxsmall);align-items:center;justify-content:left;text-align:center}.checkout-out-of-stock__message{color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:0}.checkout-out-of-stock__items{display:grid;grid-template-columns:repeat(5,100px);grid-gap:var(--spacing-small);list-style:none;padding:0;margin:0}.checkout-out-of-stock__item img{width:100%;height:auto}.checkout-out-of-stock__actions{display:flex;gap:var(--spacing-small);justify-content:flex-end}a.checkout-out-of-stock__action{color:var(--color-brand-500);font:var(--type-details-caption-1-font);letter-spacing:var(--type-details-caption-1-letter-spacing)}.checkout-out-of-stock__action{color:var(--color-brand-500);font:var(--type-details-caption-1-font);letter-spacing:var(--type-details-caption-1-letter-spacing);background:none;border:none;padding:0;cursor:pointer}.checkout-out-of-stock__action:hover{--textColor: var(--color-brand-700);text-decoration:solid underline var(--textColor);text-underline-offset:6px}@media only screen and (width >= 320px) and (width <= 768px){.checkout-out-of-stock__items{grid-template-columns:repeat(3,100px)}}.checkout-payment-methods__title,.checkout-payment-methods__title h2{color:var(--color-neutral-800);font:var(--type-headline-2-default-font);letter-spacing:var(--type-headline-2-default-letter-spacing);margin:0 0 var(--spacing-medium) 0}.checkout-payment-methods__wrapper{position:relative;display:grid}.checkout-payment-methods__wrapper--busy{opacity:.4;pointer-events:none}.checkout-payment-methods__methods{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-medium)}.checkout-payment-methods__content{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing);margin-top:var(--spacing-xbig)}.checkout-payment-methods__content>div[data-slot=PaymentMethodSlot]:not(:empty){margin-top:var(--spacing-medium)}.checkout-payment-methods--full-width{grid-template-columns:1fr}.checkout-payment-methods__spinner{margin:0 auto;position:absolute;z-index:999;left:0;right:0;top:calc(50% - (var(--size) / 2));bottom:0}.checkout__content [data-slot=PaymentMethods]:empty{display:none}.checkout-payment-methods__error{margin-top:var(--spacing-medium)}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-payment-methods__methods{grid-template-columns:1fr}}.checkout-payment-on-account{margin-bottom:var(--spacing-medium)}.checkout-payment-on-account__form{width:100%}.checkout-payment-on-account__credit{display:flex;justify-content:space-between;align-items:center;padding:var(--spacing-small);margin-bottom:var(--spacing-medium);background-color:var(--color-neutral-100);border:1px solid var(--color-neutral-300);border-radius:4px;font-size:14px;line-height:1.4}.checkout-payment-on-account__credit-label{font-weight:500;color:var(--color-neutral-700)}.checkout-payment-on-account__credit-amount{font-weight:600;color:var(--color-success-600)}.checkout-payment-on-account__exceed-message{margin-top:var(--spacing-medium);margin-bottom:var(--spacing-medium)}.checkout-payment-on-account .dropin-field{margin-bottom:0}.checkout-place-order{display:grid;padding-bottom:var(--spacing-big)}.checkout-place-order__button{align-self:flex-end;justify-self:flex-end}@media only screen and (min-width: 320px) and (max-width: 768px){.checkout-place-order{background-color:var(--color-neutral-200);padding:var(--spacing-medium) var(--spacing-medium) var(--spacing-big) var(--spacing-medium)}.checkout-place-order__button{align-self:center;justify-self:stretch}}.checkout-purchase-order{margin-bottom:var(--spacing-medium)}.checkout-purchase-order__form{width:100%}.checkout-purchase-order .dropin-field{margin-bottom:0}.checkout-server-error{position:relative;text-align:center}.checkout-server-error__icon .error-icon{color:var(--color-alert-500)}.checkout-server-error a{font:var(--type-body-2-strong-font);letter-spacing:var(--type-body-2-strong-letter-spacing)}.checkout-shipping-methods__title,.checkout-shipping-methods__title h3{color:var(--color-neutral-800);font:var(--type-body-1-default-font);letter-spacing:var(--type-body-1-default-letter-spacing);margin:0 0 var(--spacing-medium) 0}.checkout-shipping-methods__content{position:relative;display:block}.checkout-shipping-methods__method{width:fit-content;cursor:pointer;font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.checkout-shipping-methods__options>[data-slot^=checkout-shipping-method-item]{margin-bottom:var(--spacing-medium)}.checkout-shipping-methods__options>[data-slot^=checkout-shipping-method-item]:last-child{margin-bottom:0}.dropin-radio-button__label .dropin-price{color:var(--color-neutral-800);font-weight:400}.checkout-shipping-methods__price--original{margin-right:var(--spacing-xxsmall)}.checkout-shipping-methods__price-wrapper{display:flex;gap:var(--spacing-xxsmall);align-items:center}.checkout-shipping-methods__options--busy{opacity:.4;pointer-events:none}.checkout-shipping-methods__spinner{margin:0 auto;position:absolute;z-index:999;left:0;right:0;top:calc(50% - (var(--size) / 2));bottom:0}.checkout-shipping-methods__options--toggleButton{display:grid;grid-template-columns:1fr 1fr;gap:var(--spacing-medium)}.checkout-shipping-methods__options--toggleButton .dropin-toggle-button__content{justify-content:start;display:grid;grid-template-columns:1fr min-content}.checkout-shipping-methods__options--toggleButton .checkout-shipping-methods__method{width:auto}.checkout-shipping-methods__options--toggleButton>[data-slot^=checkout-shipping-method-item]{margin-bottom:0}.checkout-shipping-methods__error{margin-top:var(--spacing-medium)}.checkout-terms-and-conditions{display:grid}.checkout-terms-and-conditions__error{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);color:var(--color-alert-800);text-align:left;margin-top:var(--spacing-xsmall)}.checkout-terms-and-conditions__error:empty{display:none}
|
|
4
4
|
.checkout__banner{margin-bottom:var(--spacing-xbig)}`,{styleId:"checkout"});
|
|
5
|
-
import{jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{Render as c}from"@dropins/tools/lib.js";import{config as l,
|
|
5
|
+
import{jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{Render as c}from"@dropins/tools/lib.js";import{config as l,l as u}from"../api.js";import{events as m}from"@dropins/tools/event-bus.js";import{UIProvider as h}from"@dropins/tools/components.js";import{useState as g,useEffect as p}from"@dropins/tools/preact-hooks.js";const f={AddressValidation:{title:"Verify your address",subtitle:"To ensure accurate delivery, we suggest the changes highlighted below. Please choose which address you would like to use. If neither option is correct, edit your address.",suggestedAddress:"Suggested Address",originalAddress:"Original Address"},BillToShippingAddress:{cartSyncError:"We were unable to save your changes. Please try again later.",title:"Bill to shipping address"},EmptyCart:{button:"Start shopping",title:"Your cart is empty"},EstimateShipping:{estimated:"Estimated Shipping",freeShipping:"Free",label:"Shipping",taxToBeDetermined:"TBD",withoutTaxes:"Excluding taxes",withTaxes:"Including taxes"},LoginForm:{account:"Already have an account?",ariaLabel:"Email",emailExists:{alreadyHaveAccount:"It looks like you already have an account.",forFasterCheckout:"for a faster checkout.",signInButton:"Sign in"},floatingLabel:"Email *",invalidEmailError:"Please enter a valid email address.",missingEmailError:"Enter an email address.",cartSyncError:"We were unable to save your changes. Please try again later.",placeholder:"Enter your email address",signIn:"Sign In",signOut:"Sign Out",switch:"Do you want to switch account?",title:"Contact details"},MergedCartBanner:{items:{many:"{{count}} items from a previous session were added to your cart. Please review your new subtotal.",one:"1 item from a previous session was added to your cart. Please review your new subtotal."}},OutOfStock:{actions:{removeOutOfStock:"Remove out of stock items",reviewCart:"Review cart"},alert:"Out of stock!",lowInventory:{many:"Only {{count}} left!",one:"Last item!"},message:"The following items are out of stock:",title:"Your cart contains items that are out of stock"},PaymentMethods:{cartSyncError:"We were unable to save your changes. Please try again later.",emptyState:"No payment methods available",title:"Payment"},PaymentOnAccount:{referenceNumberLabel:"Custom Reference Number",referenceNumberPlaceholder:"Enter custom reference number",referenceNumberHint:"",availableCreditLabel:"Available Credit",exceedLimitWarning:"The credit limit is {{creditLimit}}. It will be exceeded by {{exceededAmount}} with this order.",exceedLimitWarningPrefix:"The credit limit is",exceedLimitWarningMiddle:". It will be exceeded by",exceedLimitWarningSuffix:"with this order.",exceedLimitError:"Payment On Account cannot be used for this order because your order amount exceeds your credit amount."},PurchaseOrder:{missingReferenceNumberError:"Reference number is required",referenceNumberHint:"",referenceNumberLabel:"Custom Reference Number",referenceNumberPlaceholder:"Enter custom reference number"},PlaceOrder:{button:"Place Order"},ServerError:{button:"Try again",contactSupport:"If you continue to have issues, please contact support.",title:"We were unable to process your order",unexpected:"An unexpected error occurred while processing your order. Please try again later.",permissionDenied:"You do not have permission to complete checkout. Please contact your administrator for assistance."},Quote:{permissionDenied:"You do not have permission to checkout with this quote.",dataError:"We were unable to retrieve the quote data. Please try again later."},ShippingMethods:{cartSyncError:"We were unable to save your changes. Please try again later.",emptyState:"This order can't be shipped to the address provided. Please review the address details you entered and make sure they're correct.",title:"Shipping options"},Summary:{Edit:"Edit",heading:"Your Cart ({count})"},Addresses:{billToNewAddress:"Bill to new address",shippingAddressTitle:"Shipping address",billingAddressTitle:"Billing address"},TermsAndConditions:{error:"Please accept the Terms and Conditions to continue.",label:"I have read, understand, and accept our <a href='https://www.adobe.com/legal/terms.html' target='_blank'>Terms of Use, Terms of Sales, Privacy Policy, and Return Policy</a>."},title:"Checkout"},y={Checkout:f},b={default:y},w=({children:a})=>{var r;const[e,n]=g(),s=(r=l.getConfig())==null?void 0:r.langDefinitions;p(()=>{const t=m.on("locale",i=>{i!==e&&n(i)},{eager:!0});return()=>{t==null||t.off()}},[e]);const d=u(b,s??{});return o(h,{lang:e,langDefinitions:d,children:a})},A=new c(o(w,{}));export{w as P,A as r};
|
|
6
6
|
//# sourceMappingURL=render.js.map
|
package/chunks/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sources":["/@dropins/storefront-checkout/src/render/Provider.tsx","/@dropins/storefront-checkout/src/render/render.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 { config } from '@/checkout/api';\nimport { UIProvider } from '@adobe-commerce/elsie/components';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { deepmerge } from '@adobe-commerce/elsie/lib/deepmerge';\nimport { events } from '@adobe-commerce/event-bus';\nimport { FunctionComponent } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface IntlProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<IntlProviderProps> = ({\n children,\n}) => {\n const [locale, setLang] = useState<Lang>();\n\n const userLangDefinitions = config.getConfig()?.langDefinitions;\n\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (payload) => {\n if (payload !== locale) setLang(payload as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, [locale]);\n\n // Merge language definitions with user language definitions\n const definitions = deepmerge(langDefinitions, userLangDefinitions ?? {});\n\n return (\n <UIProvider lang={locale} langDefinitions={definitions}>\n {children}\n </UIProvider>\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 { Render } from '@adobe-commerce/elsie/lib';\nimport { Provider } from './Provider';\nexport { Provider };\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","en_US","Provider","children","locale","setLang","useState","userLangDefinitions","_a","config","useEffect","localeEvent","events","payload","definitions","deepmerge","UIProvider","render","Render","jsx"],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sources":["/@dropins/storefront-checkout/src/render/Provider.tsx","/@dropins/storefront-checkout/src/render/render.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 { config } from '@/checkout/api';\nimport { UIProvider } from '@adobe-commerce/elsie/components';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { deepmerge } from '@adobe-commerce/elsie/lib/deepmerge';\nimport { events } from '@adobe-commerce/event-bus';\nimport { FunctionComponent } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface IntlProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<IntlProviderProps> = ({\n children,\n}) => {\n const [locale, setLang] = useState<Lang>();\n\n const userLangDefinitions = config.getConfig()?.langDefinitions;\n\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (payload) => {\n if (payload !== locale) setLang(payload as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, [locale]);\n\n // Merge language definitions with user language definitions\n const definitions = deepmerge(langDefinitions, userLangDefinitions ?? {});\n\n return (\n <UIProvider lang={locale} langDefinitions={definitions}>\n {children}\n </UIProvider>\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 { Render } from '@adobe-commerce/elsie/lib';\nimport { Provider } from './Provider';\nexport { Provider };\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","en_US","Provider","children","locale","setLang","useState","userLangDefinitions","_a","config","useEffect","localeEvent","events","payload","definitions","deepmerge","UIProvider","render","Render","jsx"],"mappings":"isIA4BMA,EAAkB,CACtB,QAASC,CACX,EAMaC,EAAiD,CAAC,CAC7D,SAAAC,CACF,IAAM,OACJ,KAAM,CAACC,EAAQC,CAAO,EAAIC,EAAe,EAEnCC,GAAsBC,EAAAC,EAAO,UAAA,IAAP,YAAAD,EAAoB,gBAEhDE,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GACzB,SACCC,GAAY,CACPA,IAAYT,GAAQC,EAAQQ,CAAe,CACjD,EACA,CAAE,MAAO,EAAK,CAChB,EACA,MAAO,IAAM,CACXF,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAACP,CAAM,CAAC,EAGX,MAAMU,EAAcC,EAAUf,EAAiBO,GAAuB,CAAA,CAAE,EAExE,SACGS,EAAW,CAAA,KAAMZ,EAAQ,gBAAiBU,EACxC,SAAAX,EACH,CAEJ,EC5Cac,EAAS,IAAIC,EAAOC,EAACjB,IAAS,CAAE"}
|
package/chunks/ui.js
ADDED
package/chunks/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sources":["/@dropins/storefront-checkout/src/store/ui.ts"],"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 { signal } from '@adobe-commerce/elsie/lib/signals';\n\n// Tracks when a set address call is expected and in the debounce period (set in api.ts).\n// Used to disable UI elements while pending: BillToShippingAddress checkbox and PlaceOrder button.\nexport const isSetAddressRequestPending = signal(false);\n\n"],"names":["isSetAddressRequestPending","signal"],"mappings":"mDAqBa,MAAAA,EAA6BC,EAAO,EAAK"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as v}from"@dropins/tools/preact-jsx-runtime.js";import{useState as c,useMemo as
|
|
3
|
+
import{jsx as v}from"@dropins/tools/preact-jsx-runtime.js";import{useState as c,useMemo as A,useCallback as p,useEffect as f}from"@dropins/tools/preact-hooks.js";import{A as b}from"../chunks/components.js";import"@dropins/tools/components.js";import"@dropins/tools/lib.js";import"@dropins/tools/preact-compat.js";import{j,g as x}from"../api.js";import{events as g}from"@dropins/tools/event-bus.js";import"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const q=({suggestedAddress:e,handleSelectedAddress:n})=>{const[l,d]=c(null),[r,y]=c(void 0),[C,a]=c(!1),i=A(()=>!e||!r?null:{...r,regionId:void 0,...e},[r,e]),s=p(t=>{var m;const o=(m=t==null?void 0:t.shippingAddresses)==null?void 0:m[0],u=j(o);y(u)},[]);f(()=>{const t=g.on("checkout/initialized",o=>{s(o)},{eager:!0});return()=>{t==null||t.off()}},[s]),f(()=>{const t=x();t&&s(t);const o=g.on("checkout/updated",u=>{s(u)},{eager:!1});return()=>{o==null||o.off()}},[s]);const k=p(async t=>{d(t);const o=t==="suggested"?i:r;a(!0);try{await(n==null?void 0:n({selection:t,address:o}))}finally{a(!1)}},[i,r,n]);return v(b,{busy:C,currentAddress:r,selection:l,suggestedAddress:i,onSelectionChange:k})};export{q as AddressValidation,q as default};
|
|
4
4
|
//# sourceMappingURL=AddressValidation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddressValidation.js","sources":["/@dropins/storefront-checkout/src/containers/AddressValidation/AddressValidation.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 { Container } from '@adobe-commerce/elsie/lib';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\nimport { AddressValidation as AddressValidationComponent } from '@/checkout/components';\nimport { Cart, AddressInput, NegotiableQuote } from '@/checkout/data/models';\nimport { getLatestCheckoutUpdate } from '@/checkout/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { transformAddressToCartAddressInput } from '@/checkout/data/transforms/transform-cart-address';\n\nexport interface AddressValidationProps {\n suggestedAddress: Partial<AddressInput> | null;\n handleSelectedAddress?: (payload: {\n selection: 'suggested' | 'original';\n address: AddressInput | null | undefined;\n }) => void;\n}\n\nexport const AddressValidation: Container<AddressValidationProps> = ({\n suggestedAddress,\n handleSelectedAddress,\n}) => {\n const [selection, setSelection] = useState<'suggested' | 'original' | null>(\n null\n );\n const [currentAddress, setCurrentAddress] = useState<\n AddressInput | null | undefined\n >(undefined);\n const [busy, setBusy] = useState(false);\n\n const mergedSuggestedAddress = useMemo<AddressInput | null>(() => {\n if (!suggestedAddress || !currentAddress) return null;\n return { ...currentAddress, regionId: undefined, ...suggestedAddress };\n }, [currentAddress, suggestedAddress]);\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const addr = (data as Cart | null)?.shippingAddresses?.[0];\n const input = transformAddressToCartAddressInput(addr);\n setCurrentAddress(input);\n },\n []\n );\n\n useEffect(() => {\n const onCheckoutInitialized = events.on(\n 'checkout/initialized',\n (data: Cart | NegotiableQuote | null) => {\n handleCheckoutData(data);\n },\n { eager: true }\n );\n\n return () => {\n onCheckoutInitialized?.off();\n };\n }, [handleCheckoutData]);\n\n useEffect(() => {\n const pastUpdate = getLatestCheckoutUpdate();\n if (pastUpdate) {\n handleCheckoutData(pastUpdate);\n }\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n (data: Cart | NegotiableQuote | null) => {\n handleCheckoutData(data);\n },\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [handleCheckoutData]);\n\n const onSelectionChange = useCallback(\n async (sel: 'suggested' | 'original') => {\n setSelection(sel);\n const chosen =\n sel === 'suggested' ? mergedSuggestedAddress : currentAddress;\n setBusy(true);\n try {\n await handleSelectedAddress?.({ selection: sel, address: chosen });\n } finally {\n setBusy(false);\n }\n },\n [mergedSuggestedAddress, currentAddress, handleSelectedAddress]\n );\n\n return (\n <AddressValidationComponent\n busy={busy}\n currentAddress={currentAddress}\n selection={selection}\n suggestedAddress={mergedSuggestedAddress}\n onSelectionChange={onSelectionChange}\n />\n );\n};\n"],"names":["AddressValidation","suggestedAddress","handleSelectedAddress","selection","setSelection","useState","currentAddress","setCurrentAddress","busy","setBusy","mergedSuggestedAddress","useMemo","handleCheckoutData","useCallback","data","addr","_a","input","transformAddressToCartAddressInput","useEffect","onCheckoutInitialized","events","pastUpdate","getLatestCheckoutUpdate","onCheckoutUpdated","onSelectionChange","sel","chosen","jsx","AddressValidationComponent"],"mappings":"
|
|
1
|
+
{"version":3,"file":"AddressValidation.js","sources":["/@dropins/storefront-checkout/src/containers/AddressValidation/AddressValidation.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 { Container } from '@adobe-commerce/elsie/lib';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\nimport { AddressValidation as AddressValidationComponent } from '@/checkout/components';\nimport { Cart, AddressInput, NegotiableQuote } from '@/checkout/data/models';\nimport { getLatestCheckoutUpdate } from '@/checkout/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { transformAddressToCartAddressInput } from '@/checkout/data/transforms/transform-cart-address';\n\nexport interface AddressValidationProps {\n suggestedAddress: Partial<AddressInput> | null;\n handleSelectedAddress?: (payload: {\n selection: 'suggested' | 'original';\n address: AddressInput | null | undefined;\n }) => void;\n}\n\nexport const AddressValidation: Container<AddressValidationProps> = ({\n suggestedAddress,\n handleSelectedAddress,\n}) => {\n const [selection, setSelection] = useState<'suggested' | 'original' | null>(\n null\n );\n const [currentAddress, setCurrentAddress] = useState<\n AddressInput | null | undefined\n >(undefined);\n const [busy, setBusy] = useState(false);\n\n const mergedSuggestedAddress = useMemo<AddressInput | null>(() => {\n if (!suggestedAddress || !currentAddress) return null;\n return { ...currentAddress, regionId: undefined, ...suggestedAddress };\n }, [currentAddress, suggestedAddress]);\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const addr = (data as Cart | null)?.shippingAddresses?.[0];\n const input = transformAddressToCartAddressInput(addr);\n setCurrentAddress(input);\n },\n []\n );\n\n useEffect(() => {\n const onCheckoutInitialized = events.on(\n 'checkout/initialized',\n (data: Cart | NegotiableQuote | null) => {\n handleCheckoutData(data);\n },\n { eager: true }\n );\n\n return () => {\n onCheckoutInitialized?.off();\n };\n }, [handleCheckoutData]);\n\n useEffect(() => {\n const pastUpdate = getLatestCheckoutUpdate();\n if (pastUpdate) {\n handleCheckoutData(pastUpdate);\n }\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n (data: Cart | NegotiableQuote | null) => {\n handleCheckoutData(data);\n },\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [handleCheckoutData]);\n\n const onSelectionChange = useCallback(\n async (sel: 'suggested' | 'original') => {\n setSelection(sel);\n const chosen =\n sel === 'suggested' ? mergedSuggestedAddress : currentAddress;\n setBusy(true);\n try {\n await handleSelectedAddress?.({ selection: sel, address: chosen });\n } finally {\n setBusy(false);\n }\n },\n [mergedSuggestedAddress, currentAddress, handleSelectedAddress]\n );\n\n return (\n <AddressValidationComponent\n busy={busy}\n currentAddress={currentAddress}\n selection={selection}\n suggestedAddress={mergedSuggestedAddress}\n onSelectionChange={onSelectionChange}\n />\n );\n};\n"],"names":["AddressValidation","suggestedAddress","handleSelectedAddress","selection","setSelection","useState","currentAddress","setCurrentAddress","busy","setBusy","mergedSuggestedAddress","useMemo","handleCheckoutData","useCallback","data","addr","_a","input","transformAddressToCartAddressInput","useEffect","onCheckoutInitialized","events","pastUpdate","getLatestCheckoutUpdate","onCheckoutUpdated","onSelectionChange","sel","chosen","jsx","AddressValidationComponent"],"mappings":"+gBAiCO,MAAMA,EAAuD,CAAC,CACnE,iBAAAC,EACA,sBAAAC,CACF,IAAM,CACE,KAAA,CAACC,EAAWC,CAAY,EAAIC,EAChC,IACF,EACM,CAACC,EAAgBC,CAAiB,EAAIF,EAE1C,MAAS,EACL,CAACG,EAAMC,CAAO,EAAIJ,EAAS,EAAK,EAEhCK,EAAyBC,EAA6B,IACtD,CAACV,GAAoB,CAACK,EAAuB,KAC1C,CAAE,GAAGA,EAAgB,SAAU,OAAW,GAAGL,CAAiB,EACpE,CAACK,EAAgBL,CAAgB,CAAC,EAE/BW,EAAqBC,EACxBC,GAAwC,OACjC,MAAAC,GAAQC,EAAAF,GAAA,YAAAA,EAAsB,oBAAtB,YAAAE,EAA0C,GAClDC,EAAQC,EAAmCH,CAAI,EACrDR,EAAkBU,CAAK,CACzB,EACA,CAAA,CACF,EAEAE,EAAU,IAAM,CACd,MAAMC,EAAwBC,EAAO,GACnC,uBACCP,GAAwC,CACvCF,EAAmBE,CAAI,CACzB,EACA,CAAE,MAAO,EAAK,CAChB,EAEA,MAAO,IAAM,CACXM,GAAA,MAAAA,EAAuB,KACzB,CAAA,EACC,CAACR,CAAkB,CAAC,EAEvBO,EAAU,IAAM,CACd,MAAMG,EAAaC,EAAwB,EACvCD,GACFV,EAAmBU,CAAU,EAG/B,MAAME,EAAoBH,EAAO,GAC/B,mBACCP,GAAwC,CACvCF,EAAmBE,CAAI,CACzB,EACA,CAAE,MAAO,EAAM,CACjB,EAEA,MAAO,IAAM,CACXU,GAAA,MAAAA,EAAmB,KACrB,CAAA,EACC,CAACZ,CAAkB,CAAC,EAEvB,MAAMa,EAAoBZ,EACxB,MAAOa,GAAkC,CACvCtB,EAAasB,CAAG,EACV,MAAAC,EACJD,IAAQ,YAAchB,EAAyBJ,EACjDG,EAAQ,EAAI,EACR,GAAA,CACF,MAAMP,GAAA,YAAAA,EAAwB,CAAE,UAAWwB,EAAK,QAASC,IAAQ,QACjE,CACAlB,EAAQ,EAAK,CAAA,CAEjB,EACA,CAACC,EAAwBJ,EAAgBJ,CAAqB,CAChE,EAGE,OAAA0B,EAACC,EAAA,CACC,KAAArB,EACA,eAAAF,EACA,UAAAH,EACA,iBAAkBO,EAClB,kBAAAe,CAAA,CACF,CAEJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as
|
|
3
|
+
import{jsx as R}from"@dropins/tools/preact-jsx-runtime.js";import{a as U,c as j,setBillingAddress as V,config as q,n as L,g as $,d as v}from"../api.js";import"@dropins/tools/lib.js";import{events as b}from"@dropins/tools/event-bus.js";import{B as w}from"../chunks/components.js";import"@dropins/tools/components.js";import{i as C}from"../chunks/ui.js";import{useState as m,useRef as F,useCallback as h,useEffect as g}from"@dropins/tools/preact-hooks.js";import{useText as G}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/preact-compat.js";const ss=({active:e=!0,autoSync:f=!0,onCartSyncError:t,onChange:u})=>{const[D,d]=m(null),[S,x]=m(!1),[r,l]=m(),c=F(!1),E=U.value||C.value,{cartSyncError:A}=G({cartSyncError:"Checkout.BillToShippingAddress.cartSyncError"}),I=h(()=>{d(null)},[]),z=h(s=>{d(null),l(s),u==null||u(s),!(!f||!s||!j())&&V({sameAsShipping:!0}).catch(i=>{l(!1),t==null||t({error:i}),t||d(A)})},[f,A,t,u]),n=h(s=>{var T;const i=!s||s.isEmpty,o=!!(s!=null&&s.isVirtual);if(i||o){x(o),l(!1),c.current=!1;return}if(c.current)return;const B=s,a=(T=B.shippingAddresses)==null?void 0:T[0],k=!!B.billingAddress;let p;if(a)p=a.sameAsBilling??!k;else{const{defaults:P}=q.getConfig();p=P.isBillToShipping}l(p),c.current=!0,f&&p&&a&&!k&&V({sameAsShipping:!0}).catch(()=>{})},[]);return g(()=>{!e||r===void 0||L({isBillToShipping:r})},[e,r]),g(()=>{if(!e)return;const s=$();if(s){const o=v("isBillToShipping");o!=null&&l(o),n(s);return}const i=b.on("checkout/initialized",n,{eager:!0});return()=>{i==null||i.off()}},[e,n]),g(()=>{if(!e)return;const s=b.on("checkout/updated",n,{eager:!1});return()=>{s==null||s.off()}},[e,n]),R(w,{checked:r,disabled:E,error:D,initialized:r!==void 0,visible:e&&!S,onChange:z,onDismissError:I})};export{ss as BillToShippingAddress,ss as default};
|
|
4
4
|
//# sourceMappingURL=BillToShippingAddress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BillToShippingAddress.js","sources":["/@dropins/storefront-checkout/src/containers/BillToShippingAddress/BillToShippingAddress.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 { config, setBillingAddress } from '@/checkout/api';\nimport { BillToShippingAddress as BillToShippingAddressComponent } from '@/checkout/components/BillToShippingAddress';\nimport { Cart, NegotiableQuote } from '@/checkout/data/models';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasPendingUpdates,\n hasShippingAddress,\n notifyValues,\n} from '@/checkout/lib';\nimport { isSetAddressRequestPending } from '@/checkout/store/ui';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\n\ninterface CartSyncError {\n error: Error;\n}\n\nexport interface BillToShippingAddressProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n active?: boolean;\n autoSync?: boolean;\n onCartSyncError?: (error: CartSyncError) => void;\n onChange?: (checked: boolean) => void;\n}\n\nexport const BillToShippingAddress: Container<BillToShippingAddressProps> = ({\n active = true,\n autoSync = true,\n onCartSyncError,\n onChange,\n}) => {\n const [error, setError] = useState<string | null>(null);\n const [isVirtual, setIsVirtual] = useState(false);\n const [isChecked, setIsChecked] = useState<boolean | undefined>();\n\n const hasInitialCartData = useRef(false);\n\n const isDisabled = hasPendingUpdates.value || isSetAddressRequestPending.value;\n\n const { cartSyncError } = useText({\n cartSyncError: 'Checkout.BillToShippingAddress.cartSyncError',\n });\n\n const handleDismissError = useCallback(() => {\n setError(null);\n }, []);\n\n const handleChange = useCallback(\n (isBillToShipping: boolean) => {\n setError(null);\n setIsChecked(isBillToShipping);\n\n onChange?.(isBillToShipping);\n\n if (!autoSync || !isBillToShipping || !hasShippingAddress()) {\n return;\n }\n\n setBillingAddress({ sameAsShipping: true }).catch((error: any) => {\n setIsChecked(false);\n onCartSyncError?.({ error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [autoSync, cartSyncError, onCartSyncError, onChange]\n );\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const isCartEmpty = !data || data.isEmpty;\n const isCartVirtual = !!data?.isVirtual;\n\n if (isCartEmpty || isCartVirtual) {\n setIsVirtual(isCartVirtual);\n setIsChecked(false);\n hasInitialCartData.current = false;\n return;\n }\n\n // If we've already set the initial state from cart data, don't override it.\n // This preserves any changes the user might have made.\n if (hasInitialCartData.current) {\n return;\n }\n\n const cart = data as Cart;\n const shippingAddress = cart.shippingAddresses?.[0];\n const hasBillingAddress = !!cart.billingAddress;\n\n let initialIsChecked: boolean;\n\n if (!shippingAddress) {\n const { defaults } = config.getConfig();\n initialIsChecked = defaults!.isBillToShipping!;\n } else {\n initialIsChecked = shippingAddress.sameAsBilling ?? !hasBillingAddress;\n }\n\n setIsChecked(initialIsChecked);\n hasInitialCartData.current = true;\n\n if (\n autoSync &&\n initialIsChecked &&\n shippingAddress &&\n !hasBillingAddress\n ) {\n setBillingAddress({ sameAsShipping: true }).catch(() => {});\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useEffect(() => {\n if (!active || isChecked === undefined) return;\n notifyValues({ isBillToShipping: isChecked });\n }, [active, isChecked]);\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 userBillToShipping = getValue('isBillToShipping');\n if (userBillToShipping != null) {\n setIsChecked(userBillToShipping);\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 {\n eager: false,\n }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n return (\n <BillToShippingAddressComponent\n checked={isChecked}\n disabled={isDisabled}\n error={error}\n initialized={isChecked !== undefined}\n visible={active && !isVirtual}\n onChange={handleChange}\n onDismissError={handleDismissError}\n />\n );\n};\n"],"names":["BillToShippingAddress","active","autoSync","onCartSyncError","onChange","error","setError","useState","isVirtual","setIsVirtual","isChecked","setIsChecked","hasInitialCartData","useRef","isDisabled","hasPendingUpdates","isSetAddressRequestPending","cartSyncError","useText","handleDismissError","useCallback","handleChange","isBillToShipping","hasShippingAddress","setBillingAddress","handleCheckoutData","data","isCartEmpty","isCartVirtual","cart","shippingAddress","_a","hasBillingAddress","initialIsChecked","defaults","config","useEffect","notifyValues","pastUpdate","getLatestCheckoutUpdate","userBillToShipping","getValue","onCheckoutInit","events","onCheckoutUpdated","jsx","BillToShippingAddressComponent"],"mappings":"
|
|
1
|
+
{"version":3,"file":"BillToShippingAddress.js","sources":["/@dropins/storefront-checkout/src/containers/BillToShippingAddress/BillToShippingAddress.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 { config, setBillingAddress } from '@/checkout/api';\nimport { BillToShippingAddress as BillToShippingAddressComponent } from '@/checkout/components/BillToShippingAddress';\nimport { Cart, NegotiableQuote } from '@/checkout/data/models';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasPendingUpdates,\n hasShippingAddress,\n notifyValues,\n} from '@/checkout/lib';\nimport { isSetAddressRequestPending } from '@/checkout/store/ui';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useRef, useState } from 'preact/hooks';\n\ninterface CartSyncError {\n error: Error;\n}\n\nexport interface BillToShippingAddressProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n active?: boolean;\n autoSync?: boolean;\n onCartSyncError?: (error: CartSyncError) => void;\n onChange?: (checked: boolean) => void;\n}\n\nexport const BillToShippingAddress: Container<BillToShippingAddressProps> = ({\n active = true,\n autoSync = true,\n onCartSyncError,\n onChange,\n}) => {\n const [error, setError] = useState<string | null>(null);\n const [isVirtual, setIsVirtual] = useState(false);\n const [isChecked, setIsChecked] = useState<boolean | undefined>();\n\n const hasInitialCartData = useRef(false);\n\n const isDisabled = hasPendingUpdates.value || isSetAddressRequestPending.value;\n\n const { cartSyncError } = useText({\n cartSyncError: 'Checkout.BillToShippingAddress.cartSyncError',\n });\n\n const handleDismissError = useCallback(() => {\n setError(null);\n }, []);\n\n const handleChange = useCallback(\n (isBillToShipping: boolean) => {\n setError(null);\n setIsChecked(isBillToShipping);\n\n onChange?.(isBillToShipping);\n\n if (!autoSync || !isBillToShipping || !hasShippingAddress()) {\n return;\n }\n\n setBillingAddress({ sameAsShipping: true }).catch((error: any) => {\n setIsChecked(false);\n onCartSyncError?.({ error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [autoSync, cartSyncError, onCartSyncError, onChange]\n );\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const isCartEmpty = !data || data.isEmpty;\n const isCartVirtual = !!data?.isVirtual;\n\n if (isCartEmpty || isCartVirtual) {\n setIsVirtual(isCartVirtual);\n setIsChecked(false);\n hasInitialCartData.current = false;\n return;\n }\n\n // If we've already set the initial state from cart data, don't override it.\n // This preserves any changes the user might have made.\n if (hasInitialCartData.current) {\n return;\n }\n\n const cart = data as Cart;\n const shippingAddress = cart.shippingAddresses?.[0];\n const hasBillingAddress = !!cart.billingAddress;\n\n let initialIsChecked: boolean;\n\n if (!shippingAddress) {\n const { defaults } = config.getConfig();\n initialIsChecked = defaults!.isBillToShipping!;\n } else {\n initialIsChecked = shippingAddress.sameAsBilling ?? !hasBillingAddress;\n }\n\n setIsChecked(initialIsChecked);\n hasInitialCartData.current = true;\n\n if (\n autoSync &&\n initialIsChecked &&\n shippingAddress &&\n !hasBillingAddress\n ) {\n setBillingAddress({ sameAsShipping: true }).catch(() => {});\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n useEffect(() => {\n if (!active || isChecked === undefined) return;\n notifyValues({ isBillToShipping: isChecked });\n }, [active, isChecked]);\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 userBillToShipping = getValue('isBillToShipping');\n if (userBillToShipping != null) {\n setIsChecked(userBillToShipping);\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 {\n eager: false,\n }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n return (\n <BillToShippingAddressComponent\n checked={isChecked}\n disabled={isDisabled}\n error={error}\n initialized={isChecked !== undefined}\n visible={active && !isVirtual}\n onChange={handleChange}\n onDismissError={handleDismissError}\n />\n );\n};\n"],"names":["BillToShippingAddress","active","autoSync","onCartSyncError","onChange","error","setError","useState","isVirtual","setIsVirtual","isChecked","setIsChecked","hasInitialCartData","useRef","isDisabled","hasPendingUpdates","isSetAddressRequestPending","cartSyncError","useText","handleDismissError","useCallback","handleChange","isBillToShipping","hasShippingAddress","setBillingAddress","handleCheckoutData","data","isCartEmpty","isCartVirtual","cart","shippingAddress","_a","hasBillingAddress","initialIsChecked","defaults","config","useEffect","notifyValues","pastUpdate","getLatestCheckoutUpdate","userBillToShipping","getValue","onCheckoutInit","events","onCheckoutUpdated","jsx","BillToShippingAddressComponent"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{E as M}from"../chunks/components.js";import"@dropins/tools/lib.js";import{Price as l}from"@dropins/tools/components.js";import{
|
|
3
|
+
import{jsx as r}from"@dropins/tools/preact-jsx-runtime.js";import{E as M}from"../chunks/components.js";import"@dropins/tools/lib.js";import{Price as l}from"@dropins/tools/components.js";import"@dropins/tools/preact-compat.js";import{useState as N,useCallback as S,useEffect as m}from"@dropins/tools/preact-hooks.js";import{s as B,T as D,g as U}from"../api.js";import{events as h}from"@dropins/tools/event-bus.js";import{useText as G}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const J=({active:i=!0})=>{var d;const[e,a]=N(),c=(e==null?void 0:e.amount.value)===0,x=(d=B.config)==null?void 0:d.shoppingCartDisplaySetting.shipping,I=x===D.INCLUDING_EXCLUDING_TAX,f=x===D.INCLUDING_TAX,p=G({freeShipping:"Checkout.EstimateShipping.freeShipping",taxToBeDetermined:"Checkout.EstimateShipping.taxToBeDetermined",label:"Checkout.EstimateShipping.label",estimated:"Checkout.EstimateShipping.estimated"}),s=S(t=>{var E;const n=!t||t.isEmpty,o=!!(t!=null&&t.isVirtual);if(n||o){a(null);return}const u=(E=t.shippingAddresses)==null?void 0:E[0];if(!u)return;const T=u==null?void 0:u.selectedShippingMethod;if(!T){a(null);return}const{amount:y,amountExclTax:k,amountInclTax:L}=T;a({estimated:!1,amount:y,amountExclTax:k,amountInclTax:L})},[]),g=S(t=>{let n=null;if(t.shippingMethod){const o=t.shippingMethod;n={estimated:!0,amount:o.amount,amountExclTax:o.amountExclTax,amountInclTax:o.amountInclTax}}a(n)},[]);m(()=>{if(!i)return;const t=h.on("shipping/estimate",g,{eager:!0});return()=>{t==null||t.off()}},[i,g]),m(()=>{if(!i)return;const t=U();if(t){s(t);return}const n=h.on("checkout/initialized",s,{eager:!0});return()=>{n==null||n.off()}},[i,s]),m(()=>{if(!i)return;const t=h.on("checkout/updated",s,{eager:!1});return()=>{t==null||t.off()}},[i,s]);const C=()=>c?r("span",{"data-testid":"free-shipping",children:p.freeShipping}):f&&(e!=null&&e.amountInclTax)?r(l,{amount:e.amountInclTax.value,currency:e.amountInclTax.currency,"data-testid":"shipping"}):r(l,{amount:e==null?void 0:e.amount.value,currency:e==null?void 0:e.amount.currency,"data-testid":"shipping"}),b=()=>e!=null&&e.amountExclTax?r(l,{amount:e.amountExclTax.value,currency:e.amountExclTax.currency,"data-testid":"shipping-excluding-tax"}):r("span",{children:p.taxToBeDetermined});return r(M,{initialized:e!==void 0,label:(()=>{const t=e!=null&&e.estimated?p.estimated:p.label;return r("span",{"data-testid":"estimate-shipping-label",children:t})})(),price:C(),priceExclTax:b(),taxExcluded:I&&!c,taxIncluded:f&&!c,visible:i&&e!==null})};export{J as EstimateShipping,J as default};
|
|
4
4
|
//# sourceMappingURL=EstimateShipping.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EstimateShipping.js","sources":["/@dropins/storefront-checkout/src/containers/EstimateShipping/EstimateShipping.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { EstimateShipping as EstimateShippingComponent } from '@/checkout/components';\nimport {\n Cart,\n Money as PriceModel,\n ShippingEstimate,\n TaxDisplay,\n} from '@/checkout/data/models';\nimport { getLatestCheckoutUpdate } from '@/checkout/lib';\nimport { state } from '@/checkout/lib/state';\nimport { Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\ninterface ShippingData {\n estimated?: boolean;\n amount: PriceModel;\n amountExclTax?: PriceModel;\n amountInclTax?: PriceModel;\n}\n\nexport interface EstimateShippingProps {\n active?: boolean;\n}\n\nexport const EstimateShipping: Container<EstimateShippingProps> = ({\n active = true,\n}) => {\n const [data, setData] = useState<ShippingData | null | undefined>();\n\n const isFreeShipping = data?.amount.value === 0;\n const shippingDisplay = state.config?.shoppingCartDisplaySetting.shipping;\n const taxExcluded = shippingDisplay === TaxDisplay.INCLUDING_EXCLUDING_TAX;\n const taxIncluded = shippingDisplay === TaxDisplay.INCLUDING_TAX;\n\n const translations = useText({\n freeShipping: 'Checkout.EstimateShipping.freeShipping',\n taxToBeDetermined: 'Checkout.EstimateShipping.taxToBeDetermined',\n label: 'Checkout.EstimateShipping.label',\n estimated: 'Checkout.EstimateShipping.estimated',\n });\n\n const handleCheckoutData = useCallback((data: Cart | null) => {\n const isEmptyCart = !data || data.isEmpty;\n const isVirtualCart = Boolean(data?.isVirtual);\n\n if (isEmptyCart || isVirtualCart) {\n setData(null);\n return;\n }\n\n const primaryAddress = data.shippingAddresses?.[0];\n\n if (!primaryAddress) {\n return;\n }\n\n const shippingMethod = primaryAddress?.selectedShippingMethod;\n\n if (!shippingMethod) {\n setData(null);\n return;\n }\n\n const { amount, amountExclTax, amountInclTax } = shippingMethod;\n setData({ estimated: false, amount, amountExclTax, amountInclTax });\n }, []);\n\n const handleShippingEstimate = useCallback((estimation: ShippingEstimate) => {\n let shippingData: ShippingData | null = null;\n\n if (estimation.shippingMethod) {\n const shippingMethod = estimation.shippingMethod;\n\n shippingData = {\n estimated: true,\n amount: shippingMethod.amount,\n amountExclTax: shippingMethod.amountExclTax,\n amountInclTax: shippingMethod.amountInclTax,\n };\n }\n\n setData(shippingData);\n }, []);\n\n useEffect(() => {\n if (!active) 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 useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\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 const renderPrice = () => {\n if (isFreeShipping) {\n return (\n <span data-testid=\"free-shipping\">{translations.freeShipping}</span>\n );\n }\n\n if (taxIncluded && data?.amountInclTax) {\n return (\n <Price\n amount={data.amountInclTax.value}\n currency={data.amountInclTax.currency}\n data-testid=\"shipping\"\n />\n );\n }\n\n return (\n <Price\n amount={data?.amount.value}\n currency={data?.amount.currency}\n data-testid=\"shipping\"\n />\n );\n };\n\n const renderPriceExclTax = () => {\n if (!data?.amountExclTax)\n return <span>{translations.taxToBeDetermined}</span>;\n\n return (\n <Price\n amount={data.amountExclTax.value}\n currency={data.amountExclTax.currency}\n data-testid=\"shipping-excluding-tax\"\n />\n );\n };\n\n const renderLabel = () => {\n const label = data?.estimated ? translations.estimated : translations.label;\n return <span data-testid=\"estimate-shipping-label\">{label}</span>;\n };\n\n return (\n <EstimateShippingComponent\n initialized={data !== undefined}\n label={renderLabel()}\n price={renderPrice()}\n priceExclTax={renderPriceExclTax()}\n taxExcluded={taxExcluded && !isFreeShipping}\n taxIncluded={taxIncluded && !isFreeShipping}\n visible={active && data !== null}\n />\n );\n};\n"],"names":["EstimateShipping","active","data","setData","useState","isFreeShipping","shippingDisplay","_a","state","taxExcluded","TaxDisplay","taxIncluded","translations","useText","handleCheckoutData","useCallback","isEmptyCart","isVirtualCart","primaryAddress","shippingMethod","amount","amountExclTax","amountInclTax","handleShippingEstimate","estimation","shippingData","useEffect","onShippingEstimate","events","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","onCheckoutUpdated","renderPrice","jsx","Price","renderPriceExclTax","EstimateShippingComponent","label"],"mappings":"
|
|
1
|
+
{"version":3,"file":"EstimateShipping.js","sources":["/@dropins/storefront-checkout/src/containers/EstimateShipping/EstimateShipping.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { EstimateShipping as EstimateShippingComponent } from '@/checkout/components';\nimport {\n Cart,\n Money as PriceModel,\n ShippingEstimate,\n TaxDisplay,\n} from '@/checkout/data/models';\nimport { getLatestCheckoutUpdate } from '@/checkout/lib';\nimport { state } from '@/checkout/lib/state';\nimport { Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\ninterface ShippingData {\n estimated?: boolean;\n amount: PriceModel;\n amountExclTax?: PriceModel;\n amountInclTax?: PriceModel;\n}\n\nexport interface EstimateShippingProps {\n active?: boolean;\n}\n\nexport const EstimateShipping: Container<EstimateShippingProps> = ({\n active = true,\n}) => {\n const [data, setData] = useState<ShippingData | null | undefined>();\n\n const isFreeShipping = data?.amount.value === 0;\n const shippingDisplay = state.config?.shoppingCartDisplaySetting.shipping;\n const taxExcluded = shippingDisplay === TaxDisplay.INCLUDING_EXCLUDING_TAX;\n const taxIncluded = shippingDisplay === TaxDisplay.INCLUDING_TAX;\n\n const translations = useText({\n freeShipping: 'Checkout.EstimateShipping.freeShipping',\n taxToBeDetermined: 'Checkout.EstimateShipping.taxToBeDetermined',\n label: 'Checkout.EstimateShipping.label',\n estimated: 'Checkout.EstimateShipping.estimated',\n });\n\n const handleCheckoutData = useCallback((data: Cart | null) => {\n const isEmptyCart = !data || data.isEmpty;\n const isVirtualCart = Boolean(data?.isVirtual);\n\n if (isEmptyCart || isVirtualCart) {\n setData(null);\n return;\n }\n\n const primaryAddress = data.shippingAddresses?.[0];\n\n if (!primaryAddress) {\n return;\n }\n\n const shippingMethod = primaryAddress?.selectedShippingMethod;\n\n if (!shippingMethod) {\n setData(null);\n return;\n }\n\n const { amount, amountExclTax, amountInclTax } = shippingMethod;\n setData({ estimated: false, amount, amountExclTax, amountInclTax });\n }, []);\n\n const handleShippingEstimate = useCallback((estimation: ShippingEstimate) => {\n let shippingData: ShippingData | null = null;\n\n if (estimation.shippingMethod) {\n const shippingMethod = estimation.shippingMethod;\n\n shippingData = {\n estimated: true,\n amount: shippingMethod.amount,\n amountExclTax: shippingMethod.amountExclTax,\n amountInclTax: shippingMethod.amountInclTax,\n };\n }\n\n setData(shippingData);\n }, []);\n\n useEffect(() => {\n if (!active) 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 useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\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 const renderPrice = () => {\n if (isFreeShipping) {\n return (\n <span data-testid=\"free-shipping\">{translations.freeShipping}</span>\n );\n }\n\n if (taxIncluded && data?.amountInclTax) {\n return (\n <Price\n amount={data.amountInclTax.value}\n currency={data.amountInclTax.currency}\n data-testid=\"shipping\"\n />\n );\n }\n\n return (\n <Price\n amount={data?.amount.value}\n currency={data?.amount.currency}\n data-testid=\"shipping\"\n />\n );\n };\n\n const renderPriceExclTax = () => {\n if (!data?.amountExclTax)\n return <span>{translations.taxToBeDetermined}</span>;\n\n return (\n <Price\n amount={data.amountExclTax.value}\n currency={data.amountExclTax.currency}\n data-testid=\"shipping-excluding-tax\"\n />\n );\n };\n\n const renderLabel = () => {\n const label = data?.estimated ? translations.estimated : translations.label;\n return <span data-testid=\"estimate-shipping-label\">{label}</span>;\n };\n\n return (\n <EstimateShippingComponent\n initialized={data !== undefined}\n label={renderLabel()}\n price={renderPrice()}\n priceExclTax={renderPriceExclTax()}\n taxExcluded={taxExcluded && !isFreeShipping}\n taxIncluded={taxIncluded && !isFreeShipping}\n visible={active && data !== null}\n />\n );\n};\n"],"names":["EstimateShipping","active","data","setData","useState","isFreeShipping","shippingDisplay","_a","state","taxExcluded","TaxDisplay","taxIncluded","translations","useText","handleCheckoutData","useCallback","isEmptyCart","isVirtualCart","primaryAddress","shippingMethod","amount","amountExclTax","amountInclTax","handleShippingEstimate","estimation","shippingData","useEffect","onShippingEstimate","events","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","onCheckoutUpdated","renderPrice","jsx","Price","renderPriceExclTax","EstimateShippingComponent","label"],"mappings":"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"}
|
package/containers/LoginForm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as n,jsxs as re,Fragment as ne}from"@dropins/tools/preact-jsx-runtime.js";import{
|
|
3
|
+
import{jsx as n,jsxs as re,Fragment as ne}from"@dropins/tools/preact-jsx-runtime.js";import{e as F,f as ae,isEmailAvailable as oe,setGuestEmailOnCart as se,n as H,d as q,getCustomer as ue,g as le}from"../api.js";import{Slot as I}from"@dropins/tools/lib.js";import{events as y}from"@dropins/tools/event-bus.js";import"@dropins/tools/components.js";import{f as ce,g as me,L as fe}from"../chunks/components.js";import{useState as c,useRef as he,useCallback as s,useEffect as z,useMemo as b}from"@dropins/tools/preact-hooks.js";import{useText as ge}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";import"@dropins/tools/preact-compat.js";const de=1e3,ye=({active:a=!0,autoSync:B=!0,displayHeadingContent:M=!0,displayTitle:D=!0,initialData:Ee,onCartSyncError:m,onSignInClick:g,onSignOutClick:d,onValidationError:u,slots:r,...w})=>{const[J,K]=c(null),[E,x]=c(""),[Q,l]=c(""),[f,W]=c(!1),[V,v]=c(!0),[X,j]=c(!1),o=he(null),{alreadyHaveAccountHint:U,cartSyncError:G,defaultTitle:N,fasterCheckoutHint:P,invalidEmailError:p,missingEmailError:L,signInLabel:R}=ge({alreadyHaveAccountHint:"Checkout.LoginForm.emailExists.alreadyHaveAccount",cartSyncError:"Checkout.LoginForm.cartSyncError",defaultTitle:"Checkout.LoginForm.title",fasterCheckoutHint:"Checkout.LoginForm.emailExists.forFasterCheckout",invalidEmailError:"Checkout.LoginForm.invalidEmailError",missingEmailError:"Checkout.LoginForm.missingEmailError",signInLabel:"Checkout.LoginForm.emailExists.signInButton"}),k=s(e=>{!F(e)||e===ae()||(oe(e).then(t=>{v(t)}).catch(t=>{console.error(t),v(!0)}),B&&se(e).catch(t=>{m==null||m({email:e,error:t}),m||l(G)}))},[B,m,G]),Y=s(e=>{const i=e.target.value;x(i),v(!0),l(""),o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{k(i),H({email:i}),o.current=null},de)},[k]),Z=s(e=>{const t=e.target,i=t.value.trim();if(F(i)){if(l(""),t.setCustomValidity(""),!o.current)return;clearTimeout(o.current),o.current=null,k(i),H({email:i});return}const $=i===""?"missing":"invalid",T=$==="missing"?L:p;if(u){u({email:i,message:T,type:$});return}l(T),t.setCustomValidity(T)},[p,L,u,k]),O=s(e=>{const t=e.target,i=t.validity,A=i.valueMissing?L:p;if(!u){l(A);return}u({email:t.value,message:A,type:i.valueMissing?"missing":"invalid"})},[L,p,u]),C=s(()=>{const e=q("email")??"",t=F(e);g==null||g(t?e:"")},[g]),_=s(()=>{d==null||d()},[d]),h=s(e=>{const t=q("email")??"",i=(e==null?void 0:e.email)??"";i!==t&&(x(i),l(""),v(!0),H({email:i}))},[]);z(()=>{if(!a)return;const e=y.on("authenticated",t=>{W(t),ue().then(i=>{K(i)}).catch(console.error)},{eager:!0});return()=>{e==null||e.off()}},[a]),z(()=>{if(!a)return;const e=le();if(e){j(!0);const i=e.email??"";i&&x(i),h(e);return}const t=y.on("checkout/initialized",i=>{j(!0),h(i)},{eager:!0});return()=>{t==null||t.off()}},[a,h]),z(()=>{if(!a)return;const e=y.on("checkout/updated",h,{eager:!1});return()=>{e==null||e.off()}},[a,h]);const S=b(()=>{if(D)return n(I,{name:"checkout-login-form-title",slot:r==null?void 0:r.Title,children:n("h2",{children:N})})},[D,r,N]),ee=b(()=>{if(M)return n(I,{context:{authenticated:f},name:"checkout-login-form-heading-label",slot:r==null?void 0:r.Heading,children:f?n(ce,{onClick:_}):n(me,{onClick:C})})},[M,f,r,C,_]),te=b(()=>V?"":re(ne,{children:[U," ",n("a",{href:"#",onClick:C,children:R})," ",P]}),[V,U,R,P,C]),ie=b(()=>n(I,{context:{email:E,isEmailValid:F(E),isAuthenticated:f},name:"checkout-login-form-preferences",slot:r==null?void 0:r.Preferences}),[E,f,r]);return n(fe,{...w,customer:J,email:E,error:Q,headingContent:ee,hint:te,initialized:X,preferences:ie,title:S,visible:a,onEmailBlur:Z,onEmailChange:Y,onEmailInvalid:O})};export{ye as LoginForm,ye as default};
|
|
4
4
|
//# sourceMappingURL=LoginForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.js","sources":["/@dropins/storefront-checkout/src/containers/LoginForm/LoginForm.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 {\n getCustomer,\n isEmailAvailable,\n setGuestEmailOnCart,\n} from '@/checkout/api';\nimport {\n LoginForm as LoginFormComponent,\n SignIn,\n SignOut,\n} from '@/checkout/components/LoginForm';\nimport { Cart, Customer, NegotiableQuote } from '@/checkout/data/models';\nimport {\n getCartEmail,\n getLatestCheckoutUpdate,\n getValue,\n notifyValues,\n validateEmail,\n} from '@/checkout/lib';\nimport { TitleProps } from '@/checkout/types';\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 {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\n\ninterface ValidationError {\n email: string;\n message: string;\n type: 'missing' | 'invalid';\n}\n\ninterface CartSyncError {\n email: string;\n error: Error;\n}\n\nexport interface LoginFormProps\n extends HTMLAttributes<HTMLFormElement>,\n TitleProps {\n active?: boolean;\n autoSync?: boolean;\n displayHeadingContent?: boolean;\n onSignInClick?: (email: string) => void;\n onSignOutClick?: () => void;\n onCartSyncError?: (error: CartSyncError) => void;\n onValidationError?: (error: ValidationError) => void;\n slots?: {\n Heading?: SlotProps<{\n authenticated: boolean;\n }>;\n Preferences?: SlotProps<{\n email: string;\n isEmailValid: boolean;\n isAuthenticated: boolean;\n }>;\n } & TitleProps['slots'];\n}\n\nconst DEBOUNCE_TIME = 1000;\n\nexport const LoginForm: Container<LoginFormProps> = ({\n active = true,\n autoSync = true,\n displayHeadingContent = true,\n displayTitle = true,\n initialData,\n onCartSyncError,\n onSignInClick,\n onSignOutClick,\n onValidationError,\n slots,\n ...props\n}) => {\n const [customer, setCustomer] = useState<Customer | null>(null);\n const [email, setEmail] = useState<string>('');\n const [error, setError] = useState<string>('');\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [isAvailable, setIsAvailable] = useState<boolean>(true);\n const [isInitialized, setIsInitialized] = useState<boolean>(false);\n\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const {\n alreadyHaveAccountHint,\n cartSyncError,\n defaultTitle,\n fasterCheckoutHint,\n invalidEmailError,\n missingEmailError,\n signInLabel,\n } = useText({\n alreadyHaveAccountHint: 'Checkout.LoginForm.emailExists.alreadyHaveAccount',\n cartSyncError: 'Checkout.LoginForm.cartSyncError',\n defaultTitle: 'Checkout.LoginForm.title',\n fasterCheckoutHint: 'Checkout.LoginForm.emailExists.forFasterCheckout',\n invalidEmailError: 'Checkout.LoginForm.invalidEmailError',\n missingEmailError: 'Checkout.LoginForm.missingEmailError',\n signInLabel: 'Checkout.LoginForm.emailExists.signInButton',\n });\n\n const setEmailAndCheckAvailability = useCallback(\n (email: string) => {\n if (!validateEmail(email) || email === getCartEmail()) return;\n\n isEmailAvailable(email)\n .then((availability) => {\n setIsAvailable(availability);\n })\n .catch((error) => {\n console.error(error);\n setIsAvailable(true);\n });\n\n if (!autoSync) return;\n\n setGuestEmailOnCart(email).catch((error) => {\n onCartSyncError?.({ email, error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [autoSync, onCartSyncError, cartSyncError]\n );\n\n const handleChange = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const email = target.value;\n\n setEmail(email);\n setIsAvailable(true);\n setError('');\n\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n debounceTimer.current = setTimeout(() => {\n setEmailAndCheckAvailability(email);\n notifyValues({ email });\n debounceTimer.current = null;\n }, DEBOUNCE_TIME);\n },\n [setEmailAndCheckAvailability]\n );\n\n const handleBlur = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const email = target.value.trim();\n const isValid = validateEmail(email);\n\n if (isValid) {\n setError('');\n target.setCustomValidity('');\n\n if (!debounceTimer.current) return;\n\n clearTimeout(debounceTimer.current);\n debounceTimer.current = null;\n setEmailAndCheckAvailability(email);\n notifyValues({ email });\n return;\n }\n\n const type = email === '' ? 'missing' : 'invalid';\n const message =\n type === 'missing' ? missingEmailError : invalidEmailError;\n\n if (onValidationError) {\n onValidationError({ email, message, type });\n return;\n }\n\n setError(message);\n target.setCustomValidity(message);\n },\n [\n invalidEmailError,\n missingEmailError,\n onValidationError,\n setEmailAndCheckAvailability,\n ]\n );\n\n const handleInvalid = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const validity = target.validity;\n\n const message = validity.valueMissing\n ? missingEmailError\n : invalidEmailError;\n\n if (!onValidationError) {\n setError(message);\n return;\n }\n\n onValidationError({\n email: target.value,\n message,\n type: validity.valueMissing ? 'missing' : 'invalid',\n });\n },\n [missingEmailError, invalidEmailError, onValidationError]\n );\n\n const handleSignIn = useCallback(() => {\n const email = getValue('email') ?? '';\n const isValid = validateEmail(email);\n onSignInClick?.(isValid ? email : '');\n }, [onSignInClick]);\n\n const handleSignOut = useCallback(() => {\n onSignOutClick?.();\n }, [onSignOutClick]);\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const prevEmail = getValue('email') ?? '';\n const email = data?.email ?? '';\n\n if (email !== prevEmail) {\n setEmail(email);\n setError('');\n setIsAvailable(true);\n notifyValues({ email });\n }\n },\n []\n );\n\n useEffect(() => {\n if (!active) return;\n\n const onAuthenticated = events.on(\n 'authenticated',\n (authenticated) => {\n setIsAuthenticated(authenticated);\n\n getCustomer()\n .then((customer) => {\n setCustomer(customer);\n })\n .catch(console.error);\n },\n { eager: true }\n );\n\n return () => {\n onAuthenticated?.off();\n };\n }, [active]);\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 local state from checkout data\n const checkoutEmail = pastUpdate.email ?? '';\n if (checkoutEmail) {\n setEmail(checkoutEmail);\n }\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 handleCheckoutData,\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n const titleContent = useMemo(() => {\n if (!displayTitle) return undefined;\n\n return (\n <Slot name=\"checkout-login-form-title\" slot={slots?.Title}>\n <h2>{defaultTitle}</h2>\n </Slot>\n );\n }, [displayTitle, slots, defaultTitle]);\n\n const headingContent = useMemo(() => {\n if (!displayHeadingContent) return undefined;\n\n return (\n <Slot\n context={{ authenticated: isAuthenticated }}\n name=\"checkout-login-form-heading-label\"\n slot={slots?.Heading}\n >\n {isAuthenticated ? (\n <SignOut onClick={handleSignOut} />\n ) : (\n <SignIn onClick={handleSignIn} />\n )}\n </Slot>\n );\n }, [\n displayHeadingContent,\n isAuthenticated,\n slots,\n handleSignIn,\n handleSignOut,\n ]);\n\n const hintContent = useMemo(() => {\n if (isAvailable) return '';\n\n return (\n <>\n {alreadyHaveAccountHint}{' '}\n <a href=\"#\" onClick={handleSignIn}>\n {signInLabel}\n </a>{' '}\n {fasterCheckoutHint}\n </>\n );\n }, [\n isAvailable,\n alreadyHaveAccountHint,\n signInLabel,\n fasterCheckoutHint,\n handleSignIn,\n ]);\n\n const preferencesContent = useMemo(() => {\n return (\n <Slot\n context={{\n email,\n isEmailValid: validateEmail(email),\n isAuthenticated,\n }}\n name=\"checkout-login-form-preferences\"\n slot={slots?.Preferences}\n />\n );\n }, [email, isAuthenticated, slots]);\n\n return (\n <LoginFormComponent\n {...props}\n customer={customer}\n email={email}\n error={error}\n headingContent={headingContent}\n hint={hintContent}\n initialized={isInitialized}\n preferences={preferencesContent}\n title={titleContent}\n visible={active}\n onEmailBlur={handleBlur}\n onEmailChange={handleChange}\n onEmailInvalid={handleInvalid}\n />\n );\n};\n"],"names":["DEBOUNCE_TIME","LoginForm","active","autoSync","displayHeadingContent","displayTitle","initialData","onCartSyncError","onSignInClick","onSignOutClick","onValidationError","slots","props","customer","setCustomer","useState","email","setEmail","error","setError","isAuthenticated","setIsAuthenticated","isAvailable","setIsAvailable","isInitialized","setIsInitialized","debounceTimer","useRef","alreadyHaveAccountHint","cartSyncError","defaultTitle","fasterCheckoutHint","invalidEmailError","missingEmailError","signInLabel","useText","setEmailAndCheckAvailability","useCallback","validateEmail","getCartEmail","isEmailAvailable","availability","setGuestEmailOnCart","handleChange","event","notifyValues","handleBlur","target","type","message","handleInvalid","validity","handleSignIn","getValue","isValid","handleSignOut","handleCheckoutData","data","prevEmail","useEffect","onAuthenticated","events","authenticated","getCustomer","pastUpdate","getLatestCheckoutUpdate","checkoutEmail","onCheckoutInit","onCheckoutUpdated","titleContent","useMemo","jsx","Slot","headingContent","SignOut","SignIn","hintContent","jsxs","Fragment","preferencesContent","LoginFormComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LoginForm.js","sources":["/@dropins/storefront-checkout/src/containers/LoginForm/LoginForm.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 {\n getCustomer,\n isEmailAvailable,\n setGuestEmailOnCart,\n} from '@/checkout/api';\nimport {\n LoginForm as LoginFormComponent,\n SignIn,\n SignOut,\n} from '@/checkout/components/LoginForm';\nimport { Cart, Customer, NegotiableQuote } from '@/checkout/data/models';\nimport {\n getCartEmail,\n getLatestCheckoutUpdate,\n getValue,\n notifyValues,\n validateEmail,\n} from '@/checkout/lib';\nimport { TitleProps } from '@/checkout/types';\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 {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\n\ninterface ValidationError {\n email: string;\n message: string;\n type: 'missing' | 'invalid';\n}\n\ninterface CartSyncError {\n email: string;\n error: Error;\n}\n\nexport interface LoginFormProps\n extends HTMLAttributes<HTMLFormElement>,\n TitleProps {\n active?: boolean;\n autoSync?: boolean;\n displayHeadingContent?: boolean;\n onSignInClick?: (email: string) => void;\n onSignOutClick?: () => void;\n onCartSyncError?: (error: CartSyncError) => void;\n onValidationError?: (error: ValidationError) => void;\n slots?: {\n Heading?: SlotProps<{\n authenticated: boolean;\n }>;\n Preferences?: SlotProps<{\n email: string;\n isEmailValid: boolean;\n isAuthenticated: boolean;\n }>;\n } & TitleProps['slots'];\n}\n\nconst DEBOUNCE_TIME = 1000;\n\nexport const LoginForm: Container<LoginFormProps> = ({\n active = true,\n autoSync = true,\n displayHeadingContent = true,\n displayTitle = true,\n initialData,\n onCartSyncError,\n onSignInClick,\n onSignOutClick,\n onValidationError,\n slots,\n ...props\n}) => {\n const [customer, setCustomer] = useState<Customer | null>(null);\n const [email, setEmail] = useState<string>('');\n const [error, setError] = useState<string>('');\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [isAvailable, setIsAvailable] = useState<boolean>(true);\n const [isInitialized, setIsInitialized] = useState<boolean>(false);\n\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const {\n alreadyHaveAccountHint,\n cartSyncError,\n defaultTitle,\n fasterCheckoutHint,\n invalidEmailError,\n missingEmailError,\n signInLabel,\n } = useText({\n alreadyHaveAccountHint: 'Checkout.LoginForm.emailExists.alreadyHaveAccount',\n cartSyncError: 'Checkout.LoginForm.cartSyncError',\n defaultTitle: 'Checkout.LoginForm.title',\n fasterCheckoutHint: 'Checkout.LoginForm.emailExists.forFasterCheckout',\n invalidEmailError: 'Checkout.LoginForm.invalidEmailError',\n missingEmailError: 'Checkout.LoginForm.missingEmailError',\n signInLabel: 'Checkout.LoginForm.emailExists.signInButton',\n });\n\n const setEmailAndCheckAvailability = useCallback(\n (email: string) => {\n if (!validateEmail(email) || email === getCartEmail()) return;\n\n isEmailAvailable(email)\n .then((availability) => {\n setIsAvailable(availability);\n })\n .catch((error) => {\n console.error(error);\n setIsAvailable(true);\n });\n\n if (!autoSync) return;\n\n setGuestEmailOnCart(email).catch((error) => {\n onCartSyncError?.({ email, error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [autoSync, onCartSyncError, cartSyncError]\n );\n\n const handleChange = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const email = target.value;\n\n setEmail(email);\n setIsAvailable(true);\n setError('');\n\n if (debounceTimer.current) {\n clearTimeout(debounceTimer.current);\n }\n\n debounceTimer.current = setTimeout(() => {\n setEmailAndCheckAvailability(email);\n notifyValues({ email });\n debounceTimer.current = null;\n }, DEBOUNCE_TIME);\n },\n [setEmailAndCheckAvailability]\n );\n\n const handleBlur = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const email = target.value.trim();\n const isValid = validateEmail(email);\n\n if (isValid) {\n setError('');\n target.setCustomValidity('');\n\n if (!debounceTimer.current) return;\n\n clearTimeout(debounceTimer.current);\n debounceTimer.current = null;\n setEmailAndCheckAvailability(email);\n notifyValues({ email });\n return;\n }\n\n const type = email === '' ? 'missing' : 'invalid';\n const message =\n type === 'missing' ? missingEmailError : invalidEmailError;\n\n if (onValidationError) {\n onValidationError({ email, message, type });\n return;\n }\n\n setError(message);\n target.setCustomValidity(message);\n },\n [\n invalidEmailError,\n missingEmailError,\n onValidationError,\n setEmailAndCheckAvailability,\n ]\n );\n\n const handleInvalid = useCallback(\n (event: Event) => {\n const target = event.target as HTMLInputElement;\n const validity = target.validity;\n\n const message = validity.valueMissing\n ? missingEmailError\n : invalidEmailError;\n\n if (!onValidationError) {\n setError(message);\n return;\n }\n\n onValidationError({\n email: target.value,\n message,\n type: validity.valueMissing ? 'missing' : 'invalid',\n });\n },\n [missingEmailError, invalidEmailError, onValidationError]\n );\n\n const handleSignIn = useCallback(() => {\n const email = getValue('email') ?? '';\n const isValid = validateEmail(email);\n onSignInClick?.(isValid ? email : '');\n }, [onSignInClick]);\n\n const handleSignOut = useCallback(() => {\n onSignOutClick?.();\n }, [onSignOutClick]);\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const prevEmail = getValue('email') ?? '';\n const email = data?.email ?? '';\n\n if (email !== prevEmail) {\n setEmail(email);\n setError('');\n setIsAvailable(true);\n notifyValues({ email });\n }\n },\n []\n );\n\n useEffect(() => {\n if (!active) return;\n\n const onAuthenticated = events.on(\n 'authenticated',\n (authenticated) => {\n setIsAuthenticated(authenticated);\n\n getCustomer()\n .then((customer) => {\n setCustomer(customer);\n })\n .catch(console.error);\n },\n { eager: true }\n );\n\n return () => {\n onAuthenticated?.off();\n };\n }, [active]);\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 local state from checkout data\n const checkoutEmail = pastUpdate.email ?? '';\n if (checkoutEmail) {\n setEmail(checkoutEmail);\n }\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 handleCheckoutData,\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n const titleContent = useMemo(() => {\n if (!displayTitle) return undefined;\n\n return (\n <Slot name=\"checkout-login-form-title\" slot={slots?.Title}>\n <h2>{defaultTitle}</h2>\n </Slot>\n );\n }, [displayTitle, slots, defaultTitle]);\n\n const headingContent = useMemo(() => {\n if (!displayHeadingContent) return undefined;\n\n return (\n <Slot\n context={{ authenticated: isAuthenticated }}\n name=\"checkout-login-form-heading-label\"\n slot={slots?.Heading}\n >\n {isAuthenticated ? (\n <SignOut onClick={handleSignOut} />\n ) : (\n <SignIn onClick={handleSignIn} />\n )}\n </Slot>\n );\n }, [\n displayHeadingContent,\n isAuthenticated,\n slots,\n handleSignIn,\n handleSignOut,\n ]);\n\n const hintContent = useMemo(() => {\n if (isAvailable) return '';\n\n return (\n <>\n {alreadyHaveAccountHint}{' '}\n <a href=\"#\" onClick={handleSignIn}>\n {signInLabel}\n </a>{' '}\n {fasterCheckoutHint}\n </>\n );\n }, [\n isAvailable,\n alreadyHaveAccountHint,\n signInLabel,\n fasterCheckoutHint,\n handleSignIn,\n ]);\n\n const preferencesContent = useMemo(() => {\n return (\n <Slot\n context={{\n email,\n isEmailValid: validateEmail(email),\n isAuthenticated,\n }}\n name=\"checkout-login-form-preferences\"\n slot={slots?.Preferences}\n />\n );\n }, [email, isAuthenticated, slots]);\n\n return (\n <LoginFormComponent\n {...props}\n customer={customer}\n email={email}\n error={error}\n headingContent={headingContent}\n hint={hintContent}\n initialized={isInitialized}\n preferences={preferencesContent}\n title={titleContent}\n visible={active}\n onEmailBlur={handleBlur}\n onEmailChange={handleChange}\n onEmailInvalid={handleInvalid}\n />\n );\n};\n"],"names":["DEBOUNCE_TIME","LoginForm","active","autoSync","displayHeadingContent","displayTitle","initialData","onCartSyncError","onSignInClick","onSignOutClick","onValidationError","slots","props","customer","setCustomer","useState","email","setEmail","error","setError","isAuthenticated","setIsAuthenticated","isAvailable","setIsAvailable","isInitialized","setIsInitialized","debounceTimer","useRef","alreadyHaveAccountHint","cartSyncError","defaultTitle","fasterCheckoutHint","invalidEmailError","missingEmailError","signInLabel","useText","setEmailAndCheckAvailability","useCallback","validateEmail","getCartEmail","isEmailAvailable","availability","setGuestEmailOnCart","handleChange","event","notifyValues","handleBlur","target","type","message","handleInvalid","validity","handleSignIn","getValue","isValid","handleSignOut","handleCheckoutData","data","prevEmail","useEffect","onAuthenticated","events","authenticated","getCustomer","pastUpdate","getLatestCheckoutUpdate","checkoutEmail","onCheckoutInit","onCheckoutUpdated","titleContent","useMemo","jsx","Slot","headingContent","SignOut","SignIn","hintContent","jsxs","Fragment","preferencesContent","LoginFormComponent"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{AlertBanner as I,Icon as C}from"@dropins/tools/components.js";import{d as B,e as b}from"../chunks/components.js";import{events as l}from"@dropins/tools/event-bus.js";import{useState as h,useCallback as x,useEffect as u}from"@dropins/tools/preact-hooks.js";import{useText as M,Text as k}from"@dropins/tools/i18n.js";import"@dropins/tools/lib.js";import"
|
|
3
|
+
import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";/* empty css */import{AlertBanner as I,Icon as C}from"@dropins/tools/components.js";import{d as B,e as b}from"../chunks/components.js";import{events as l}from"@dropins/tools/event-bus.js";import{useState as h,useCallback as x,useEffect as u}from"@dropins/tools/preact-hooks.js";import{useText as M,Text as k}from"@dropins/tools/i18n.js";import"@dropins/tools/lib.js";import"@dropins/tools/preact-compat.js";import"../api.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const H=({className:c,initialData:T,active:r=!0,...f})=>{const[n,o]=h(0),s=M({mergedCartBannerItems:t(k,{fields:{count:n},id:"Checkout.MergedCartBanner.items",plural:n})}),d=()=>{o(0)},a=x(e=>{var i;const m=(i=e==null?void 0:e.oldCartItems)==null?void 0:i.reduce((p,g)=>p+g.quantity,0);m>0&&o(m)},[]);return u(()=>{if(!r)return;const e=l.on("cart/merged",a,{eager:!0});return()=>{e==null||e.off()}},[r,a]),u(()=>{if(!r)return;const e=l.on("cart/reset",()=>{o(0)},{eager:!1});return()=>{e==null||e.off()}},[r]),!r||!n?null:t(I,{...f,"aria-label":s.mergedCartBannerItems,className:B(["checkout__banner",c]),"data-testid":"merged-cart-banner",icon:t(C,{source:b}),message:t("span",{children:s.mergedCartBannerItems}),variant:"neutral",onDismiss:d})};export{H as MergedCartBanner,H as default};
|
|
4
4
|
//# sourceMappingURL=MergedCartBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergedCartBanner.js","sources":["/@dropins/storefront-checkout/src/containers/MergedCartBanner/MergedCartBanner.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/containers/MergedCartBanner/MergedCartBanner.css';\nimport {\n AlertBanner,\n AlertBannerProps,\n Icon,\n} from '@adobe-commerce/elsie/components';\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { InfoFilled } from '@adobe-commerce/elsie/icons';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { Container } from '@adobe-commerce/elsie/lib/types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\nexport interface MergedCartBannerProps extends AlertBannerProps {\n active?: boolean;\n}\n\nexport const MergedCartBanner: Container<MergedCartBannerProps> = ({\n className,\n initialData,\n active = true,\n ...props\n}) => {\n const [totalMergedItems, setTotalMergedItems] = useState(0);\n\n const translations = useText({\n mergedCartBannerItems: (\n <Text\n fields={{\n count: totalMergedItems,\n }}\n id=\"Checkout.MergedCartBanner.items\"\n plural={totalMergedItems}\n />\n ),\n });\n\n const onDismiss = () => {\n setTotalMergedItems(0);\n };\n\n const handleCartMerged = useCallback((data: { oldCartItems: any[] }) => {\n const oldCartItems = data?.oldCartItems?.reduce(\n (acc, item) => acc + item.quantity,\n 0\n );\n\n if (oldCartItems > 0) {\n setTotalMergedItems(oldCartItems);\n }\n }, []);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartMerged = events.on('cart/merged', handleCartMerged, {\n eager: true,\n });\n return () => {\n onCartMerged?.off();\n };\n }, [active, handleCartMerged]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartReset = events.on(\n 'cart/reset',\n () => {\n setTotalMergedItems(0);\n },\n {\n eager: false,\n }\n );\n return () => {\n onCartReset?.off();\n };\n }, [active]);\n\n if (!active || !totalMergedItems) return null;\n\n return (\n <AlertBanner\n {...props}\n aria-label={translations.mergedCartBannerItems}\n className={classes(['checkout__banner', className])}\n data-testid=\"merged-cart-banner\"\n icon={<Icon source={InfoFilled} />}\n message={<span>{translations.mergedCartBannerItems}</span>}\n variant=\"neutral\"\n onDismiss={onDismiss}\n />\n );\n};\n"],"names":["MergedCartBanner","className","initialData","active","props","totalMergedItems","setTotalMergedItems","useState","translations","useText","jsx","Text","onDismiss","handleCartMerged","useCallback","data","oldCartItems","_a","acc","item","useEffect","onCartMerged","events","onCartReset","AlertBanner","classes","Icon","InfoFilled"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MergedCartBanner.js","sources":["/@dropins/storefront-checkout/src/containers/MergedCartBanner/MergedCartBanner.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/containers/MergedCartBanner/MergedCartBanner.css';\nimport {\n AlertBanner,\n AlertBannerProps,\n Icon,\n} from '@adobe-commerce/elsie/components';\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { InfoFilled } from '@adobe-commerce/elsie/icons';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { Container } from '@adobe-commerce/elsie/lib/types';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useCallback, useEffect, useState } from 'preact/hooks';\n\nexport interface MergedCartBannerProps extends AlertBannerProps {\n active?: boolean;\n}\n\nexport const MergedCartBanner: Container<MergedCartBannerProps> = ({\n className,\n initialData,\n active = true,\n ...props\n}) => {\n const [totalMergedItems, setTotalMergedItems] = useState(0);\n\n const translations = useText({\n mergedCartBannerItems: (\n <Text\n fields={{\n count: totalMergedItems,\n }}\n id=\"Checkout.MergedCartBanner.items\"\n plural={totalMergedItems}\n />\n ),\n });\n\n const onDismiss = () => {\n setTotalMergedItems(0);\n };\n\n const handleCartMerged = useCallback((data: { oldCartItems: any[] }) => {\n const oldCartItems = data?.oldCartItems?.reduce(\n (acc, item) => acc + item.quantity,\n 0\n );\n\n if (oldCartItems > 0) {\n setTotalMergedItems(oldCartItems);\n }\n }, []);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartMerged = events.on('cart/merged', handleCartMerged, {\n eager: true,\n });\n return () => {\n onCartMerged?.off();\n };\n }, [active, handleCartMerged]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCartReset = events.on(\n 'cart/reset',\n () => {\n setTotalMergedItems(0);\n },\n {\n eager: false,\n }\n );\n return () => {\n onCartReset?.off();\n };\n }, [active]);\n\n if (!active || !totalMergedItems) return null;\n\n return (\n <AlertBanner\n {...props}\n aria-label={translations.mergedCartBannerItems}\n className={classes(['checkout__banner', className])}\n data-testid=\"merged-cart-banner\"\n icon={<Icon source={InfoFilled} />}\n message={<span>{translations.mergedCartBannerItems}</span>}\n variant=\"neutral\"\n onDismiss={onDismiss}\n />\n );\n};\n"],"names":["MergedCartBanner","className","initialData","active","props","totalMergedItems","setTotalMergedItems","useState","translations","useText","jsx","Text","onDismiss","handleCartMerged","useCallback","data","oldCartItems","_a","acc","item","useEffect","onCartMerged","events","onCartReset","AlertBanner","classes","Icon","InfoFilled"],"mappings":"6lBAkCO,MAAMA,EAAqD,CAAC,CACjE,UAAAC,EACA,YAAAC,EACA,OAAAC,EAAS,GACT,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAAkBC,CAAmB,EAAIC,EAAS,CAAC,EAEpDC,EAAeC,EAAQ,CAC3B,sBACEC,EAACC,EAAA,CACC,OAAQ,CACN,MAAON,CACT,EACA,GAAG,kCACH,OAAQA,CAAA,CAAA,CACV,CAEH,EAEKO,EAAY,IAAM,CACtBN,EAAoB,CAAC,CACvB,EAEMO,EAAmBC,EAAaC,GAAkC,OAChE,MAAAC,GAAeC,EAAAF,GAAA,YAAAA,EAAM,eAAN,YAAAE,EAAoB,OACvC,CAACC,EAAKC,IAASD,EAAMC,EAAK,SAC1B,GAGEH,EAAe,GACjBV,EAAoBU,CAAY,CAEpC,EAAG,EAAE,EA8BL,OA5BAI,EAAU,IAAM,CACd,GAAI,CAACjB,EAAQ,OAEb,MAAMkB,EAAeC,EAAO,GAAG,cAAeT,EAAkB,CAC9D,MAAO,EAAA,CACR,EACD,MAAO,IAAM,CACXQ,GAAA,MAAAA,EAAc,KAChB,CAAA,EACC,CAAClB,EAAQU,CAAgB,CAAC,EAE7BO,EAAU,IAAM,CACd,GAAI,CAACjB,EAAQ,OAEb,MAAMoB,EAAcD,EAAO,GACzB,aACA,IAAM,CACJhB,EAAoB,CAAC,CACvB,EACA,CACE,MAAO,EAAA,CAEX,EACA,MAAO,IAAM,CACXiB,GAAA,MAAAA,EAAa,KACf,CAAA,EACC,CAACpB,CAAM,CAAC,EAEP,CAACA,GAAU,CAACE,EAAyB,KAGvCK,EAACc,EAAA,CACE,GAAGpB,EACJ,aAAYI,EAAa,sBACzB,UAAWiB,EAAQ,CAAC,mBAAoBxB,CAAS,CAAC,EAClD,cAAY,qBACZ,KAAMS,EAACgB,EAAK,CAAA,OAAQC,CAAY,CAAA,EAChC,QAASjB,EAAC,OAAM,CAAA,SAAAF,EAAa,sBAAsB,EACnD,QAAQ,UACR,UAAAI,CAAA,CACF,CAEJ"}
|
package/containers/OutOfStock.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{jsx as
|
|
3
|
+
import{jsx as p}from"@dropins/tools/preact-jsx-runtime.js";import{O}from"../chunks/components.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";import"@dropins/tools/preact-compat.js";import{useState as k,useCallback as l,useEffect as S}from"@dropins/tools/preact-hooks.js";import{events as v}from"@dropins/tools/event-bus.js";import"@dropins/tools/i18n.js";import"../api.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const w=({onCartProductsUpdate:i,routeCart:f,active:m=!0})=>{const[e,n]=k([]),u=l(()=>{if(!i)return;const t=e.filter(o=>o.outOfStock).map(o=>({uid:o.uid,quantity:0}));i(t)},[e,i]);if(S(()=>{if(!m)return;const t=v.on("cart/data",o=>{const c=(o==null?void 0:o.items)||[];n(c.filter(r=>r.outOfStock||r.insufficientQuantity))},{eager:!0});return()=>{t==null||t.off()}},[m]),!m||e.length===0)return null;const s=!e.some(t=>t.insufficientQuantity);return p(O,{items:e,routeCart:f==null?void 0:f(),onRemoveOutOfStock:s?u:void 0})};export{w as OutOfStock,w as default};
|
|
4
4
|
//# sourceMappingURL=OutOfStock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutOfStock.js","sources":["/@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 { 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","onCartProductsUpdate","routeCart","active","items","setItems","useState","removeOutOfStockItems","useCallback","update","item","useEffect","onCartData","events","data","canRemoveOutOfStock","jsx","OutOfStockComponent"],"mappings":"
|
|
1
|
+
{"version":3,"file":"OutOfStock.js","sources":["/@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 { 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","onCartProductsUpdate","routeCart","active","items","setItems","useState","removeOutOfStockItems","useCallback","update","item","useEffect","onCartData","events","data","canRemoveOutOfStock","jsx","OutOfStockComponent"],"mappings":"+eAoCO,MAAMA,EAAyC,CAAC,CACrD,qBAAAC,EACA,UAAAC,EACA,OAAAC,EAAS,EACX,IAAM,CACJ,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAsB,CAAA,CAAE,EAE5CC,EAAwBC,EAAY,IAAM,CAC9C,GAAI,CAACP,EAAsB,OAE3B,MAAMQ,EAASL,EACZ,OAAQM,GAASA,EAAK,UAAU,EAChC,IAAKA,IAAU,CAAE,IAAKA,EAAK,IAAK,SAAU,GAAI,EAEjDT,EAAqBQ,CAAM,CAAA,EAC1B,CAACL,EAAOH,CAAoB,CAAC,EAuBhC,GArBAU,EAAU,IAAM,CACd,GAAI,CAACR,EAAQ,OAEb,MAAMS,EAAaC,EAAO,GACxB,YACCC,GAAS,CACFV,MAAAA,GAASU,GAAA,YAAAA,EAAM,QAAS,CAAC,EAC/BT,EACED,EAAM,OAAQM,GACLA,EAAK,YAAcA,EAAK,oBAChC,CACH,CACF,EACA,CAAE,MAAO,EAAK,CAChB,EAEA,MAAO,IAAM,CACXE,GAAA,MAAAA,EAAY,KACd,CAAA,EACC,CAACT,CAAM,CAAC,EAEP,CAACA,GAAUC,EAAM,SAAW,EAAU,OAAA,KAE1C,MAAMW,EAAsB,CAACX,EAAM,KAAMM,GAASA,EAAK,oBAAoB,EAGzE,OAAAM,EAACC,EAAA,CACC,MAAAb,EACA,UAAWF,GAAA,YAAAA,IACX,mBACEa,EAAsBR,EAAwB,MAAA,CAElD,CAEJ"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2026 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{v as te,setPaymentMethod as W,
|
|
3
|
+
import{v as te,setPaymentMethod as W,a as ne,c as re,d as D,g as ae,n as oe,s as ce}from"../api.js";import{deepmerge as ie,Slot as x}from"@dropins/tools/lib.js";import{events as j}from"@dropins/tools/event-bus.js";import{jsx as E}from"@dropins/tools/preact-jsx-runtime.js";import{useState as O,useMemo as k,useCallback as i,useEffect as w}from"@dropins/tools/preact-hooks.js";import{h as se}from"../chunks/components.js";import"@dropins/tools/components.js";import"@dropins/tools/preact-compat.js";import"../chunks/ui.js";/* empty css */import{P as ue}from"../chunks/PurchaseOrder.js";import{P as de}from"../chunks/PaymentOnAccount.js";import{r as le}from"../chunks/render.js";import{i as me}from"../chunks/events.js";import{useText as fe}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"../fragments.js";import"@dropins/tools/fetch-graphql.js";const pe=(t,a)=>{let o;const s=function(...r){clearTimeout(o),o=setTimeout(()=>t.apply(this,r),a)};return s.cancel=()=>{clearTimeout(o)},s};var he=(t=>(t.PaymentOnAccount="companycredit",t.PurchaseOrder="purchaseorder",t))(he||{});const B={companycredit:{Container:de,autoSync:!0,formName:"payment-on-account",validateRefNumber:!1},purchaseorder:{Container:ue,autoSync:!1,formName:"purchase-order",validateRefNumber:!0}},T=new Map,ye=(t,a)=>{const o=`${t}-${a}`;if(!T.has(o)){const s=pe(async r=>{if(!a||te(r))try{await W({code:t,purchase_order_number:r})}catch(u){console.error(`Failed to set payment method for ${t}:`,u)}},1e3);T.set(o,s)}return T.get(o)},g={},ze=()=>{Object.keys(g).forEach(t=>{delete g[t]}),T.clear()},G=t=>{if(!(t in B))throw new Error(`Invalid handler code: ${t}`);if(g[t])return g[t];const a=B[t],{autoSync:o,Container:s,formName:r,validateRefNumber:u}=a,p={enabled:!0,autoSync:o,render:v=>{var S;const b=String(((S=v.additionalData)==null?void 0:S.purchase_order_number)??""),C=document.createElement("div");le.render(s,{name:r,initialReferenceNumber:b,onReferenceNumberChange:ye(t,u)})(C),v.replaceHTML(C)}};return g[t]=p,p},be={companycredit:G("companycredit"),purchaseorder:G("purchaseorder")};function A(t,a){return t?a.some(o=>o.code===t.code):!1}function Se(t,a){return!t||!a?!1:t.code===a.code}function Me(t){return t?!!t.code&&!!t.title:!1}const Fe=({UIComponentType:t="ToggleButton",active:a=!0,autoSync:o=!0,displayTitle:s=!0,slots:r,onCartSyncError:u,onSelectionChange:p})=>{const[v,b]=O(null),[C,S]=O(!1),[l,N]=O(null),[q,H]=O([]),J=ne.value,{cartSyncError:R,defaultTitle:$}=fe({cartSyncError:"Checkout.PaymentMethods.cartSyncError",defaultTitle:"Checkout.PaymentMethods.title"}),m=k(()=>{const e=(r==null?void 0:r.Methods)??{};return ie(be,e)},[r==null?void 0:r.Methods]),U=i(e=>{var n;return(n=m[e.code])==null?void 0:n.render},[m]),_=i(e=>{const n=m[e.code];return n?n.autoSync!==!1:o},[o,m]),z=i(e=>{var c;return((c=m[e.code])==null?void 0:c.enabled)!==!1},[m]),K=i(e=>e.map(n=>{const c=m[n.code];return c?{...n,icon:c.icon}:n}),[m]),F=i(e=>{N(n=>n&&{...n,additionalData:e})},[]),Q=i(()=>{b(null)},[]),d=i(e=>{b(null),N(e)},[]),M=i(async(e,n)=>{(me()||re())&&_(e)&&W({code:e.code,...e.additionalData??{}}).catch(f=>{d(n??null),b(u?null:R),u==null||u({method:e,error:f})})},[R,_,u,d]),X=i(async e=>{const n=D("selectedPaymentMethod");d(e),p==null||p(e),await M(e,n)},[p,d,M]),P=i(e=>{if(!e||e.isEmpty){d(null),H([]);return}const f=(e.availablePaymentMethods??[]).filter(z);if(H(f),f.length===0){d(null);return}const h=e.selectedPaymentMethod??null,L=Me(h),y=D("selectedPaymentMethod"),I=A(y,f),ee=Se(y,h);if(y&&I&&!ee){M(y,h);return}if((!y||!I)&&L&&A(h,f)){d(h);return}if((!y||!I)&&(!L||!A(h,f))){const V=f[0];d(V),M(V)}},[z,d,M]);w(()=>{if(!a)return;const e=ae();if(e){S(!0);const c=D("selectedPaymentMethod");c&&N(c),P(e);return}const n=j.on("checkout/initialized",c=>{S(!0),P(c)},{eager:!0});return()=>{n==null||n.off()}},[a,P]),w(()=>{if(!a)return;const e=j.on("checkout/updated",P,{eager:!1});return()=>{e==null||e.off()}},[a,P]),w(()=>{oe({selectedPaymentMethod:l})},[l]);const Y=k(()=>{if(s)return E(x,{name:"checkout-payment-methods-title",slot:r==null?void 0:r.Title,children:E("h2",{children:$})})},[s,r==null?void 0:r.Title,$]),Z=k(()=>{if(!l)return;const e=U(l);if(e)return E(x,{context:{additionalData:l.additionalData,cartId:ce.cartId??"",replaceHTML(n){this.replaceWith(n)},setAdditionalData:F},name:"PaymentMethodContent",slot:e},l.code)},[U,l,F]);return E(se,{UIComponentType:t,busy:J,error:v,initialized:C,options:K(q),paymentMethodContent:Z,selection:l,title:Y,visible:a,onDismissError:Q,onSelectionChange:X})};export{he as HandlerCode,Fe as PaymentMethods,G as createHandler,Fe as default,be as defaultHandlers,ye as handleRefNumberChange,ze as resetHandlersCache};
|
|
4
4
|
//# sourceMappingURL=PaymentMethods.js.map
|