@dropins/storefront-checkout 2.2.0-alpha3 → 2.2.0-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/chunks/PaymentOnAccount2.js +1 -1
- package/chunks/PaymentOnAccount2.js.map +1 -1
- package/chunks/classifiers.js +1 -1
- package/chunks/classifiers.js.map +1 -1
- package/chunks/render.js +1 -1
- package/chunks/render.js.map +1 -1
- package/chunks/synchronizeCheckout.js +6 -6
- package/chunks/synchronizeCheckout.js.map +1 -1
- package/components/PaymentOnAccount/PaymentOnAccount.d.ts +2 -2
- package/containers/BillToShippingAddress.js +1 -1
- package/containers/BillToShippingAddress.js.map +1 -1
- package/containers/LoginForm.js.map +1 -1
- package/containers/PaymentMethods.js +1 -1
- package/containers/PaymentMethods.js.map +1 -1
- package/containers/PaymentOnAccount.js +1 -1
- package/i18n/en_US.json.d.ts +2 -1
- package/lib/errors/classifiers.d.ts +2 -1
- package/package.json +1 -1
- package/types/index.d.ts +1 -1
- package/types/storefront.d.ts +224 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BillToShippingAddress.js","sources":["/@dropins/storefront-checkout/src/components/BillToShippingAddress/BillToShippingAddressSkeleton.tsx","/@dropins/storefront-checkout/src/components/BillToShippingAddress/BillToShippingAddress.tsx","/@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 { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const BillToShippingAddressSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n className=\"bill-to-shipping-address__skeleton\"\n data-testid=\"bill-to-shipping-skeleton\"\n >\n <SkeletonRow size=\"small\" variant=\"row\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport '@/checkout/components/BillToShippingAddress/BillToShippingAddress.css';\nimport { BillToShippingAddressSkeleton } from '@/checkout/components/BillToShippingAddress/BillToShippingAddressSkeleton';\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport { Checkbox, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { FunctionComponent } from 'preact';\nimport { ChangeEvent, HTMLAttributes } from 'preact/compat';\n\nexport interface BillToShippingAddressProps\n extends Omit<\n HTMLAttributes<HTMLInputElement>,\n 'loading' | 'disabled' | 'onChange'\n > {\n disabled?: boolean;\n error?: string | null;\n onChange?: (checked: boolean) => void;\n onDismissError?: () => void;\n}\n\nconst BillToShippingAddressComponent: FunctionComponent<\n BillToShippingAddressProps\n> = ({\n className,\n checked,\n disabled,\n error = null,\n onChange = () => {},\n onDismissError = () => {},\n}) => {\n const translations = useText({\n title: 'Checkout.BillToShippingAddress.title',\n });\n\n const hasError = error !== null;\n\n const handleChange = (event: Event | ChangeEvent<HTMLInputElement>) => {\n const checkbox = event.target as HTMLInputElement;\n onChange?.(checkbox.checked);\n };\n\n return (\n <div className=\"checkout-bill-to-shipping-address\">\n <Checkbox\n checked={checked}\n className={classes([\n 'checkout-bill-to-shipping-address__checkbox',\n className,\n ])}\n data-testid=\"bill-to-shipping-checkbox\"\n disabled={disabled}\n label={translations.title}\n name=\"checkout-bill-to-shipping-address__checkbox\"\n onChange={handleChange}\n />\n\n {hasError && (\n <div\n className=\"checkout-bill-to-shipping-address__error\"\n data-testid=\"checkout-bill-to-shipping-address-alert\"\n >\n <InLineAlert\n heading={error}\n type=\"error\"\n variant=\"primary\"\n onDismiss={onDismissError}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const BillToShippingAddress = WithConditionals(\n BillToShippingAddressComponent,\n BillToShippingAddressSkeleton\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 { 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 { 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;\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 []\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":["BillToShippingAddressSkeleton","jsx","Skeleton","SkeletonRow","BillToShippingAddressComponent","className","checked","disabled","error","onChange","onDismissError","translations","useText","hasError","handleChange","event","checkbox","jsxs","Checkbox","classes","InLineAlert","BillToShippingAddress","WithConditionals","active","autoSync","onCartSyncError","setError","useState","isVirtual","setIsVirtual","isChecked","setIsChecked","hasInitialCartData","useRef","isDisabled","hasPendingUpdates","cartSyncError","handleDismissError","useCallback","isBillToShipping","hasShippingAddress","setBillingAddress","handleCheckoutData","data","isCartEmpty","isCartVirtual","cart","shippingAddress","_a","hasBillingAddress","initialIsChecked","defaults","config","useEffect","notifyValues","pastUpdate","getLatestCheckoutUpdate","userBillToShipping","getValue","onCheckoutInit","events","onCheckoutUpdated"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BillToShippingAddress.js","sources":["/@dropins/storefront-checkout/src/components/BillToShippingAddress/BillToShippingAddressSkeleton.tsx","/@dropins/storefront-checkout/src/components/BillToShippingAddress/BillToShippingAddress.tsx","/@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 { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const BillToShippingAddressSkeleton: FunctionComponent = () => {\n return (\n <Skeleton\n className=\"bill-to-shipping-address__skeleton\"\n data-testid=\"bill-to-shipping-skeleton\"\n >\n <SkeletonRow size=\"small\" variant=\"row\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport '@/checkout/components/BillToShippingAddress/BillToShippingAddress.css';\nimport { BillToShippingAddressSkeleton } from '@/checkout/components/BillToShippingAddress/BillToShippingAddressSkeleton';\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport { Checkbox, InLineAlert } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes } from '@adobe-commerce/elsie/lib/classes';\nimport { FunctionComponent } from 'preact';\nimport { ChangeEvent, HTMLAttributes } from 'preact/compat';\n\nexport interface BillToShippingAddressProps\n extends Omit<\n HTMLAttributes<HTMLInputElement>,\n 'loading' | 'disabled' | 'onChange'\n > {\n disabled?: boolean;\n error?: string | null;\n onChange?: (checked: boolean) => void;\n onDismissError?: () => void;\n}\n\nconst BillToShippingAddressComponent: FunctionComponent<\n BillToShippingAddressProps\n> = ({\n className,\n checked,\n disabled,\n error = null,\n onChange = () => {},\n onDismissError = () => {},\n}) => {\n const translations = useText({\n title: 'Checkout.BillToShippingAddress.title',\n });\n\n const hasError = error !== null;\n\n const handleChange = (event: Event | ChangeEvent<HTMLInputElement>) => {\n const checkbox = event.target as HTMLInputElement;\n onChange?.(checkbox.checked);\n };\n\n return (\n <div className=\"checkout-bill-to-shipping-address\">\n <Checkbox\n checked={checked}\n className={classes([\n 'checkout-bill-to-shipping-address__checkbox',\n className,\n ])}\n data-testid=\"bill-to-shipping-checkbox\"\n disabled={disabled}\n label={translations.title}\n name=\"checkout-bill-to-shipping-address__checkbox\"\n onChange={handleChange}\n />\n\n {hasError && (\n <div\n className=\"checkout-bill-to-shipping-address__error\"\n data-testid=\"checkout-bill-to-shipping-address-alert\"\n >\n <InLineAlert\n heading={error}\n type=\"error\"\n variant=\"primary\"\n onDismiss={onDismissError}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const BillToShippingAddress = WithConditionals(\n BillToShippingAddressComponent,\n BillToShippingAddressSkeleton\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 { 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 { 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;\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 (autoSync && initialIsChecked && shippingAddress && !hasBillingAddress) {\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":["BillToShippingAddressSkeleton","jsx","Skeleton","SkeletonRow","BillToShippingAddressComponent","className","checked","disabled","error","onChange","onDismissError","translations","useText","hasError","handleChange","event","checkbox","jsxs","Checkbox","classes","InLineAlert","BillToShippingAddress","WithConditionals","active","autoSync","onCartSyncError","setError","useState","isVirtual","setIsVirtual","isChecked","setIsChecked","hasInitialCartData","useRef","isDisabled","hasPendingUpdates","cartSyncError","handleDismissError","useCallback","isBillToShipping","hasShippingAddress","setBillingAddress","handleCheckoutData","data","isCartEmpty","isCartVirtual","cart","shippingAddress","_a","hasBillingAddress","initialIsChecked","defaults","config","useEffect","notifyValues","pastUpdate","getLatestCheckoutUpdate","userBillToShipping","getValue","onCheckoutInit","events","onCheckoutUpdated"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.js","sources":["/@dropins/storefront-checkout/src/components/LoginForm/Email.tsx","/@dropins/storefront-checkout/src/components/LoginForm/SignIn.tsx","/@dropins/storefront-checkout/src/components/LoginForm/LoginFormSkeleton.tsx","/@dropins/storefront-checkout/src/components/LoginForm/LoginForm.tsx","/@dropins/storefront-checkout/src/components/LoginForm/SignOut.tsx","/@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 { Field, Input } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface LoginEmailProps extends HTMLAttributes<HTMLInputElement> {\n value: string;\n error: string;\n hint: string;\n onChange: (event: Event) => void;\n onBlur: (event: Event) => void;\n onInvalid: (event: Event) => void;\n}\n\nexport const Email: FunctionComponent<LoginEmailProps> = ({\n value,\n error,\n hint,\n onChange,\n onBlur,\n onInvalid,\n}) => {\n const translations = useText({\n LoginFormLabel: 'Checkout.LoginForm.ariaLabel',\n LoginFormFloatingLabel: 'Checkout.LoginForm.floatingLabel',\n LoginFormPlaceholder: 'Checkout.LoginForm.placeholder',\n });\n\n return (\n <Field error={error} hint={hint}>\n <Input\n aria-label={translations.LoginFormLabel}\n aria-required={true}\n autocomplete=\"email\"\n floatingLabel={translations.LoginFormFloatingLabel}\n id=\"customer-email\"\n name=\"customer-email\"\n placeholder={translations.LoginFormPlaceholder}\n required={true}\n type=\"email\"\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onInvalid={onInvalid}\n />\n </Field>\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 { useText } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\n\ninterface SignInProps {\n onClick: (event: Event) => void;\n}\n\nexport const SignIn: FunctionComponent<SignInProps> = ({ onClick }) => {\n const translations = useText({\n account: 'Checkout.LoginForm.account',\n signIn: 'Checkout.LoginForm.signIn'\n });\n\n return (\n <div className=\"checkout-login-form__sign-in\">\n {translations.account}\n\n <a\n className=\"checkout-login-form__link\"\n data-testid=\"sign-in-link\"\n href=\"#\"\n rel=\"noreferrer\"\n target=\"_blank\"\n onClick={(event) => {\n event.preventDefault();\n onClick(event);\n }}\n >\n {translations.signIn}\n </a>\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const LoginFormSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"login-form-skeleton\">\n <SkeletonRow fullWidth={true} variant=\"heading\" />\n <SkeletonRow fullWidth={true} size=\"medium\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Email } from '@/checkout/components';\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport '@/checkout/components/LoginForm/LoginForm.css';\nimport { LoginFormSkeleton } from '@/checkout/components/LoginForm/LoginFormSkeleton';\nimport { Customer } from '@/checkout/data/models';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface LoginFormProps\n extends Omit<HTMLAttributes<HTMLFormElement>, 'title'> {\n customer: Customer | null;\n email: string;\n error: string;\n headingContent?: VNode;\n hint: string | VNode;\n onEmailBlur: (event: Event) => void;\n onEmailChange: (event: Event) => void;\n onEmailInvalid: (event: Event) => void;\n title?: VNode;\n}\n\nconst LoginFormComponent: FunctionComponent<LoginFormProps> = ({\n className,\n customer,\n email,\n error,\n headingContent,\n hint,\n name,\n onEmailBlur,\n onEmailChange,\n onEmailInvalid,\n title,\n ...props\n}) => {\n return (\n <div className=\"checkout-login-form\" data-testid=\"checkout-login-form\">\n <div className=\"checkout-login-form__heading\">\n {title && (\n <VComponent className=\"checkout-login-form__title\" node={title} />\n )}\n\n {headingContent && (\n <VComponent\n className=\"checkout-login-form__heading-label\"\n node={headingContent}\n />\n )}\n </div>\n\n {customer ? (\n <div className=\"checkout-login-form__customer-details\">\n <div className=\"checkout-login-form__customer-name\">\n {`${customer.firstName} ${customer.lastName}`}\n </div>\n\n <div className=\"checkout-login-form__customer-email\">\n {customer.email}\n </div>\n </div>\n ) : (\n <div className=\"checkout-login-form__content\">\n <form\n {...props}\n noValidate\n className={classes(['dropin-login-form__form', className])}\n name={name}\n >\n {/* Prevent 'Enter' key press from submitting this form. */}\n <button\n disabled\n aria-hidden=\"true\"\n style=\"display: none\"\n type=\"submit\"\n />\n <Email\n error={error}\n hint={hint as any}\n value={email}\n onBlur={onEmailBlur}\n onChange={onEmailChange}\n onInvalid={onEmailInvalid}\n />\n </form>\n </div>\n )}\n </div>\n );\n};\n\nexport const LoginForm = WithConditionals(\n LoginFormComponent,\n LoginFormSkeleton\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 { useText } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\n\ninterface SignOutProps {\n onClick: (event: Event) => void;\n}\n\nexport const SignOut: FunctionComponent<SignOutProps> = ({ onClick }) => {\n const translations = useText({\n switch: 'Checkout.LoginForm.switch',\n signOut: 'Checkout.LoginForm.signOut'\n });\n\n return (\n <p className=\"checkout-login-form__sign-out\">\n {translations.switch}\n\n <a\n className=\"checkout-login-form__link\"\n href=\"#\"\n rel=\"noreferrer\"\n target=\"_blank\"\n onClick={(event) => {\n event.preventDefault();\n onClick?.(event);\n }}\n >\n {translations.signOut}\n </a>\n </p>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n 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 } 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 } & 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((data: Cart | 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 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 return (\n <LoginFormComponent\n {...props}\n customer={customer}\n email={email}\n error={error}\n headingContent={headingContent}\n hint={hintContent}\n initialized={isInitialized}\n title={titleContent}\n visible={active}\n onEmailBlur={handleBlur}\n onEmailChange={handleChange}\n onEmailInvalid={handleInvalid}\n />\n );\n};\n"],"names":["Email","value","error","hint","onChange","onBlur","onInvalid","translations","useText","jsx","Field","Input","SignIn","onClick","jsxs","event","LoginFormSkeleton","Skeleton","SkeletonRow","LoginFormComponent","className","customer","email","headingContent","name","onEmailBlur","onEmailChange","onEmailInvalid","title","props","VComponent","classes","LoginForm","WithConditionals","SignOut","DEBOUNCE_TIME","active","autoSync","displayHeadingContent","displayTitle","initialData","onCartSyncError","onSignInClick","onSignOutClick","onValidationError","slots","setCustomer","useState","setEmail","setError","isAuthenticated","setIsAuthenticated","isAvailable","setIsAvailable","isInitialized","setIsInitialized","debounceTimer","useRef","alreadyHaveAccountHint","cartSyncError","defaultTitle","fasterCheckoutHint","invalidEmailError","missingEmailError","signInLabel","setEmailAndCheckAvailability","useCallback","validateEmail","getCartEmail","isEmailAvailable","availability","setGuestEmailOnCart","handleChange","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","Slot","hintContent","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LoginForm.js","sources":["/@dropins/storefront-checkout/src/components/LoginForm/Email.tsx","/@dropins/storefront-checkout/src/components/LoginForm/SignIn.tsx","/@dropins/storefront-checkout/src/components/LoginForm/LoginFormSkeleton.tsx","/@dropins/storefront-checkout/src/components/LoginForm/LoginForm.tsx","/@dropins/storefront-checkout/src/components/LoginForm/SignOut.tsx","/@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 { Field, Input } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface LoginEmailProps extends HTMLAttributes<HTMLInputElement> {\n value: string;\n error: string;\n hint: string;\n onChange: (event: Event) => void;\n onBlur: (event: Event) => void;\n onInvalid: (event: Event) => void;\n}\n\nexport const Email: FunctionComponent<LoginEmailProps> = ({\n value,\n error,\n hint,\n onChange,\n onBlur,\n onInvalid,\n}) => {\n const translations = useText({\n LoginFormLabel: 'Checkout.LoginForm.ariaLabel',\n LoginFormFloatingLabel: 'Checkout.LoginForm.floatingLabel',\n LoginFormPlaceholder: 'Checkout.LoginForm.placeholder',\n });\n\n return (\n <Field error={error} hint={hint}>\n <Input\n aria-label={translations.LoginFormLabel}\n aria-required={true}\n autocomplete=\"email\"\n floatingLabel={translations.LoginFormFloatingLabel}\n id=\"customer-email\"\n name=\"customer-email\"\n placeholder={translations.LoginFormPlaceholder}\n required={true}\n type=\"email\"\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onInvalid={onInvalid}\n />\n </Field>\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 { useText } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\n\ninterface SignInProps {\n onClick: (event: Event) => void;\n}\n\nexport const SignIn: FunctionComponent<SignInProps> = ({ onClick }) => {\n const translations = useText({\n account: 'Checkout.LoginForm.account',\n signIn: 'Checkout.LoginForm.signIn'\n });\n\n return (\n <div className=\"checkout-login-form__sign-in\">\n {translations.account}\n\n <a\n className=\"checkout-login-form__link\"\n data-testid=\"sign-in-link\"\n href=\"#\"\n rel=\"noreferrer\"\n target=\"_blank\"\n onClick={(event) => {\n event.preventDefault();\n onClick(event);\n }}\n >\n {translations.signIn}\n </a>\n </div>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const LoginFormSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"login-form-skeleton\">\n <SkeletonRow fullWidth={true} variant=\"heading\" />\n <SkeletonRow fullWidth={true} size=\"medium\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Email } from '@/checkout/components';\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport '@/checkout/components/LoginForm/LoginForm.css';\nimport { LoginFormSkeleton } from '@/checkout/components/LoginForm/LoginFormSkeleton';\nimport { Customer } from '@/checkout/data/models';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes } from 'preact/compat';\n\nexport interface LoginFormProps\n extends Omit<HTMLAttributes<HTMLFormElement>, 'title'> {\n customer: Customer | null;\n email: string;\n error: string;\n headingContent?: VNode;\n hint: string | VNode;\n onEmailBlur: (event: Event) => void;\n onEmailChange: (event: Event) => void;\n onEmailInvalid: (event: Event) => void;\n title?: VNode;\n}\n\nconst LoginFormComponent: FunctionComponent<LoginFormProps> = ({\n className,\n customer,\n email,\n error,\n headingContent,\n hint,\n name,\n onEmailBlur,\n onEmailChange,\n onEmailInvalid,\n title,\n ...props\n}) => {\n return (\n <div className=\"checkout-login-form\" data-testid=\"checkout-login-form\">\n <div className=\"checkout-login-form__heading\">\n {title && (\n <VComponent className=\"checkout-login-form__title\" node={title} />\n )}\n\n {headingContent && (\n <VComponent\n className=\"checkout-login-form__heading-label\"\n node={headingContent}\n />\n )}\n </div>\n\n {customer ? (\n <div className=\"checkout-login-form__customer-details\">\n <div className=\"checkout-login-form__customer-name\">\n {`${customer.firstName} ${customer.lastName}`}\n </div>\n\n <div className=\"checkout-login-form__customer-email\">\n {customer.email}\n </div>\n </div>\n ) : (\n <div className=\"checkout-login-form__content\">\n <form\n {...props}\n noValidate\n className={classes(['dropin-login-form__form', className])}\n name={name}\n >\n {/* Prevent 'Enter' key press from submitting this form. */}\n <button\n disabled\n aria-hidden=\"true\"\n style=\"display: none\"\n type=\"submit\"\n />\n <Email\n error={error}\n hint={hint as any}\n value={email}\n onBlur={onEmailBlur}\n onChange={onEmailChange}\n onInvalid={onEmailInvalid}\n />\n </form>\n </div>\n )}\n </div>\n );\n};\n\nexport const LoginForm = WithConditionals(\n LoginFormComponent,\n LoginFormSkeleton\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 { useText } from '@adobe-commerce/elsie/i18n';\nimport { FunctionComponent } from 'preact';\n\ninterface SignOutProps {\n onClick: (event: Event) => void;\n}\n\nexport const SignOut: FunctionComponent<SignOutProps> = ({ onClick }) => {\n const translations = useText({\n switch: 'Checkout.LoginForm.switch',\n signOut: 'Checkout.LoginForm.signOut'\n });\n\n return (\n <p className=\"checkout-login-form__sign-out\">\n {translations.switch}\n\n <a\n className=\"checkout-login-form__link\"\n href=\"#\"\n rel=\"noreferrer\"\n target=\"_blank\"\n onClick={(event) => {\n event.preventDefault();\n onClick?.(event);\n }}\n >\n {translations.signOut}\n </a>\n </p>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n 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 } & 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((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 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 return (\n <LoginFormComponent\n {...props}\n customer={customer}\n email={email}\n error={error}\n headingContent={headingContent}\n hint={hintContent}\n initialized={isInitialized}\n title={titleContent}\n visible={active}\n onEmailBlur={handleBlur}\n onEmailChange={handleChange}\n onEmailInvalid={handleInvalid}\n />\n );\n};\n"],"names":["Email","value","error","hint","onChange","onBlur","onInvalid","translations","useText","jsx","Field","Input","SignIn","onClick","jsxs","event","LoginFormSkeleton","Skeleton","SkeletonRow","LoginFormComponent","className","customer","email","headingContent","name","onEmailBlur","onEmailChange","onEmailInvalid","title","props","VComponent","classes","LoginForm","WithConditionals","SignOut","DEBOUNCE_TIME","active","autoSync","displayHeadingContent","displayTitle","initialData","onCartSyncError","onSignInClick","onSignOutClick","onValidationError","slots","setCustomer","useState","setEmail","setError","isAuthenticated","setIsAuthenticated","isAvailable","setIsAvailable","isInitialized","setIsInitialized","debounceTimer","useRef","alreadyHaveAccountHint","cartSyncError","defaultTitle","fasterCheckoutHint","invalidEmailError","missingEmailError","signInLabel","setEmailAndCheckAvailability","useCallback","validateEmail","getCartEmail","isEmailAvailable","availability","setGuestEmailOnCart","handleChange","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","Slot","hintContent","Fragment"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{h as
|
|
3
|
+
import{h as se,s as ie}from"../chunks/fetch-graphql.js";import{classes as O,VComponent as me,deepmerge as de,Slot as G}from"@dropins/tools/lib.js";import{events as q}from"@dropins/tools/event-bus.js";import{v as le}from"../chunks/validation.js";import{s as Q}from"../chunks/setPaymentMethod.js";import{jsxs as D,jsx as c}from"@dropins/tools/preact-jsx-runtime.js";import{useState as _,useMemo as L,useCallback as p,useEffect as R}from"@dropins/tools/preact-hooks.js";import"../chunks/TermsAndConditions.js";import{Skeleton as ue,SkeletonRow as N,IllustratedMessage as pe,Icon as X,InLineAlert as he,ToggleButton as fe,RadioButton as ye}from"@dropins/tools/components.js";/* empty css */import*as T from"@dropins/tools/preact-compat.js";import{useRef as ke,useEffect as ge}from"@dropins/tools/preact-compat.js";/* empty css *//* empty css *//* empty css *//* empty css */import{P as ve}from"../chunks/PurchaseOrder.js";import{P as Ce}from"../chunks/PaymentOnAccount2.js";import{r as Se}from"../chunks/render.js";import{i as Me}from"../chunks/events.js";import{h as be,a as Ee}from"../chunks/events2.js";import{g as V,n as Pe}from"../chunks/values.js";import{W as we}from"../chunks/ConditionalWrapper.js";import{s as _e}from"../chunks/dom.js";import{useText as Y}from"@dropins/tools/i18n.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";import"../fragments.js";import"../chunks/guards.js";import"../chunks/synchronizeCheckout.js";import"../chunks/transform-shipping-methods.js";import"../chunks/classifiers.js";import"../chunks/getCompanyCredit.js";const Ne=e=>T.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...e},T.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M17.93 14.8V18.75H5.97C4.75 18.75 3.75 17.97 3.75 17V6.5M3.75 6.5C3.75 5.53 4.74 4.75 5.97 4.75H15.94V8.25H5.97C4.75 8.25 3.75 7.47 3.75 6.5Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),T.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M19.35 11.64H14.04V14.81H19.35V11.64Z",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"}),T.createElement("path",{vectorEffect:"non-scaling-stroke",d:"M17.9304 11.64V8.25H15.1504",stroke:"currentColor",strokeWidth:1,strokeLinecap:"round",strokeLinejoin:"round"})),Te=()=>D(ue,{"data-testid":"payment-methods-skeleton",children:[c(N,{size:"medium",variant:"heading"}),c(N,{size:"medium",variant:"empty"}),c(N,{fullWidth:!0,size:"xlarge"}),c(N,{fullWidth:!0,size:"xlarge"})]}),Ie=({UIComponentType:e="ToggleButton",busy:r,code:a,icon:i,onSelectionChange:o,selected:s,title:m})=>{const u={busy:r,className:"checkout-payment-methods__method",label:m,name:"payment-method",onChange:()=>o({code:a,title:m}),value:a};return e==="ToggleButton"?c(fe,{...u,icon:i?c(X,{source:i}):void 0,selected:s}):c(ye,{...u,checked:s,icon:i??void 0})},He=({className:e,error:r=null,busy:a=!1,onDismissError:i,onSelectionChange:o=()=>{},options:s,paymentMethodContent:m,selection:u,title:f,UIComponentType:S})=>{const v=Y({EmptyState:"Checkout.PaymentMethods.emptyState"}),d=r!==null,C=ke(null);return ge(()=>{d&&C.current&&_e(C.current)},[d]),D("div",{className:O(["checkout-payment-methods",e]),"data-testid":"checkout-payment-methods",children:[f&&c(me,{className:"checkout-payment-methods__title",node:f}),!a&&s.length===0&&c(pe,{"data-testid":"checkout-payment-methods-empty",icon:c(X,{source:Ne}),message:c("p",{children:v.EmptyState})}),D("div",{className:O(["checkout-payment-methods__wrapper",["checkout-payment-methods__wrapper--busy",a]]),"data-testid":"checkout-payment-methods-wrapper",children:[c("div",{className:O(["checkout-payment-methods__methods",["checkout-payment-methods--full-width",s.length%2!==0]]),children:s==null?void 0:s.map(y=>c(Ie,{UIComponentType:S,busy:a,code:y.code,icon:y.icon,selected:(u==null?void 0:u.code)===y.code,title:y.displayLabel??!0?y.title:"",onSelectionChange:o},y.code))}),m&&c("div",{className:"checkout-payment-methods__content",children:m})]}),d&&c("div",{ref:C,className:"checkout-payment-methods__error","data-testid":"checkout-payment-methods-alert",children:c(he,{heading:r,type:"error",variant:"primary",onDismiss:i})})]})},Oe=we(He,Te),Le=(e,r)=>{let a;return function(...i){clearTimeout(a),a=setTimeout(()=>e.apply(this,i),r)}};var Re=(e=>(e.PaymentOnAccount="companycredit",e.PurchaseOrder="purchaseorder",e))(Re||{});const J={companycredit:{Container:Ce,autoSync:!0,formName:"payment-on-account",validateRefNumber:!1},purchaseorder:{Container:ve,autoSync:!1,formName:"purchase-order",validateRefNumber:!0}},I=new Map,Ve=(e,r)=>{const a=`${e}-${r}`;if(!I.has(a)){const i=Le(async o=>{if(!r||le(o))try{await Q({code:e,purchase_order_number:o})}catch(s){console.error(`Failed to set payment method for ${e}:`,s)}},1e3);I.set(a,i)}return I.get(a)},w={},kt=()=>{Object.keys(w).forEach(e=>{delete w[e]}),I.clear()},K=e=>{if(!(e in J))throw new Error(`Invalid handler code: ${e}`);if(w[e])return w[e];const r=J[e],{autoSync:a,Container:i,formName:o,validateRefNumber:s}=r,m={enabled:!0,autoSync:a,render:u=>{var v;const f=String(((v=u.additionalData)==null?void 0:v.purchase_order_number)??""),S=document.createElement("div");Se.render(i,{name:o,initialReferenceNumber:f,onReferenceNumberChange:Ve(e,s)})(S),u.replaceHTML(S)}};return w[e]=m,m},Ae={companycredit:K("companycredit"),purchaseorder:K("purchaseorder")};function A(e,r){return e?r.some(a=>a.code===e.code):!1}function De(e,r){return!e||!r?!1:e.code===r.code}function We(e){return e?!!e.code&&!!e.title:!1}const gt=({UIComponentType:e="ToggleButton",active:r=!0,autoSync:a=!0,displayTitle:i=!0,slots:o,onCartSyncError:s,onSelectionChange:m})=>{const[u,f]=_(null),[S,v]=_(!1),[d,C]=_(null),[y,W]=_([]),ee=se.value,{cartSyncError:x,defaultTitle:z}=Y({cartSyncError:"Checkout.PaymentMethods.cartSyncError",defaultTitle:"Checkout.PaymentMethods.title"}),k=L(()=>{const t=(o==null?void 0:o.Methods)??{};return de(Ae,t)},[o==null?void 0:o.Methods]),U=p(t=>{var n;return(n=k[t.code])==null?void 0:n.render},[k]),B=p(t=>{const n=k[t.code];return n?n.autoSync!==!1:a},[a,k]),$=p(t=>{var l;return((l=k[t.code])==null?void 0:l.enabled)!==!1},[k]),te=p(t=>t.map(n=>{const l=k[n.code];return l?{...n,icon:l.icon}:n}),[k]),j=p(t=>{C(n=>n&&{...n,additionalData:t})},[]),ne=p(()=>{f(null)},[]),h=p(t=>{f(null),C(t)},[]),E=p(async(t,n)=>{(Me()||be())&&B(t)&&Q({code:t.code}).catch(g=>{h(n??null),f(s?null:x),s==null||s({method:t,error:g})})},[x,B,s,h]),re=p(async t=>{const n=V("selectedPaymentMethod");h(t),m==null||m(t),await E(t,n)},[m,h,E]),P=p(t=>{if(!t||t.isEmpty){h(null),W([]);return}const g=(t.availablePaymentMethods??[]).filter($);if(W(g),g.length===0){h(null);return}const M=t.selectedPaymentMethod??null,F=We(M),b=V("selectedPaymentMethod"),H=A(b,g),ce=De(b,M);if(b&&H&&!ce){E(b,M);return}if((!b||!H)&&F&&A(M,g)){h(M);return}if((!b||!H)&&(!F||!A(M,g))){const Z=g[0];h(Z),E(Z)}},[$,h,E]);R(()=>{if(!r)return;const t=Ee();if(t){v(!0);const l=V("selectedPaymentMethod");l&&C(l),P(t);return}const n=q.on("checkout/initialized",l=>{v(!0),P(l)},{eager:!0});return()=>{n==null||n.off()}},[r,P]),R(()=>{if(!r)return;const t=q.on("checkout/updated",P,{eager:!1});return()=>{t==null||t.off()}},[r,P]),R(()=>{Pe({selectedPaymentMethod:d})},[d]);const oe=L(()=>{if(i)return c(G,{name:"checkout-payment-methods-title",slot:o==null?void 0:o.Title,children:c("h2",{children:z})})},[i,o==null?void 0:o.Title,z]),ae=L(()=>{if(!d)return;const t=U(d);if(t)return c(G,{context:{additionalData:d.additionalData,cartId:ie.cartId??"",replaceHTML(n){this.replaceWith(n)},setAdditionalData:j},name:"PaymentMethodContent",slot:t},d.code)},[U,d,j]);return c(Oe,{UIComponentType:e,busy:ee,error:u,initialized:S,options:te(y),paymentMethodContent:ae,selection:d,title:oe,visible:r,onDismissError:ne,onSelectionChange:re})};export{Re as HandlerCode,gt as PaymentMethods,K as createHandler,gt as default,Ae as defaultHandlers,Ve as handleRefNumberChange,kt as resetHandlersCache};
|
|
4
4
|
//# sourceMappingURL=PaymentMethods.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentMethods.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Wallet.svg","/@dropins/storefront-checkout/src/components/PaymentMethods/PaymentMethodsSkeleton.tsx","/@dropins/storefront-checkout/src/components/PaymentMethods/PaymentMethods.tsx","../../node_modules/@adobe-commerce/elsie/src/lib/debounce.ts","/@dropins/storefront-checkout/src/containers/PaymentMethods/handlers.tsx","/@dropins/storefront-checkout/src/containers/PaymentMethods/PaymentMethods.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgWallet = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M17.93 14.8V18.75H5.97C4.75 18.75 3.75 17.97 3.75 17V6.5M3.75 6.5C3.75 5.53 4.74 4.75 5.97 4.75H15.94V8.25H5.97C4.75 8.25 3.75 7.47 3.75 6.5Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M19.35 11.64H14.04V14.81H19.35V11.64Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M17.9304 11.64V8.25H15.1504\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgWallet;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const PaymentMethodsSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"payment-methods-skeleton\">\n <SkeletonRow size=\"medium\" variant=\"heading\" />\n <SkeletonRow size=\"medium\" variant=\"empty\" />\n <SkeletonRow fullWidth={true} size=\"xlarge\" />\n <SkeletonRow fullWidth={true} size=\"xlarge\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport '@/checkout/components/PaymentMethods/PaymentMethods.css';\nimport { PaymentMethodsSkeleton } from '@/checkout/components/PaymentMethods/PaymentMethodsSkeleton';\nimport { PaymentMethodConfig } from '@/checkout/containers';\nimport { PaymentMethod } from '@/checkout/data/models/payment-method';\nimport { scrollToElement } from '@/checkout/lib';\nimport { UIComponentType } from '@/checkout/types';\nimport {\n Icon,\n IllustratedMessage,\n InLineAlert,\n RadioButton,\n ToggleButton,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Wallet } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useEffect, useRef } from 'preact/compat';\n\ninterface ExtendedPaymentMethod extends PaymentMethodConfig, PaymentMethod {}\n\nexport interface PaymentMethodsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n error?: string | null;\n busy?: boolean;\n onDismissError?: () => void;\n onSelectionChange?: (value: PaymentMethod) => void;\n options?: ExtendedPaymentMethod[];\n paymentMethodContent?: VNode;\n selection: PaymentMethod | null;\n title?: VNode;\n UIComponentType?: UIComponentType;\n}\n\ninterface PaymentOptionProps {\n UIComponentType?: UIComponentType;\n busy?: boolean;\n code: string;\n icon?: string;\n onSelectionChange: (value: PaymentMethod) => void;\n selected: boolean;\n title: string;\n}\n\nconst PaymentOption: FunctionComponent<PaymentOptionProps> = ({\n UIComponentType = 'ToggleButton',\n busy,\n code,\n icon,\n onSelectionChange,\n selected,\n title,\n}) => {\n const commonProps = {\n busy,\n className: 'checkout-payment-methods__method',\n label: title,\n name: 'payment-method',\n onChange: () => onSelectionChange({ code, title }),\n value: code,\n };\n\n return UIComponentType === 'ToggleButton' ? (\n <ToggleButton\n {...commonProps}\n // @ts-ignore\n icon={icon ? <Icon source={icon} /> : undefined}\n selected={selected}\n />\n ) : (\n <RadioButton {...commonProps} checked={selected} icon={icon ?? undefined} />\n );\n};\n\nconst PaymentMethodsComponent: FunctionComponent<PaymentMethodsProps> = ({\n className,\n error = null,\n busy = false,\n onDismissError,\n onSelectionChange = () => {},\n options,\n paymentMethodContent,\n selection,\n title,\n UIComponentType,\n}) => {\n const translations = useText({\n EmptyState: 'Checkout.PaymentMethods.emptyState',\n });\n\n const hasError = error !== null;\n const errorRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (hasError && errorRef.current) {\n scrollToElement(errorRef.current);\n }\n }, [hasError]);\n\n return (\n <div\n className={classes(['checkout-payment-methods', className])}\n data-testid=\"checkout-payment-methods\"\n >\n {title && (\n <VComponent className=\"checkout-payment-methods__title\" node={title} />\n )}\n\n {!busy && options!.length === 0 && (\n <IllustratedMessage\n data-testid=\"checkout-payment-methods-empty\"\n icon={<Icon source={Wallet} />}\n message={<p>{translations.EmptyState}</p>}\n />\n )}\n\n <div\n className={classes([\n 'checkout-payment-methods__wrapper',\n ['checkout-payment-methods__wrapper--busy', busy],\n ])}\n data-testid=\"checkout-payment-methods-wrapper\"\n >\n <div\n className={classes([\n 'checkout-payment-methods__methods',\n ['checkout-payment-methods--full-width', options!.length % 2 !== 0],\n ])}\n >\n {options?.map((method) => (\n <PaymentOption\n key={method.code}\n UIComponentType={UIComponentType}\n busy={busy}\n code={method.code}\n icon={method.icon}\n selected={selection?.code === method.code}\n title={method.displayLabel ?? true ? method.title : ''}\n onSelectionChange={onSelectionChange}\n />\n ))}\n </div>\n\n {paymentMethodContent && (\n <div className=\"checkout-payment-methods__content\">\n {paymentMethodContent}\n </div>\n )}\n </div>\n\n {hasError && (\n <div\n ref={errorRef}\n className=\"checkout-payment-methods__error\"\n data-testid=\"checkout-payment-methods-alert\"\n >\n <InLineAlert\n heading={error}\n type=\"error\"\n variant=\"primary\"\n onDismiss={onDismissError}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const PaymentMethods = WithConditionals(\n PaymentMethodsComponent,\n PaymentMethodsSkeleton\n);\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const debounce = (fn: Function, ms: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n return function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { setPaymentMethod } from '@/checkout/api';\nimport {\n PaymentMethodConfig,\n PaymentOnAccount,\n PurchaseOrder,\n} from '@/checkout/containers';\nimport { validateNotEmpty } from '@/checkout/lib/validation';\nimport { render as Checkout } from '@/checkout/render/render';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { debounce } from '@adobe-commerce/elsie/lib/debounce';\n\ninterface HandlerConfig {\n Container: Container<any>;\n autoSync: boolean;\n formName?: string;\n validateRefNumber: boolean;\n}\n\nexport enum HandlerCode {\n PaymentOnAccount = 'companycredit',\n PurchaseOrder = 'purchaseorder',\n}\n\nconst HANDLERS_CONFIG: Record<HandlerCode, HandlerConfig> = {\n [HandlerCode.PaymentOnAccount]: {\n Container: PaymentOnAccount,\n autoSync: true,\n formName: 'payment-on-account',\n validateRefNumber: false,\n },\n [HandlerCode.PurchaseOrder]: {\n Container: PurchaseOrder,\n autoSync: false,\n formName: 'purchase-order',\n validateRefNumber: true,\n },\n} as const;\n\n// Cache for debounced handlers to prevent memory leaks\nconst debouncedHandlers = new Map<string, ReturnType<typeof debounce>>();\n\nexport const handleRefNumberChange = (code: string, isRequired: boolean) => {\n const key = `${code}-${isRequired}`;\n\n if (!debouncedHandlers.has(key)) {\n const debouncedFn = debounce(async (refNumber: string) => {\n if (!isRequired || validateNotEmpty(refNumber)) {\n try {\n await setPaymentMethod({\n code,\n purchase_order_number: refNumber,\n });\n } catch (error) {\n console.error(`Failed to set payment method for ${code}:`, error);\n }\n }\n }, 1000);\n\n debouncedHandlers.set(key, debouncedFn);\n }\n\n return debouncedHandlers.get(key)!;\n};\n\nconst handlerCache: Partial<Record<HandlerCode, PaymentMethodConfig>> = {};\n\nexport const resetHandlersCache = () => {\n Object.keys(handlerCache).forEach((key) => {\n delete handlerCache[key as HandlerCode];\n });\n\n debouncedHandlers.clear();\n};\n\nexport const createHandler = (code: HandlerCode): PaymentMethodConfig => {\n if (!(code in HANDLERS_CONFIG)) {\n throw new Error(`Invalid handler code: ${code}`);\n }\n\n if (handlerCache[code]) {\n return handlerCache[code] as PaymentMethodConfig;\n }\n\n const config = HANDLERS_CONFIG[code];\n\n const { autoSync, Container, formName, validateRefNumber } = config;\n\n const handler: PaymentMethodConfig = {\n enabled: true,\n autoSync,\n render: (ctx) => {\n const initialReferenceNumber = String(\n ctx.additionalData?.purchase_order_number ?? ''\n );\n\n const $wrapper = document.createElement('div');\n\n Checkout.render(Container, {\n name: formName,\n initialReferenceNumber,\n onReferenceNumberChange: handleRefNumberChange(code, validateRefNumber),\n })($wrapper);\n\n ctx.replaceHTML($wrapper);\n },\n };\n\n handlerCache[code] = handler;\n\n return handler;\n};\n\nexport const defaultHandlers = {\n [HandlerCode.PaymentOnAccount]: createHandler(HandlerCode.PaymentOnAccount),\n [HandlerCode.PurchaseOrder]: createHandler(HandlerCode.PurchaseOrder),\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { setPaymentMethod } from '@/checkout/api';\nimport { PaymentMethods as PaymentMethodsComponent } from '@/checkout/components/PaymentMethods/PaymentMethods';\nimport { Cart } from '@/checkout/data/models/cart';\nimport {\n AdditionalData,\n PaymentMethod,\n} from '@/checkout/data/models/payment-method';\nimport { NegotiableQuote } from '@/checkout/data/models/quote';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasPendingUpdates,\n hasShippingAddress,\n isVirtualCart,\n notifyValues,\n state,\n} from '@/checkout/lib';\nimport { TitleProps, UIComponentType } from '@/checkout/types';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Container,\n deepmerge,\n Slot,\n SlotProps,\n} from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\nimport { defaultHandlers } from './handlers';\n\ninterface RenderContext {\n additionalData?: AdditionalData;\n cartId: string;\n replaceHTML: (domElement: HTMLElement) => void;\n setAdditionalData: (data: AdditionalData) => void;\n}\n\nexport interface PaymentMethodConfig {\n autoSync?: boolean;\n displayLabel?: boolean;\n enabled?: boolean;\n icon?: string;\n render?: SlotProps<RenderContext>;\n}\n\nexport interface PaymentMethodHandlers {\n [code: string]: PaymentMethodConfig;\n}\n\ninterface CartSyncError {\n method: PaymentMethod;\n error: Error;\n}\n\nexport interface PaymentMethodsProps\n extends HTMLAttributes<HTMLDivElement>,\n TitleProps {\n slots?: {\n Methods?: PaymentMethodHandlers;\n } & TitleProps['slots'];\n UIComponentType?: UIComponentType;\n active?: boolean;\n autoSync?: boolean;\n onCartSyncError?: (error: CartSyncError) => void;\n onSelectionChange?: (method: PaymentMethod) => void;\n}\n\nfunction isValidSelection(\n selection: PaymentMethod | null,\n options: PaymentMethod[]\n) {\n if (!selection) return false;\n return options.some((option) => option.code === selection.code);\n}\n\nfunction isEqual(a: PaymentMethod | null, b: PaymentMethod | null) {\n if (!a || !b) return false;\n return a.code === b.code;\n}\n\nfunction isValidPaymentMethod(method: PaymentMethod | null) {\n if (!method) return false;\n return !!method.code && !!method.title;\n}\n\nexport const PaymentMethods: Container<PaymentMethodsProps> = ({\n UIComponentType = 'ToggleButton',\n active = true,\n autoSync = true,\n displayTitle = true,\n slots,\n onCartSyncError,\n onSelectionChange,\n}) => {\n const [error, setError] = useState<string | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [selection, setSelection] = useState<PaymentMethod | null>(null);\n const [options, setOptions] = useState<PaymentMethod[]>([]);\n const isBusy = hasPendingUpdates.value;\n\n const availableHandlers = useMemo(() => {\n const customHandlers = slots?.Methods ?? {};\n return deepmerge(defaultHandlers, customHandlers);\n }, [slots?.Methods]);\n\n const enabledOptions = options\n .filter((method) => {\n return availableHandlers?.[method.code]?.enabled !== false;\n })\n .map((method) => {\n const slotMethod = availableHandlers?.[method.code] || {};\n\n return {\n ...method,\n ...slotMethod,\n };\n });\n\n const { cartSyncError, defaultTitle } = useText({\n cartSyncError: 'Checkout.PaymentMethods.cartSyncError',\n defaultTitle: 'Checkout.PaymentMethods.title',\n });\n\n const setAdditionalData = useCallback((additionalData: AdditionalData) => {\n setSelection((prev) => {\n if (!prev) return prev;\n return { ...prev, additionalData };\n });\n\n const currentSelection = getValue('selectedPaymentMethod');\n\n if (!currentSelection) return;\n\n notifyValues({\n selectedPaymentMethod: {\n ...currentSelection,\n additionalData,\n },\n });\n }, []);\n\n const handleDismissError = useCallback(() => {\n setError(null);\n }, []);\n\n const setUserSelection = useCallback((selection: PaymentMethod | null) => {\n setError(null);\n setSelection(selection);\n notifyValues({ selectedPaymentMethod: selection });\n }, []);\n\n const setUserSelectionOnCart = useCallback(\n async (selection: PaymentMethod, fallback?: PaymentMethod | null) => {\n const canSetUserSelectionOnCart = isVirtualCart() || hasShippingAddress();\n if (!canSetUserSelectionOnCart) return;\n\n const methodConfig = availableHandlers?.[selection.code];\n const shouldAutoSync = methodConfig?.autoSync ?? autoSync;\n\n if (!shouldAutoSync) return;\n\n setPaymentMethod({ code: selection.code }).catch((error) => {\n setUserSelection(fallback ?? null);\n onCartSyncError?.({ method: selection, error });\n\n if (!onCartSyncError) {\n setError(cartSyncError);\n }\n });\n },\n [\n availableHandlers,\n autoSync,\n setUserSelection,\n onCartSyncError,\n cartSyncError,\n ]\n );\n\n const handleSelectionChange = useCallback(\n async (selection: PaymentMethod) => {\n const prevSelection = getValue('selectedPaymentMethod');\n\n setUserSelection(selection);\n onSelectionChange?.(selection);\n\n await setUserSelectionOnCart(selection, prevSelection);\n },\n [onSelectionChange, setUserSelection, setUserSelectionOnCart]\n );\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const isEmptyCart = !data || data.isEmpty;\n\n if (isEmptyCart) {\n setUserSelection(null);\n setOptions([]);\n return;\n }\n\n const availableOptions = data.availablePaymentMethods ?? [];\n setOptions(availableOptions);\n\n if (availableOptions.length === 0) {\n setUserSelection(null);\n return;\n }\n\n const cartSelection = data.selectedPaymentMethod ?? null;\n const hasCartSelection = isValidPaymentMethod(cartSelection);\n const userSelection = getValue('selectedPaymentMethod');\n const isAvailable = isValidSelection(userSelection, availableOptions);\n const haveSameSelection = isEqual(userSelection, cartSelection);\n\n // User has valid selection that differs from cart\n if (userSelection && isAvailable && !haveSameSelection) {\n setUserSelectionOnCart(userSelection, cartSelection);\n return;\n }\n\n // User has invalid selection but cart has valid selection\n if (\n (!userSelection || !isAvailable) &&\n hasCartSelection &&\n isValidSelection(cartSelection, availableOptions)\n ) {\n setUserSelection(cartSelection);\n return;\n }\n\n // Neither user nor cart has valid selection (or both selections are unavailable)\n if (\n (!userSelection || !isAvailable) &&\n (!hasCartSelection ||\n !isValidSelection(cartSelection, availableOptions))\n ) {\n const newSelection = availableOptions[0];\n setUserSelection(newSelection);\n setUserSelectionOnCart(newSelection);\n }\n },\n [setUserSelection, setUserSelectionOnCart]\n );\n\n useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\n setIsInitialized(true);\n // When component becomes active, restore key state so handleCheckoutData can work properly\n const userSelection = getValue('selectedPaymentMethod');\n if (userSelection) {\n setSelection(userSelection);\n }\n handleCheckoutData(pastUpdate);\n return;\n }\n\n const onCheckoutInit = events.on(\n 'checkout/initialized',\n (data: Cart | NegotiableQuote | null) => {\n setIsInitialized(true);\n handleCheckoutData(data);\n },\n { eager: true }\n );\n\n return () => {\n onCheckoutInit?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n handleCheckoutData,\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n const selectionConfig = availableHandlers[selection?.code || ''];\n\n const paymentMethodContent = selectionConfig ? (\n <Slot\n key={selection?.code}\n context={{\n additionalData: selection?.additionalData,\n cartId: state.cartId ?? '',\n replaceHTML(domElement: HTMLElement) {\n this.replaceWith(domElement);\n },\n setAdditionalData,\n }}\n name=\"PaymentMethodContent\"\n slot={selectionConfig.render}\n />\n ) : undefined;\n\n const titleContent = useMemo(() => {\n if (!displayTitle) return undefined;\n\n return (\n <Slot name=\"checkout-payment-methods-title\" slot={slots?.Title}>\n <h2>{defaultTitle}</h2>\n </Slot>\n );\n }, [displayTitle, slots?.Title, defaultTitle]);\n\n return (\n <PaymentMethodsComponent\n UIComponentType={UIComponentType}\n busy={isBusy}\n error={error}\n initialized={isInitialized}\n options={enabledOptions}\n paymentMethodContent={paymentMethodContent}\n selection={selection}\n title={titleContent}\n visible={active}\n onDismissError={handleDismissError}\n onSelectionChange={handleSelectionChange}\n />\n );\n};\n"],"names":["SvgWallet","props","React","PaymentMethodsSkeleton","jsxs","Skeleton","jsx","SkeletonRow","PaymentOption","UIComponentType","busy","code","icon","onSelectionChange","selected","title","commonProps","ToggleButton","Icon","RadioButton","PaymentMethodsComponent","className","error","onDismissError","options","paymentMethodContent","selection","translations","useText","hasError","errorRef","useRef","useEffect","scrollToElement","classes","VComponent","IllustratedMessage","Wallet","method","InLineAlert","PaymentMethods","WithConditionals","debounce","fn","ms","timeoutId","args","HandlerCode","HANDLERS_CONFIG","PaymentOnAccount","PurchaseOrder","debouncedHandlers","handleRefNumberChange","isRequired","key","debouncedFn","refNumber","validateNotEmpty","setPaymentMethod","handlerCache","resetHandlersCache","createHandler","config","autoSync","Container","formName","validateRefNumber","handler","ctx","initialReferenceNumber","_a","$wrapper","Checkout","defaultHandlers","isValidSelection","option","isEqual","a","b","isValidPaymentMethod","active","displayTitle","slots","onCartSyncError","setError","useState","isInitialized","setIsInitialized","setSelection","setOptions","isBusy","hasPendingUpdates","availableHandlers","useMemo","customHandlers","deepmerge","enabledOptions","slotMethod","cartSyncError","defaultTitle","setAdditionalData","useCallback","additionalData","prev","currentSelection","getValue","notifyValues","handleDismissError","setUserSelection","setUserSelectionOnCart","fallback","isVirtualCart","hasShippingAddress","methodConfig","handleSelectionChange","prevSelection","handleCheckoutData","data","availableOptions","cartSelection","hasCartSelection","userSelection","isAvailable","haveSameSelection","newSelection","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","events","onCheckoutUpdated","selectionConfig","Slot","state","domElement","titleContent"],"mappings":"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","x_google_ignoreList":[0,3]}
|
|
1
|
+
{"version":3,"file":"PaymentMethods.js","sources":["../../node_modules/@adobe-commerce/elsie/src/icons/Wallet.svg","/@dropins/storefront-checkout/src/components/PaymentMethods/PaymentMethodsSkeleton.tsx","/@dropins/storefront-checkout/src/components/PaymentMethods/PaymentMethods.tsx","../../node_modules/@adobe-commerce/elsie/src/lib/debounce.ts","/@dropins/storefront-checkout/src/containers/PaymentMethods/handlers.tsx","/@dropins/storefront-checkout/src/containers/PaymentMethods/PaymentMethods.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgWallet = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M17.93 14.8V18.75H5.97C4.75 18.75 3.75 17.97 3.75 17V6.5M3.75 6.5C3.75 5.53 4.74 4.75 5.97 4.75H15.94V8.25H5.97C4.75 8.25 3.75 7.47 3.75 6.5Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M19.35 11.64H14.04V14.81H19.35V11.64Z\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }), /* @__PURE__ */ React.createElement(\"path\", { vectorEffect: \"non-scaling-stroke\", d: \"M17.9304 11.64V8.25H15.1504\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\" }));\nexport default SvgWallet;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Skeleton, SkeletonRow } from '@adobe-commerce/elsie/components';\nimport { FunctionComponent } from 'preact';\n\nexport const PaymentMethodsSkeleton: FunctionComponent = () => {\n return (\n <Skeleton data-testid=\"payment-methods-skeleton\">\n <SkeletonRow size=\"medium\" variant=\"heading\" />\n <SkeletonRow size=\"medium\" variant=\"empty\" />\n <SkeletonRow fullWidth={true} size=\"xlarge\" />\n <SkeletonRow fullWidth={true} size=\"xlarge\" />\n </Skeleton>\n );\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { WithConditionals } from '@/checkout/components/ConditionalWrapper/ConditionalWrapper';\nimport '@/checkout/components/PaymentMethods/PaymentMethods.css';\nimport { PaymentMethodsSkeleton } from '@/checkout/components/PaymentMethods/PaymentMethodsSkeleton';\nimport { PaymentMethodConfig } from '@/checkout/containers';\nimport { PaymentMethod } from '@/checkout/data/models/payment-method';\nimport { scrollToElement } from '@/checkout/lib';\nimport { UIComponentType } from '@/checkout/types';\nimport {\n Icon,\n IllustratedMessage,\n InLineAlert,\n RadioButton,\n ToggleButton,\n} from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Wallet } from '@adobe-commerce/elsie/icons';\nimport { classes, VComponent } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useEffect, useRef } from 'preact/compat';\n\ninterface ExtendedPaymentMethod extends PaymentMethodConfig, PaymentMethod {}\n\nexport interface PaymentMethodsProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n error?: string | null;\n busy?: boolean;\n onDismissError?: () => void;\n onSelectionChange?: (value: PaymentMethod) => void;\n options?: ExtendedPaymentMethod[];\n paymentMethodContent?: VNode;\n selection: PaymentMethod | null;\n title?: VNode;\n UIComponentType?: UIComponentType;\n}\n\ninterface PaymentOptionProps {\n UIComponentType?: UIComponentType;\n busy?: boolean;\n code: string;\n icon?: string;\n onSelectionChange: (value: PaymentMethod) => void;\n selected: boolean;\n title: string;\n}\n\nconst PaymentOption: FunctionComponent<PaymentOptionProps> = ({\n UIComponentType = 'ToggleButton',\n busy,\n code,\n icon,\n onSelectionChange,\n selected,\n title,\n}) => {\n const commonProps = {\n busy,\n className: 'checkout-payment-methods__method',\n label: title,\n name: 'payment-method',\n onChange: () => onSelectionChange({ code, title }),\n value: code,\n };\n\n return UIComponentType === 'ToggleButton' ? (\n <ToggleButton\n {...commonProps}\n // @ts-ignore\n icon={icon ? <Icon source={icon} /> : undefined}\n selected={selected}\n />\n ) : (\n <RadioButton {...commonProps} checked={selected} icon={icon ?? undefined} />\n );\n};\n\nconst PaymentMethodsComponent: FunctionComponent<PaymentMethodsProps> = ({\n className,\n error = null,\n busy = false,\n onDismissError,\n onSelectionChange = () => {},\n options,\n paymentMethodContent,\n selection,\n title,\n UIComponentType,\n}) => {\n const translations = useText({\n EmptyState: 'Checkout.PaymentMethods.emptyState',\n });\n\n const hasError = error !== null;\n const errorRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (hasError && errorRef.current) {\n scrollToElement(errorRef.current);\n }\n }, [hasError]);\n\n return (\n <div\n className={classes(['checkout-payment-methods', className])}\n data-testid=\"checkout-payment-methods\"\n >\n {title && (\n <VComponent className=\"checkout-payment-methods__title\" node={title} />\n )}\n\n {!busy && options!.length === 0 && (\n <IllustratedMessage\n data-testid=\"checkout-payment-methods-empty\"\n icon={<Icon source={Wallet} />}\n message={<p>{translations.EmptyState}</p>}\n />\n )}\n\n <div\n className={classes([\n 'checkout-payment-methods__wrapper',\n ['checkout-payment-methods__wrapper--busy', busy],\n ])}\n data-testid=\"checkout-payment-methods-wrapper\"\n >\n <div\n className={classes([\n 'checkout-payment-methods__methods',\n ['checkout-payment-methods--full-width', options!.length % 2 !== 0],\n ])}\n >\n {options?.map((method) => (\n <PaymentOption\n key={method.code}\n UIComponentType={UIComponentType}\n busy={busy}\n code={method.code}\n icon={method.icon}\n selected={selection?.code === method.code}\n title={method.displayLabel ?? true ? method.title : ''}\n onSelectionChange={onSelectionChange}\n />\n ))}\n </div>\n\n {paymentMethodContent && (\n <div className=\"checkout-payment-methods__content\">\n {paymentMethodContent}\n </div>\n )}\n </div>\n\n {hasError && (\n <div\n ref={errorRef}\n className=\"checkout-payment-methods__error\"\n data-testid=\"checkout-payment-methods-alert\"\n >\n <InLineAlert\n heading={error}\n type=\"error\"\n variant=\"primary\"\n onDismiss={onDismissError}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport const PaymentMethods = WithConditionals(\n PaymentMethodsComponent,\n PaymentMethodsSkeleton\n);\n","/********************************************************************\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const debounce = (fn: Function, ms: number) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n return function (this: any, ...args: any[]) {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn.apply(this, args), ms);\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { setPaymentMethod } from '@/checkout/api';\nimport {\n PaymentMethodConfig,\n PaymentOnAccount,\n PurchaseOrder,\n} from '@/checkout/containers';\nimport { validateNotEmpty } from '@/checkout/lib/validation';\nimport { render as Checkout } from '@/checkout/render/render';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { debounce } from '@adobe-commerce/elsie/lib/debounce';\n\ninterface HandlerConfig {\n Container: Container<any>;\n autoSync: boolean;\n formName?: string;\n validateRefNumber: boolean;\n}\n\nexport enum HandlerCode {\n PaymentOnAccount = 'companycredit',\n PurchaseOrder = 'purchaseorder',\n}\n\nconst HANDLERS_CONFIG: Record<HandlerCode, HandlerConfig> = {\n [HandlerCode.PaymentOnAccount]: {\n Container: PaymentOnAccount,\n autoSync: true,\n formName: 'payment-on-account',\n validateRefNumber: false,\n },\n [HandlerCode.PurchaseOrder]: {\n Container: PurchaseOrder,\n autoSync: false,\n formName: 'purchase-order',\n validateRefNumber: true,\n },\n} as const;\n\n// Cache for debounced handlers to prevent memory leaks\nconst debouncedHandlers = new Map<string, ReturnType<typeof debounce>>();\n\nexport const handleRefNumberChange = (code: string, isRequired: boolean) => {\n const key = `${code}-${isRequired}`;\n\n if (!debouncedHandlers.has(key)) {\n const debouncedFn = debounce(async (refNumber: string) => {\n if (!isRequired || validateNotEmpty(refNumber)) {\n try {\n await setPaymentMethod({\n code,\n purchase_order_number: refNumber,\n });\n } catch (error) {\n console.error(`Failed to set payment method for ${code}:`, error);\n }\n }\n }, 1000);\n\n debouncedHandlers.set(key, debouncedFn);\n }\n\n return debouncedHandlers.get(key)!;\n};\n\nconst handlerCache: Partial<Record<HandlerCode, PaymentMethodConfig>> = {};\n\nexport const resetHandlersCache = () => {\n Object.keys(handlerCache).forEach((key) => {\n delete handlerCache[key as HandlerCode];\n });\n\n debouncedHandlers.clear();\n};\n\nexport const createHandler = (code: HandlerCode): PaymentMethodConfig => {\n if (!(code in HANDLERS_CONFIG)) {\n throw new Error(`Invalid handler code: ${code}`);\n }\n\n if (handlerCache[code]) {\n return handlerCache[code] as PaymentMethodConfig;\n }\n\n const config = HANDLERS_CONFIG[code];\n\n const { autoSync, Container, formName, validateRefNumber } = config;\n\n const handler: PaymentMethodConfig = {\n enabled: true,\n autoSync,\n render: (ctx) => {\n const initialReferenceNumber = String(\n ctx.additionalData?.purchase_order_number ?? ''\n );\n\n const $wrapper = document.createElement('div');\n\n Checkout.render(Container, {\n name: formName,\n initialReferenceNumber,\n onReferenceNumberChange: handleRefNumberChange(code, validateRefNumber),\n })($wrapper);\n\n ctx.replaceHTML($wrapper);\n },\n };\n\n handlerCache[code] = handler;\n\n return handler;\n};\n\nexport const defaultHandlers = {\n [HandlerCode.PaymentOnAccount]: createHandler(HandlerCode.PaymentOnAccount),\n [HandlerCode.PurchaseOrder]: createHandler(HandlerCode.PurchaseOrder),\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { setPaymentMethod } from '@/checkout/api';\nimport { PaymentMethods as PaymentMethodsComponent } from '@/checkout/components/PaymentMethods/PaymentMethods';\nimport { Cart } from '@/checkout/data/models/cart';\nimport {\n AdditionalData,\n PaymentMethod\n} from '@/checkout/data/models/payment-method';\nimport { NegotiableQuote } from '@/checkout/data/models/quote';\nimport {\n getLatestCheckoutUpdate,\n getValue,\n hasPendingUpdates,\n hasShippingAddress,\n isVirtualCart,\n notifyValues,\n state\n} from '@/checkout/lib';\nimport { TitleProps, UIComponentType } from '@/checkout/types';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport {\n Container,\n deepmerge,\n Slot,\n SlotProps\n} from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport { HTMLAttributes } from 'preact/compat';\nimport { useCallback, useEffect, useMemo, useState } from 'preact/hooks';\nimport { defaultHandlers } from './handlers';\n\ninterface RenderContext {\n additionalData?: AdditionalData;\n cartId: string;\n replaceHTML: (domElement: HTMLElement) => void;\n setAdditionalData: (data: AdditionalData) => void;\n}\n\nexport interface PaymentMethodConfig {\n autoSync?: boolean;\n displayLabel?: boolean;\n enabled?: boolean;\n icon?: string;\n render?: SlotProps<RenderContext>;\n}\n\nexport interface PaymentMethodHandlers {\n [code: string]: PaymentMethodConfig;\n}\n\ninterface CartSyncError {\n method: PaymentMethod;\n error: Error;\n}\n\nexport interface PaymentMethodsProps\n extends HTMLAttributes<HTMLDivElement>,\n TitleProps {\n slots?: {\n Methods?: PaymentMethodHandlers;\n } & TitleProps['slots'];\n UIComponentType?: UIComponentType;\n active?: boolean;\n autoSync?: boolean;\n onCartSyncError?: (error: CartSyncError) => void;\n onSelectionChange?: (method: PaymentMethod) => void;\n}\n\nfunction isAvailable(\n selection: PaymentMethod | null,\n options: PaymentMethod[]\n) {\n if (!selection) return false;\n return options.some((option) => option.code === selection.code);\n}\n\nfunction isEqual(a: PaymentMethod | null, b: PaymentMethod | null) {\n if (!a || !b) return false;\n return a.code === b.code;\n}\n\nfunction isValid(method: PaymentMethod | null) {\n if (!method) return false;\n return !!method.code && !!method.title;\n}\n\nexport const PaymentMethods: Container<PaymentMethodsProps> = ({\n UIComponentType = 'ToggleButton',\n active = true,\n autoSync = true,\n displayTitle = true,\n slots,\n onCartSyncError,\n onSelectionChange,\n}) => {\n const [error, setError] = useState<string | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [selection, setSelection] = useState<PaymentMethod | null>(null);\n const [options, setOptions] = useState<PaymentMethod[]>([]);\n const isBusy = hasPendingUpdates.value;\n\n const { cartSyncError, defaultTitle } = useText({\n cartSyncError: 'Checkout.PaymentMethods.cartSyncError',\n defaultTitle: 'Checkout.PaymentMethods.title',\n });\n\n const availableHandlers = useMemo(() => {\n const customHandlers = slots?.Methods ?? {};\n return deepmerge(defaultHandlers, customHandlers);\n }, [slots?.Methods]);\n\n const getSlot = useCallback((method: PaymentMethod) => {\n return availableHandlers[method.code]?.render;\n }, [availableHandlers]);\n\n const hasAutoSyncEnabled = useCallback((method: PaymentMethod) => {\n const config = availableHandlers[method.code];\n if (!config) return autoSync;\n return config.autoSync !== false;\n }, [autoSync, availableHandlers]);\n\n const isEnabled = useCallback((method: PaymentMethod) => {\n const config = availableHandlers[method.code]?.enabled;\n return config !== false;\n }, [availableHandlers]);\n\n const withIcons = useCallback((options: PaymentMethod[]) => {\n return options.map((option) => {\n const handler = availableHandlers[option.code];\n if (!handler) return option;\n return {\n ...option,\n icon: handler.icon\n };\n });\n }, [availableHandlers]);\n\n const setAdditionalData = useCallback((additionalData: AdditionalData) => {\n setSelection((prev) => {\n if (!prev) return prev;\n return { ...prev, additionalData };\n });\n }, []);\n\n const handleDismissError = useCallback(() => {\n setError(null);\n }, []);\n\n const updateSelection = useCallback((selection: PaymentMethod | null) => {\n setError(null);\n setSelection(selection);\n }, []);\n\n const updateCartSelection = useCallback(\n async (selection: PaymentMethod, fallback?: PaymentMethod | null) => {\n const canSetSelectionOnCart = isVirtualCart() || hasShippingAddress();\n\n if (!canSetSelectionOnCart) return;\n if (!hasAutoSyncEnabled(selection)) return;\n\n setPaymentMethod({ code: selection.code }).catch((error) => {\n updateSelection(fallback ?? null);\n setError(onCartSyncError ? null : cartSyncError);\n onCartSyncError?.({ method: selection, error });\n });\n },\n [\n cartSyncError,\n hasAutoSyncEnabled,\n onCartSyncError,\n updateSelection,\n ]\n );\n\n const handleSelectionChange = useCallback(\n async (selection: PaymentMethod) => {\n const prevSelection = getValue('selectedPaymentMethod');\n updateSelection(selection);\n onSelectionChange?.(selection);\n await updateCartSelection(selection, prevSelection);\n },\n [onSelectionChange, updateSelection, updateCartSelection]\n );\n\n const handleCheckoutData = useCallback(\n (data: Cart | NegotiableQuote | null) => {\n const isEmptyCart = !data || data.isEmpty;\n\n if (isEmptyCart) {\n updateSelection(null);\n setOptions([]);\n return;\n }\n\n const availableOptions = data.availablePaymentMethods ?? [];\n const enabledOptions = availableOptions.filter(isEnabled);\n\n setOptions(enabledOptions);\n\n if (enabledOptions.length === 0) {\n updateSelection(null);\n return;\n }\n\n const cartSelection = data.selectedPaymentMethod ?? null;\n const hasCartSelection = isValid(cartSelection);\n const userSelection = getValue('selectedPaymentMethod');\n const isUserSelectionAvailable = isAvailable(userSelection, enabledOptions);\n const haveSameSelection = isEqual(userSelection, cartSelection);\n\n // User has valid selection that differs from cart\n if (userSelection && isUserSelectionAvailable && !haveSameSelection) {\n updateCartSelection(userSelection, cartSelection);\n return;\n }\n\n // User has invalid selection but cart has valid selection\n if (\n (!userSelection || !isUserSelectionAvailable) &&\n hasCartSelection &&\n isAvailable(cartSelection, enabledOptions)\n ) {\n updateSelection(cartSelection);\n return;\n }\n\n // Neither user nor cart has valid selection (or both selections are unavailable)\n if (\n (!userSelection || !isUserSelectionAvailable) &&\n (!hasCartSelection ||\n !isAvailable(cartSelection, enabledOptions))\n ) {\n const newSelection = enabledOptions[0];\n updateSelection(newSelection);\n updateCartSelection(newSelection);\n }\n },\n [isEnabled, updateSelection, updateCartSelection]\n );\n\n useEffect(() => {\n if (!active) return;\n\n const pastUpdate = getLatestCheckoutUpdate();\n\n if (pastUpdate) {\n setIsInitialized(true);\n // When component becomes active, restore key state so handleCheckoutData can work properly\n const userSelection = getValue('selectedPaymentMethod');\n if (userSelection) {\n setSelection(userSelection);\n }\n handleCheckoutData(pastUpdate);\n return;\n }\n\n const onCheckoutInit = events.on(\n 'checkout/initialized',\n (data: Cart | NegotiableQuote | null) => {\n setIsInitialized(true);\n handleCheckoutData(data);\n },\n { eager: true }\n );\n\n return () => {\n onCheckoutInit?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n if (!active) return;\n\n const onCheckoutUpdated = events.on(\n 'checkout/updated',\n handleCheckoutData,\n { eager: false }\n );\n\n return () => {\n onCheckoutUpdated?.off();\n };\n }, [active, handleCheckoutData]);\n\n useEffect(() => {\n notifyValues({ selectedPaymentMethod: selection });\n }, [selection]);\n\n const titleContent = useMemo(() => {\n if (!displayTitle) return undefined;\n\n return (\n <Slot name=\"checkout-payment-methods-title\" slot={slots?.Title}>\n <h2>{defaultTitle}</h2>\n </Slot>\n );\n }, [displayTitle, slots?.Title, defaultTitle]);\n\n const paymentMethodContent = useMemo(() => {\n if (!selection) return;\n\n const slot = getSlot(selection);\n if (!slot) return;\n\n return (\n <Slot\n key={selection!.code}\n context={{\n additionalData: selection!.additionalData,\n cartId: state.cartId ?? '',\n replaceHTML(domElement: HTMLElement) {\n this.replaceWith(domElement);\n },\n setAdditionalData,\n }}\n name=\"PaymentMethodContent\"\n slot={slot}\n />\n );\n\n }, [getSlot, selection, setAdditionalData]);\n\n return (\n <PaymentMethodsComponent\n UIComponentType={UIComponentType}\n busy={isBusy}\n error={error}\n initialized={isInitialized}\n options={withIcons(options)}\n paymentMethodContent={paymentMethodContent}\n selection={selection}\n title={titleContent}\n visible={active}\n onDismissError={handleDismissError}\n onSelectionChange={handleSelectionChange}\n />\n );\n};\n"],"names":["SvgWallet","props","React","PaymentMethodsSkeleton","jsxs","Skeleton","jsx","SkeletonRow","PaymentOption","UIComponentType","busy","code","icon","onSelectionChange","selected","title","commonProps","ToggleButton","Icon","RadioButton","PaymentMethodsComponent","className","error","onDismissError","options","paymentMethodContent","selection","translations","useText","hasError","errorRef","useRef","useEffect","scrollToElement","classes","VComponent","IllustratedMessage","Wallet","method","InLineAlert","PaymentMethods","WithConditionals","debounce","fn","ms","timeoutId","args","HandlerCode","HANDLERS_CONFIG","PaymentOnAccount","PurchaseOrder","debouncedHandlers","handleRefNumberChange","isRequired","key","debouncedFn","refNumber","validateNotEmpty","setPaymentMethod","handlerCache","resetHandlersCache","createHandler","config","autoSync","Container","formName","validateRefNumber","handler","ctx","initialReferenceNumber","_a","$wrapper","Checkout","defaultHandlers","isAvailable","option","isEqual","a","b","isValid","active","displayTitle","slots","onCartSyncError","setError","useState","isInitialized","setIsInitialized","setSelection","setOptions","isBusy","hasPendingUpdates","cartSyncError","defaultTitle","availableHandlers","useMemo","customHandlers","deepmerge","getSlot","useCallback","hasAutoSyncEnabled","isEnabled","withIcons","setAdditionalData","additionalData","prev","handleDismissError","updateSelection","updateCartSelection","fallback","isVirtualCart","hasShippingAddress","handleSelectionChange","prevSelection","getValue","handleCheckoutData","data","enabledOptions","cartSelection","hasCartSelection","userSelection","isUserSelectionAvailable","haveSameSelection","newSelection","pastUpdate","getLatestCheckoutUpdate","onCheckoutInit","events","onCheckoutUpdated","notifyValues","titleContent","Slot","slot","state","domElement"],"mappings":"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","x_google_ignoreList":[0,3]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/*! Copyright 2025 Adobe
|
|
2
2
|
All Rights Reserved. */
|
|
3
|
-
import{P as d,P as l}from"../chunks/PaymentOnAccount2.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/components.js";import"@dropins/tools/lib.js"
|
|
3
|
+
import{P as d,P as l}from"../chunks/PaymentOnAccount2.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"../chunks/ConditionalWrapper.js";/* empty css */import"@dropins/tools/components.js";import"@dropins/tools/lib.js";import"@dropins/tools/i18n.js";import"../chunks/fetch-graphql.js";import"@dropins/tools/event-bus.js";import"@dropins/tools/signals.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/getCompanyCredit.js";export{d as PaymentOnAccount,l as default};
|
|
4
4
|
//# sourceMappingURL=PaymentOnAccount.js.map
|
package/i18n/en_US.json.d.ts
CHANGED
|
@@ -88,7 +88,8 @@ declare const _default: {
|
|
|
88
88
|
"button": "Try again",
|
|
89
89
|
"contactSupport": "If you continue to have issues, please contact support.",
|
|
90
90
|
"title": "We were unable to process your order",
|
|
91
|
-
"unexpected": "An unexpected error occurred while processing your order. Please try again later."
|
|
91
|
+
"unexpected": "An unexpected error occurred while processing your order. Please try again later.",
|
|
92
|
+
"permissionDenied": "You do not have permission to complete checkout. Please contact your administrator for assistance."
|
|
92
93
|
},
|
|
93
94
|
"Quote": {
|
|
94
95
|
"permissionDenied": "You do not have permission to checkout with this quote.",
|
|
@@ -21,7 +21,8 @@ export declare enum ErrorCodes {
|
|
|
21
21
|
UNAUTHENTICATED = "UNAUTHENTICATED",
|
|
22
22
|
UNKNOWN_ERROR = "UNKNOWN_ERROR",
|
|
23
23
|
QUOTE_DATA_ERROR = "QUOTE_DATA_ERROR",
|
|
24
|
-
QUOTE_PERMISSION_DENIED = "QUOTE_PERMISSION_DENIED"
|
|
24
|
+
QUOTE_PERMISSION_DENIED = "QUOTE_PERMISSION_DENIED",
|
|
25
|
+
PERMISSION_DENIED = "PERMISSION_DENIED"
|
|
25
26
|
}
|
|
26
27
|
export interface ErrorClassifier {
|
|
27
28
|
/**
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name": "@dropins/storefront-checkout", "version": "2.2.0-
|
|
1
|
+
{"name": "@dropins/storefront-checkout", "version": "2.2.0-beta1", "@dropins/tools": "^1.6.0-beta2", "license": "SEE LICENSE IN LICENSE.md"}
|
package/types/index.d.ts
CHANGED
|
@@ -17,6 +17,6 @@
|
|
|
17
17
|
export type { InitializeInput, Nullable, SynchronizeInput } from './api';
|
|
18
18
|
export type { TitleProps, UIComponentType } from './components';
|
|
19
19
|
export * from './guards';
|
|
20
|
-
export type { CartModel, FormRef, Item, NegotiableQuoteModel, RenderAPI, } from './storefront';
|
|
20
|
+
export type { CartModel, FormRef, Item, NegotiableQuoteModel, PermissionsModel, RenderAPI, } from './storefront';
|
|
21
21
|
export type { Filter, Selector } from './utils';
|
|
22
22
|
//# sourceMappingURL=index.d.ts.map
|