@dropins/storefront-cart 1.5.2-alpha012 → 1.6.0-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/api/fragments.d.ts +1 -0
  2. package/api/graphql/ShippingMethodFragment.d.ts +18 -0
  3. package/api.js +1 -1
  4. package/api.js.map +1 -1
  5. package/chunks/CartSummaryGrid.js +1 -1
  6. package/chunks/CartSummaryGrid.js.map +1 -1
  7. package/chunks/CartSummaryList.js +1 -1
  8. package/chunks/CartSummaryList.js.map +1 -1
  9. package/chunks/CartSummaryTable2.js +1 -1
  10. package/chunks/CartSummaryTable2.js.map +1 -1
  11. package/chunks/EmptyCart.js +1 -1
  12. package/chunks/EmptyCart.js.map +1 -1
  13. package/chunks/EmptyCart2.js +1 -1
  14. package/chunks/EmptyCart2.js.map +1 -1
  15. package/chunks/OrderSummary.js +1 -1
  16. package/chunks/OrderSummary.js.map +1 -1
  17. package/chunks/OrderSummaryLine.js +1 -1
  18. package/chunks/OrderSummaryLine.js.map +1 -1
  19. package/chunks/OrderSummaryLine2.js +4 -0
  20. package/chunks/OrderSummaryLine2.js.map +1 -0
  21. package/chunks/ShippingOrderSummaryLine.js +4 -0
  22. package/chunks/ShippingOrderSummaryLine.js.map +1 -0
  23. package/chunks/acdl.js +1 -1
  24. package/chunks/applyCouponsToCart.js +2 -2
  25. package/chunks/applyCouponsToCart.js.map +1 -1
  26. package/chunks/createGuestCart.js +2 -2
  27. package/chunks/createGuestCart.js.map +1 -1
  28. package/chunks/getEstimateShipping.js +2 -2
  29. package/chunks/getEstimateShipping.js.map +1 -1
  30. package/chunks/getEstimatedTotals.js +2 -2
  31. package/chunks/getEstimatedTotals.js.map +1 -1
  32. package/chunks/persisted-data.js +1 -1
  33. package/chunks/refreshCart.js +7 -7
  34. package/chunks/refreshCart.js.map +1 -1
  35. package/chunks/removeGiftCardFromCart.js +3 -3
  36. package/chunks/removeGiftCardFromCart.js.map +1 -1
  37. package/chunks/resetCart.js +1 -1
  38. package/chunks/resetCart.js.map +1 -1
  39. package/chunks/setGiftOptionsOnCart.js +2 -2
  40. package/chunks/setGiftOptionsOnCart.js.map +1 -1
  41. package/chunks/state.js +4 -0
  42. package/chunks/state.js.map +1 -0
  43. package/chunks/updateProductsFromCart.js +2 -2
  44. package/chunks/updateProductsFromCart.js.map +1 -1
  45. package/components/ShippingOrderSummaryLine/ShippingOrderSummaryLine.d.ts +13 -0
  46. package/components/ShippingOrderSummaryLine/index.d.ts +18 -0
  47. package/components/index.d.ts +1 -0
  48. package/containers/CartSummaryGrid.js +1 -1
  49. package/containers/CartSummaryList.js +1 -1
  50. package/containers/CartSummaryTable.js +1 -1
  51. package/containers/Coupons.js +1 -1
  52. package/containers/Coupons.js.map +1 -1
  53. package/containers/EmptyCart.js +1 -1
  54. package/containers/EstimateShipping.js +1 -1
  55. package/containers/EstimateShipping.js.map +1 -1
  56. package/containers/GiftCards.js +1 -1
  57. package/containers/GiftCards.js.map +1 -1
  58. package/containers/GiftOptions.js +1 -1
  59. package/containers/GiftOptions.js.map +1 -1
  60. package/containers/MiniCart.js +1 -1
  61. package/containers/MiniCart.js.map +1 -1
  62. package/containers/OrderSummary.js +1 -1
  63. package/containers/OrderSummaryLine.js +1 -1
  64. package/containers/ShippingOrderSummaryLine/ShippingOrderSummaryLine.d.ts +7 -0
  65. package/containers/ShippingOrderSummaryLine/index.d.ts +19 -0
  66. package/containers/ShippingOrderSummaryLine.d.ts +3 -0
  67. package/containers/ShippingOrderSummaryLine.js +4 -0
  68. package/containers/ShippingOrderSummaryLine.js.map +1 -0
  69. package/containers/index.d.ts +1 -0
  70. package/data/models/cart-model.d.ts +3 -16
  71. package/data/models/shipping-models.d.ts +5 -2
  72. package/fragments.js +30 -7
  73. package/fragments.js.map +1 -1
  74. package/i18n/en_US.json.d.ts +5 -0
  75. package/package.json +1 -1
  76. package/render.js +4 -3
  77. package/render.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"updateProductsFromCart.js","sources":["/@dropins/storefront-cart/src/api/addProductsToCart/graphql/AddProductsToCartMutation.ts","/@dropins/storefront-cart/src/api/updateProductsFromCart/graphql/UpdateProductsMutation.ts","/@dropins/storefront-cart/src/api/updateProductsFromCart/updateProductsFromCart.ts"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CART_FRAGMENT } from '@/cart/api/graphql/CartFragment';\n\nexport const ADD_PRODUCTS_TO_CART_MUTATION = `\n mutation ADD_PRODUCTS_TO_CART_MUTATION(\n $cartId: String!, \n $cartItems: [CartItemInput!]!,\n $pageSize: Int! = 100,\n $currentPage: Int! = 1,\n $itemsSortInput: QuoteItemsSortInput! = {field: CREATED_AT, order: DESC}\n ) {\n addProductsToCart(\n cartId: $cartId\n cartItems: $cartItems\n ) {\n cart {\n ...CART_FRAGMENT\n }\n user_errors {\n code\n message\n }\n }\n }\n \n ${CART_FRAGMENT}\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CART_FRAGMENT } from '@/cart/api/graphql/CartFragment';\n\nexport const UPDATE_PRODUCTS_FROM_CART_MUTATION = `\n mutation UPDATE_PRODUCTS_FROM_CART_MUTATION(\n $cartId: String!, \n $cartItems: [CartItemUpdateInput!]!,\n $pageSize: Int! = 100,\n $currentPage: Int! = 1,\n $itemsSortInput: QuoteItemsSortInput! = {field: CREATED_AT, order: DESC}\n ) {\n updateCartItems(\n input: {\n cart_id: $cartId\n cart_items: $cartItems\n }\n ) {\n cart {\n ...CART_FRAGMENT\n }\n\n }\n }\n\n ${CART_FRAGMENT}\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { state } from '@/cart/lib/state';\nimport { fetchGraphQl } from '@/cart/api';\nimport { handleFetchError } from '@/cart/lib/fetch-error';\nimport { CartModel } from '@/cart/data/models';\nimport { transformCart } from '@/cart/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { publishCartUpdateEvents } from '@/cart/lib/acdl';\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { ADD_PRODUCTS_TO_CART_MUTATION } from '../addProductsToCart/graphql/AddProductsToCartMutation';\nimport { UPDATE_PRODUCTS_FROM_CART_MUTATION } from './graphql/UpdateProductsMutation';\n\ntype UpdateProductsFromCart = Array<{\n uid: string;\n quantity: number;\n sku?: string;\n parentSku?: string;\n optionsUIDs?: string[];\n enteredOptions?: { uid: string; value: string }[];\n giftOptions?: {\n gift_wrapping_id?: string | null;\n gift_message: {\n to: string;\n from: string;\n message: string;\n };\n };\n customFields?: Record<string, any>;\n}>;\n\ntype ItemError = {\n message: string;\n path?: string[];\n extensions?: {\n category: string;\n };\n};\n\n/**\n * Collects individual item errors from cart items response\n * @param cartItems - The cart items from the response\n * @param updatedItemUIDs - Array of UIDs of items that were updated\n * @returns Array of ItemError objects\n */\nconst collectCartItemErrors = (\n cartItems: Array<{\n uid: string;\n errors?: Array<{ message: string; code: string }>;\n }>,\n updatedItemUIDs: string[]\n): ItemError[] => {\n const itemErrors: ItemError[] = [];\n\n cartItems\n .filter(\n (item) => item.errors && updatedItemUIDs.some((uid) => uid === item.uid)\n )\n .forEach((item) => {\n item.errors?.forEach((error) => {\n itemErrors.push({\n message: error.message,\n path: [item.uid],\n extensions: {\n category: error.code,\n },\n });\n });\n });\n\n return itemErrors;\n};\n\n/**\n * Creates the arrays of cart items to be sent to the graphql mutations\n *\n * @param items\n * @param currentCartItems\n * @returns {\n * itemsToAdd: Array<{\n * sku: string;\n * parentSku: string;\n * quantity: number;\n * optionsUIDs: string[];\n * enteredOptions: { uid: string; value: string }[];\n * customFields: Record<string, any>;\n * }>\n * itemsToRemove: Array<string>\n * itemsToUpdate: Array<{\n * uid: string;\n * quantity: number;\n * customFields: Record<string, any>;\n * }>\n * }\n */\nconst getCartItems = (\n items: UpdateProductsFromCart,\n currentCartItems: Array<\n CartModel['items'][number] & { customFields?: Record<string, any> }\n >\n) => {\n const itemsToAdd: Array<{\n sku?: string;\n parentSku?: string;\n quantity: number;\n optionsUIDs?: string[];\n enteredOptions?: { uid: string; value: string }[];\n customFields?: Record<string, any>;\n }> = [];\n // Items to remove from the cart will be items that have optionUIDs and\n // their optionUIDs are not the same as their matching entry in the current cart item identified by the uid\n const itemsToRemove: Array<string> = [];\n const itemsToUpdate: Array<{\n uid: string;\n quantity: number;\n giftOptions?: {\n gift_wrapping_id?: string | null;\n gift_message: {\n to: string;\n from: string;\n message: string;\n };\n };\n customFields?: Record<string, any>;\n }> = [];\n\n items.forEach((item) => {\n // Check if the item exists in the cart\n const currentItem = currentCartItems.find(\n (cartItem) => cartItem.uid === item.uid\n );\n\n if (currentItem) {\n if (item.optionsUIDs) {\n const currentItemOptions = Object.values(\n currentItem?.selectedOptionsUIDs ?? {}\n );\n\n // Check if options are exactly the same as current item\n const hasSameOptions =\n item.optionsUIDs.every((optionUID) =>\n currentItemOptions.includes(optionUID)\n ) && item.optionsUIDs.length === currentItemOptions.length;\n\n if (hasSameOptions) {\n // Same item, same options: update quantity directly\n itemsToUpdate.push({\n uid: item.uid,\n quantity: item.quantity,\n giftOptions: item.giftOptions,\n customFields: item.customFields,\n });\n } else {\n // Different options: check if there's another item in cart with these new options\n const existingItemWithNewOptions = currentCartItems.find(\n (cartItem) => {\n const cartItemOptions = Object.values(\n cartItem?.selectedOptionsUIDs ?? {}\n );\n return (\n cartItem.uid !== item.uid && // Different item\n cartItem.sku === currentItem.sku && // Same SKU\n item.optionsUIDs!.every((optionUID) =>\n cartItemOptions.includes(optionUID)\n ) &&\n item.optionsUIDs!.length === cartItemOptions.length\n );\n }\n );\n\n if (existingItemWithNewOptions) {\n // Merge: Update existing item with combined quantity and remove current item\n itemsToUpdate.push({\n uid: existingItemWithNewOptions.uid,\n quantity: existingItemWithNewOptions.quantity + item.quantity,\n giftOptions: item.giftOptions,\n customFields: item.customFields,\n });\n itemsToRemove.push(item.uid);\n } else {\n // Add new item and remove old one\n const { sku, topLevelSku: parentSku } = currentItem;\n const { optionsUIDs, enteredOptions, quantity, customFields } =\n item;\n\n itemsToAdd.push({\n sku,\n parentSku,\n quantity,\n optionsUIDs,\n enteredOptions,\n customFields,\n });\n\n itemsToRemove.push(item.uid);\n }\n }\n } else if (item.customFields) {\n const { sku, topLevelSku: parentSku } = currentItem;\n const { optionsUIDs, enteredOptions, quantity, customFields } = item;\n\n itemsToAdd.push({\n sku,\n parentSku,\n quantity,\n optionsUIDs,\n enteredOptions,\n customFields,\n });\n itemsToRemove.push(item.uid);\n } else {\n itemsToUpdate.push({\n uid: item.uid,\n quantity: item.quantity,\n giftOptions: item.giftOptions,\n customFields: item.customFields,\n });\n }\n } else {\n throw Error(\n `Invalid Cart Item UID: No matching cart entry found for ${item.uid}`\n );\n }\n });\n\n return {\n itemsToAdd,\n itemsToRemove,\n itemsToUpdate,\n };\n};\n\nconst DELETE_ITEM_QUANTITY = 0;\n\nexport const updateProductsFromCart = async (\n items: UpdateProductsFromCart\n): Promise<CartModel | null> => {\n const cartId = state.cartId;\n const cart = getPersistedCartData();\n\n if (!cartId) {\n return Promise.reject(new Error('Cart ID is not set'));\n }\n\n if (!cart) {\n return Promise.reject(new Error('Cart is not set'));\n }\n\n const { itemsToAdd, itemsToRemove, itemsToUpdate } = getCartItems(\n items,\n cart.items\n );\n\n // Array of promises to be resolved\n let results: Array<Promise<CartModel | null>> = [];\n\n // If there are items with options and matching cart items, add the products to the cart and remove the old one.\n // Note: The SKU must be the incoming parent sku and not the current cart item sku.\n if (itemsToAdd.length > 0) {\n results.push(\n fetchGraphQl(ADD_PRODUCTS_TO_CART_MUTATION, {\n variables: {\n cartId,\n cartItems: itemsToAdd.map(\n ({\n parentSku: sku,\n quantity,\n optionsUIDs: selected_options,\n enteredOptions: entered_options,\n customFields,\n }) => ({\n sku,\n quantity,\n selected_options,\n entered_options,\n ...(customFields ? customFields : {}),\n })\n ),\n },\n })\n .then(({ errors, data }) => {\n // Collect individual item errors from the response\n const updatedItemsErrors = collectCartItemErrors(\n data?.addProductsToCart?.cart?.itemsV2.items || [],\n items.map((item) => item.uid)\n );\n\n // handle errors\n const _errors = [\n ...(data?.addProductsToCart?.user_errors ?? []),\n ...(errors ?? []),\n ...updatedItemsErrors,\n ];\n\n if (_errors.length > 0) return handleFetchError(_errors);\n\n if (itemsToRemove.length > 0) {\n // remove the old item\n return updateProductQuantities(\n cartId,\n itemsToRemove.map((uid) => ({\n uid,\n quantity: DELETE_ITEM_QUANTITY, //Delete Item\n }))\n ).catch((error) => {\n return Promise.reject(\n new Error(`Failed to update products in cart: ${error}`)\n );\n });\n }\n return Promise.resolve(transformCart(data?.addProductsToCart?.cart));\n })\n .then((payload) => {\n // emit events\n events.emit('cart/updated', payload);\n events.emit('cart/data', payload);\n\n // Publish cart update events\n publishCartUpdateEvents(payload!, items, state.locale ?? 'en-US');\n\n return Promise.resolve(payload);\n })\n .catch((error) => {\n return Promise.reject(\n new Error(`Failed to add products to cart: ${error}`)\n );\n })\n );\n }\n\n if (itemsToUpdate.length > 0) {\n results.push(\n updateProductQuantities(cartId, itemsToUpdate).catch((error) => {\n return Promise.reject(new Error(error));\n })\n );\n }\n\n // Return the last promise in the results array\n return Promise.all(results).then((results) => results[results.length - 1]);\n};\n\nconst updateProductQuantities = async (\n cartId: string,\n items: UpdateProductsFromCart\n): Promise<CartModel | null> => {\n return fetchGraphQl(UPDATE_PRODUCTS_FROM_CART_MUTATION, {\n variables: {\n cartId,\n cartItems: items.map(({ uid, quantity, giftOptions }) => ({\n cart_item_uid: uid,\n quantity,\n ...giftOptions,\n })),\n },\n }).then(({ errors, data }) => {\n // Collect individual item errors from the response using the new function\n const updatedItemsErrors = collectCartItemErrors(\n data?.updateCartItems?.cart?.itemsV2.items || [],\n items.map((item) => item.uid)\n );\n\n // handle errors\n const _errors = [\n ...(data?.updateCartItems?.user_errors ?? []),\n ...(errors ?? []),\n ...updatedItemsErrors,\n ];\n\n // transform cart\n const payload =\n data?.updateCartItems && transformCart(data.updateCartItems.cart);\n\n // Emit data event\n if (payload) {\n events.emit('cart/data', payload);\n }\n\n if (_errors.length > 0) return handleFetchError(_errors);\n\n // No errors, emit updated event\n events.emit('cart/updated', payload);\n\n // emit product updated events\n if (payload) {\n const updatedItems = payload.items.filter(\n (item: CartModel['items'][number]) =>\n items.some((updateItem) => updateItem.uid === item.uid)\n );\n\n events.emit('cart/product/updated', updatedItems);\n }\n\n // data collection\n if (payload) {\n // Publish cart update events\n publishCartUpdateEvents(payload, items, state.locale ?? 'en-US');\n }\n\n return payload;\n });\n};\n"],"names":["ADD_PRODUCTS_TO_CART_MUTATION","CART_FRAGMENT","UPDATE_PRODUCTS_FROM_CART_MUTATION","collectCartItemErrors","cartItems","updatedItemUIDs","itemErrors","item","uid","_a","error","getCartItems","items","currentCartItems","itemsToAdd","itemsToRemove","itemsToUpdate","currentItem","cartItem","currentItemOptions","optionUID","existingItemWithNewOptions","cartItemOptions","sku","parentSku","optionsUIDs","enteredOptions","quantity","customFields","DELETE_ITEM_QUANTITY","updateProductsFromCart","cartId","state","cart","getPersistedCartData","results","fetchGraphQl","selected_options","entered_options","errors","data","updatedItemsErrors","_b","_errors","_c","handleFetchError","updateProductQuantities","transformCart","_d","payload","events","publishCartUpdateEvents","giftOptions","updatedItems","updateItem"],"mappings":"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"}
1
+ {"version":3,"file":"updateProductsFromCart.js","sources":["/@dropins/storefront-cart/src/api/addProductsToCart/graphql/AddProductsToCartMutation.ts","/@dropins/storefront-cart/src/api/updateProductsFromCart/graphql/UpdateProductsMutation.ts","/@dropins/storefront-cart/src/api/updateProductsFromCart/updateProductsFromCart.ts"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CART_FRAGMENT } from '@/cart/api/graphql/CartFragment';\n\nexport const ADD_PRODUCTS_TO_CART_MUTATION = `\n mutation ADD_PRODUCTS_TO_CART_MUTATION(\n $cartId: String!, \n $cartItems: [CartItemInput!]!,\n $pageSize: Int! = 100,\n $currentPage: Int! = 1,\n $itemsSortInput: QuoteItemsSortInput! = {field: CREATED_AT, order: DESC}\n ) {\n addProductsToCart(\n cartId: $cartId\n cartItems: $cartItems\n ) {\n cart {\n ...CART_FRAGMENT\n }\n user_errors {\n code\n message\n }\n }\n }\n \n ${CART_FRAGMENT}\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { CART_FRAGMENT } from '@/cart/api/graphql/CartFragment';\n\nexport const UPDATE_PRODUCTS_FROM_CART_MUTATION = `\n mutation UPDATE_PRODUCTS_FROM_CART_MUTATION(\n $cartId: String!, \n $cartItems: [CartItemUpdateInput!]!,\n $pageSize: Int! = 100,\n $currentPage: Int! = 1,\n $itemsSortInput: QuoteItemsSortInput! = {field: CREATED_AT, order: DESC}\n ) {\n updateCartItems(\n input: {\n cart_id: $cartId\n cart_items: $cartItems\n }\n ) {\n cart {\n ...CART_FRAGMENT\n }\n\n }\n }\n\n ${CART_FRAGMENT}\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { state } from '@/cart/lib/state';\nimport { fetchGraphQl } from '@/cart/api';\nimport { handleFetchError } from '@/cart/lib/fetch-error';\nimport { CartModel } from '@/cart/data/models';\nimport { transformCart } from '@/cart/data/transforms';\nimport { events } from '@adobe-commerce/event-bus';\nimport { publishCartUpdateEvents } from '@/cart/lib/acdl';\nimport { getPersistedCartData } from '@/cart/lib/persisted-data';\nimport { ADD_PRODUCTS_TO_CART_MUTATION } from '../addProductsToCart/graphql/AddProductsToCartMutation';\nimport { UPDATE_PRODUCTS_FROM_CART_MUTATION } from './graphql/UpdateProductsMutation';\n\ntype UpdateProductsFromCart = Array<{\n uid: string;\n quantity: number;\n sku?: string;\n parentSku?: string;\n optionsUIDs?: string[];\n enteredOptions?: { uid: string; value: string }[];\n giftOptions?: {\n gift_wrapping_id?: string | null;\n gift_message: {\n to: string;\n from: string;\n message: string;\n };\n };\n customFields?: Record<string, any>;\n}>;\n\ntype ItemError = {\n message: string;\n path?: string[];\n extensions?: {\n category: string;\n };\n};\n\n/**\n * Collects individual item errors from cart items response\n * @param cartItems - The cart items from the response\n * @param updatedItemUIDs - Array of UIDs of items that were updated\n * @returns Array of ItemError objects\n */\nconst collectCartItemErrors = (\n cartItems: Array<{\n uid: string;\n errors?: Array<{ message: string; code: string }>;\n }>,\n updatedItemUIDs: string[]\n): ItemError[] => {\n const itemErrors: ItemError[] = [];\n\n cartItems\n .filter(\n (item) => item.errors && updatedItemUIDs.some((uid) => uid === item.uid)\n )\n .forEach((item) => {\n item.errors?.forEach((error) => {\n itemErrors.push({\n message: error.message,\n path: [item.uid],\n extensions: {\n category: error.code,\n },\n });\n });\n });\n\n return itemErrors;\n};\n\n/**\n * Creates the arrays of cart items to be sent to the graphql mutations\n *\n * @param items\n * @param currentCartItems\n * @returns {\n * itemsToAdd: Array<{\n * sku: string;\n * parentSku: string;\n * quantity: number;\n * optionsUIDs: string[];\n * enteredOptions: { uid: string; value: string }[];\n * customFields: Record<string, any>;\n * }>\n * itemsToRemove: Array<string>\n * itemsToUpdate: Array<{\n * uid: string;\n * quantity: number;\n * customFields: Record<string, any>;\n * }>\n * }\n */\nconst getCartItems = (\n items: UpdateProductsFromCart,\n currentCartItems: Array<\n CartModel['items'][number] & { customFields?: Record<string, any> }\n >\n) => {\n const itemsToAdd: Array<{\n sku?: string;\n parentSku?: string;\n quantity: number;\n optionsUIDs?: string[];\n enteredOptions?: { uid: string; value: string }[];\n customFields?: Record<string, any>;\n }> = [];\n // Items to remove from the cart will be items that have optionUIDs and\n // their optionUIDs are not the same as their matching entry in the current cart item identified by the uid\n const itemsToRemove: Array<string> = [];\n const itemsToUpdate: Array<{\n uid: string;\n quantity: number;\n giftOptions?: {\n gift_wrapping_id?: string | null;\n gift_message: {\n to: string;\n from: string;\n message: string;\n };\n };\n customFields?: Record<string, any>;\n }> = [];\n\n items.forEach((item) => {\n // Check if the item exists in the cart\n const currentItem = currentCartItems.find(\n (cartItem) => cartItem.uid === item.uid\n );\n\n if (currentItem) {\n if (item.optionsUIDs) {\n const currentItemOptions = Object.values(\n currentItem?.selectedOptionsUIDs ?? {}\n );\n\n // Check if options are exactly the same as current item\n const hasSameOptions =\n item.optionsUIDs.every((optionUID) =>\n currentItemOptions.includes(optionUID)\n ) && item.optionsUIDs.length === currentItemOptions.length;\n\n if (hasSameOptions) {\n // Same item, same options: update quantity directly\n itemsToUpdate.push({\n uid: item.uid,\n quantity: item.quantity,\n giftOptions: item.giftOptions,\n customFields: item.customFields,\n });\n } else {\n // Different options: check if there's another item in cart with these new options\n const existingItemWithNewOptions = currentCartItems.find(\n (cartItem) => {\n const cartItemOptions = Object.values(\n cartItem?.selectedOptionsUIDs ?? {}\n );\n return (\n cartItem.uid !== item.uid && // Different item\n cartItem.sku === currentItem.sku && // Same SKU\n item.optionsUIDs!.every((optionUID) =>\n cartItemOptions.includes(optionUID)\n ) &&\n item.optionsUIDs!.length === cartItemOptions.length\n );\n }\n );\n\n if (existingItemWithNewOptions) {\n // Merge: Update existing item with combined quantity and remove current item\n itemsToUpdate.push({\n uid: existingItemWithNewOptions.uid,\n quantity: existingItemWithNewOptions.quantity + item.quantity,\n giftOptions: item.giftOptions,\n customFields: item.customFields,\n });\n itemsToRemove.push(item.uid);\n } else {\n // Add new item and remove old one\n const { sku, topLevelSku: parentSku } = currentItem;\n const { optionsUIDs, enteredOptions, quantity, customFields } =\n item;\n\n itemsToAdd.push({\n sku,\n parentSku,\n quantity,\n optionsUIDs,\n enteredOptions,\n customFields,\n });\n\n itemsToRemove.push(item.uid);\n }\n }\n } else if (item.customFields) {\n const { sku, topLevelSku: parentSku } = currentItem;\n const { optionsUIDs, enteredOptions, quantity, customFields } = item;\n\n itemsToAdd.push({\n sku,\n parentSku,\n quantity,\n optionsUIDs,\n enteredOptions,\n customFields,\n });\n itemsToRemove.push(item.uid);\n } else {\n itemsToUpdate.push({\n uid: item.uid,\n quantity: item.quantity,\n giftOptions: item.giftOptions,\n customFields: item.customFields,\n });\n }\n } else {\n throw Error(\n `Invalid Cart Item UID: No matching cart entry found for ${item.uid}`\n );\n }\n });\n\n return {\n itemsToAdd,\n itemsToRemove,\n itemsToUpdate,\n };\n};\n\nconst DELETE_ITEM_QUANTITY = 0;\n\nexport const updateProductsFromCart = async (\n items: UpdateProductsFromCart\n): Promise<CartModel | null> => {\n const cartId = state.cartId;\n const cart = getPersistedCartData();\n\n if (!cartId) {\n return Promise.reject(new Error('Cart ID is not set'));\n }\n\n if (!cart) {\n return Promise.reject(new Error('Cart is not set'));\n }\n\n const { itemsToAdd, itemsToRemove, itemsToUpdate } = getCartItems(\n items,\n cart.items\n );\n\n // Array of promises to be resolved\n let results: Array<Promise<CartModel | null>> = [];\n\n // If there are items with options and matching cart items, add the products to the cart and remove the old one.\n // Note: The SKU must be the incoming parent sku and not the current cart item sku.\n if (itemsToAdd.length > 0) {\n results.push(\n fetchGraphQl(ADD_PRODUCTS_TO_CART_MUTATION, {\n variables: {\n cartId,\n cartItems: itemsToAdd.map(\n ({\n parentSku: sku,\n quantity,\n optionsUIDs: selected_options,\n enteredOptions: entered_options,\n customFields,\n }) => ({\n sku,\n quantity,\n selected_options,\n entered_options,\n ...(customFields ? customFields : {}),\n })\n ),\n },\n })\n .then(({ errors, data }) => {\n // Collect individual item errors from the response\n const updatedItemsErrors = collectCartItemErrors(\n data?.addProductsToCart?.cart?.itemsV2.items || [],\n items.map((item) => item.uid)\n );\n\n // handle errors\n const _errors = [\n ...(data?.addProductsToCart?.user_errors ?? []),\n ...(errors ?? []),\n ...updatedItemsErrors,\n ];\n\n if (_errors.length > 0) return handleFetchError(_errors);\n\n if (itemsToRemove.length > 0) {\n // remove the old item\n return updateProductQuantities(\n cartId,\n itemsToRemove.map((uid) => ({\n uid,\n quantity: DELETE_ITEM_QUANTITY, //Delete Item\n }))\n ).catch((error) => {\n return Promise.reject(\n new Error(`Failed to update products in cart: ${error}`)\n );\n });\n }\n return Promise.resolve(transformCart(data?.addProductsToCart?.cart));\n })\n .then((payload) => {\n // emit events\n events.emit('cart/updated', payload);\n events.emit('cart/data', payload);\n\n // Publish cart update events\n publishCartUpdateEvents(payload!, items, state.locale ?? 'en-US');\n\n return Promise.resolve(payload);\n })\n .catch((error) => {\n return Promise.reject(\n new Error(`Failed to add products to cart: ${error}`)\n );\n })\n );\n }\n\n if (itemsToUpdate.length > 0) {\n results.push(\n updateProductQuantities(cartId, itemsToUpdate).catch((error) => {\n return Promise.reject(new Error(error));\n })\n );\n }\n\n // Return the last promise in the results array\n return Promise.all(results).then((results) => results[results.length - 1]);\n};\n\nconst updateProductQuantities = async (\n cartId: string,\n items: UpdateProductsFromCart\n): Promise<CartModel | null> => {\n return fetchGraphQl(UPDATE_PRODUCTS_FROM_CART_MUTATION, {\n variables: {\n cartId,\n cartItems: items.map(({ uid, quantity, giftOptions }) => ({\n cart_item_uid: uid,\n quantity,\n ...giftOptions,\n })),\n },\n }).then(({ errors, data }) => {\n // Collect individual item errors from the response using the new function\n const updatedItemsErrors = collectCartItemErrors(\n data?.updateCartItems?.cart?.itemsV2.items || [],\n items.map((item) => item.uid)\n );\n\n // handle errors\n const _errors = [\n ...(data?.updateCartItems?.user_errors ?? []),\n ...(errors ?? []),\n ...updatedItemsErrors,\n ];\n\n // transform cart\n const payload =\n data?.updateCartItems && transformCart(data.updateCartItems.cart);\n\n // Emit data event\n if (payload) {\n events.emit('cart/data', payload);\n }\n\n if (_errors.length > 0) return handleFetchError(_errors);\n\n // No errors, emit updated event\n events.emit('cart/updated', payload);\n\n // emit product updated events\n if (payload) {\n const updatedItems = payload.items.filter(\n (item: CartModel['items'][number]) =>\n items.some((updateItem) => updateItem.uid === item.uid)\n );\n\n events.emit('cart/product/updated', updatedItems);\n }\n\n // data collection\n if (payload) {\n // Publish cart update events\n publishCartUpdateEvents(payload, items, state.locale ?? 'en-US');\n }\n\n return payload;\n });\n};\n"],"names":["ADD_PRODUCTS_TO_CART_MUTATION","CART_FRAGMENT","UPDATE_PRODUCTS_FROM_CART_MUTATION","collectCartItemErrors","cartItems","updatedItemUIDs","itemErrors","item","uid","_a","error","getCartItems","items","currentCartItems","itemsToAdd","itemsToRemove","itemsToUpdate","currentItem","cartItem","currentItemOptions","optionUID","existingItemWithNewOptions","cartItemOptions","sku","parentSku","optionsUIDs","enteredOptions","quantity","customFields","DELETE_ITEM_QUANTITY","updateProductsFromCart","cartId","state","cart","getPersistedCartData","results","fetchGraphQl","selected_options","entered_options","errors","data","updatedItemsErrors","_b","_errors","_c","handleFetchError","updateProductQuantities","transformCart","_d","payload","events","publishCartUpdateEvents","giftOptions","updatedItems","updateItem"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { FunctionComponent, VNode } from 'preact';
2
+ import { HTMLAttributes } from 'preact/compat';
3
+
4
+ export interface ShippingOrderSummaryLineProps extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {
5
+ loading: boolean;
6
+ price: VNode<HTMLAttributes<HTMLSpanElement>>;
7
+ priceExcludingTax?: VNode<HTMLAttributes<HTMLSpanElement>>;
8
+ priceIncludingTax?: VNode<HTMLAttributes<HTMLSpanElement>>;
9
+ taxExcluded?: boolean;
10
+ taxIncluded?: boolean;
11
+ }
12
+ export declare const ShippingOrderSummaryLine: FunctionComponent<ShippingOrderSummaryLineProps>;
13
+ //# sourceMappingURL=ShippingOrderSummaryLine.d.ts.map
@@ -0,0 +1,18 @@
1
+ /********************************************************************
2
+ * ADOBE CONFIDENTIAL
3
+ * __________________
4
+ *
5
+ * Copyright 2025 Adobe
6
+ * All Rights Reserved.
7
+ *
8
+ * NOTICE: All information contained herein is, and remains
9
+ * the property of Adobe and its suppliers, if any. The intellectual
10
+ * and technical concepts contained herein are proprietary to Adobe
11
+ * and its suppliers and are protected by all applicable intellectual
12
+ * property laws, including trade secret and copyright laws.
13
+ * Dissemination of this information or reproduction of this material
14
+ * is strictly forbidden unless prior written permission is obtained
15
+ * from Adobe.
16
+ *******************************************************************/
17
+ export * from './ShippingOrderSummaryLine';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -16,6 +16,7 @@
16
16
  *******************************************************************/
17
17
  export * from './EmptyCart';
18
18
  export * from './EstimateShipping';
19
+ export * from './ShippingOrderSummaryLine';
19
20
  export * from './MiniCart';
20
21
  export * from './CartSummaryGrid';
21
22
  export * from './CartSummaryList';
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{C as u,C as l}from"../chunks/CartSummaryGrid.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"../chunks/EmptyCart2.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/event-bus.js";import"../chunks/persisted-data.js";export{u as CartSummaryGrid,l as default};
3
+ import{C as u,C as l}from"../chunks/CartSummaryGrid.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"../chunks/EmptyCart.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/event-bus.js";import"../chunks/persisted-data.js";export{u as CartSummaryGrid,l as default};
4
4
  //# sourceMappingURL=CartSummaryGrid.js.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{C as h,C as j}from"../chunks/CartSummaryList.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import"../chunks/EmptyCart2.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import"../chunks/persisted-data.js";import"@dropins/tools/event-bus.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/createGuestCart.js";import"../chunks/refreshCart.js";import"../fragments.js";import"../chunks/updateProductsFromCart.js";import"../chunks/acdl.js";import"../chunks/Trash.js";import"../chunks/ChevronDown.js";export{h as CartSummaryList,j as default};
3
+ import{C as j,C as k}from"../chunks/CartSummaryList.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import"../chunks/EmptyCart.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import"../chunks/persisted-data.js";import"@dropins/tools/event-bus.js";import"../chunks/state.js";import"../chunks/createGuestCart.js";import"../chunks/refreshCart.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";import"../fragments.js";import"../chunks/updateProductsFromCart.js";import"../chunks/acdl.js";import"../chunks/Trash.js";import"../chunks/ChevronDown.js";export{j as CartSummaryList,k as default};
4
4
  //# sourceMappingURL=CartSummaryList.js.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{C as H,e as v,a as x,f as y,b as A,d as I,c as R,C as S,g as T}from"../chunks/CartSummaryTable2.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact-compat.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/i18n.js";import"@dropins/tools/event-bus.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/persisted-data.js";import"../chunks/updateProductsFromCart.js";import"../chunks/refreshCart.js";import"../fragments.js";import"../chunks/acdl.js";import"../chunks/createGuestCart.js";import"../chunks/EmptyCart.js";import"../chunks/EmptyCart2.js";import"../chunks/Trash.js";import"../chunks/Close.js";export{H as CartSummaryTable,v as createDismissCallback,x as createDismissHandler,y as createUndoBanner,A as createUndoBannerActions,I as createUndoCallback,R as createUndoHandler,S as default,T as getIsUndoBeingRemoved};
3
+ import{C as v,e as x,a as y,f as A,b as I,d as R,c as S,C as T,g as h}from"../chunks/CartSummaryTable2.js";import"@dropins/tools/preact-jsx-runtime.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact-compat.js";import"@dropins/tools/preact-hooks.js";import"@dropins/tools/i18n.js";import"@dropins/tools/event-bus.js";import"../chunks/state.js";import"../chunks/persisted-data.js";import"../chunks/updateProductsFromCart.js";import"../chunks/refreshCart.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";import"../fragments.js";import"../chunks/acdl.js";import"../chunks/createGuestCart.js";import"../chunks/EmptyCart2.js";import"../chunks/EmptyCart.js";import"../chunks/Trash.js";import"../chunks/Close.js";export{v as CartSummaryTable,x as createDismissCallback,y as createDismissHandler,A as createUndoBanner,I as createUndoBannerActions,R as createUndoCallback,S as createUndoHandler,T as default,h as getIsUndoBeingRemoved};
4
4
  //# sourceMappingURL=CartSummaryTable.js.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as E,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as m}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as b,Icon as x,Button as L,Input as R}from"@dropins/tools/components.js";/* empty css */import{C as P}from"../chunks/Coupons.js";import"@dropins/tools/preact-hooks.js";import"../chunks/resetCart.js";import{events as f}from"@dropins/tools/event-bus.js";import{a as S,A as h}from"../chunks/applyCouponsToCart.js";import{S as B}from"../chunks/Close.js";import{useText as $}from"@dropins/tools/i18n.js";import"../chunks/Coupon.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/persisted-data.js";import"../chunks/refreshCart.js";import"../fragments.js";const V=({children:z,...w})=>{const[d,c]=l(new Set),[i,C]=l([]),[u,p]=l(new Set),s=$({applyButton:"Cart.PriceSummary.coupon.applyAction",placeholder:"Cart.PriceSummary.coupon.placeholder",ariaLabelRemove:"Cart.PriceSummary.coupon.ariaLabelRemove"}),y=async o=>{const e=o.coupon,r=new Set(d);r.add(e),p(new Set);const n=Array.from(r);S(n,h.REPLACE).then(a=>{if(a===null)throw new Error("Error adding coupon code");c(r)}).catch(a=>{console.warn(a),p(new Set([a.message]))})},A=o=>{const e=new Set(d);e.delete(o),p(new Set);const r=Array.from(e);S(r,h.REPLACE).then(n=>{if(n===null)throw new Error("Error removing coupon code");c(e)}).catch(n=>{console.warn(n),p(new Set([n.message]))})};m(()=>{const o=f.on("cart/data",e=>{const r=e==null?void 0:e.appliedCoupons;if(!r){C([]),p(new Set);return}const n=r.map(a=>a.code);C(n),p(new Set)},{eager:!0});return()=>{o==null||o.off()}},[]),m(()=>{c(new Set(i))},[i]),m(()=>{const o=f.on("shipping/estimate",()=>{p(new Set)},{eager:!0});return()=>{o==null||o.off()}},[]);const g=i.map((o,e)=>E(b,{className:"coupon-code-form__applied-item",children:[t("span",{children:o}),t("button",{"aria-label":`${s.ariaLabelRemove} ${o}`,onClick:()=>A(o),"data-testid":`remove-coupon-${e+1}`,children:t(x,{source:B,size:"16"})})]},o)),v=u.size>0?t("div",{"data-testid":"coupon-code-error",children:Array.from(u)[0]}):void 0;return t(P,{...w,couponCodeField:t(R,{"aria-label":s.placeholder,type:"text",placeholder:s.placeholder,name:"coupon",variant:"primary",value:"","data-testid":"coupon-code-input",maxLength:50,error:u.size>0}),applyCouponsButton:t(L,{variant:"secondary",children:s.applyButton}),error:v,appliedCoupons:t("div",{children:g}),onApplyCoupon:y})};export{V as Coupons,V as default};
3
+ import{jsxs as E,jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{useState as l,useEffect as m}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as b,Icon as x,Button as L,Input as R}from"@dropins/tools/components.js";/* empty css */import{C as P}from"../chunks/Coupons.js";import"@dropins/tools/preact-hooks.js";import"../chunks/state.js";import{events as f}from"@dropins/tools/event-bus.js";import{a as S,A as h}from"../chunks/applyCouponsToCart.js";import{S as B}from"../chunks/Close.js";import{useText as $}from"@dropins/tools/i18n.js";import"../chunks/Coupon.js";import"../chunks/persisted-data.js";import"../chunks/refreshCart.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";import"../fragments.js";const W=({children:z,...w})=>{const[d,c]=l(new Set),[i,C]=l([]),[u,p]=l(new Set),s=$({applyButton:"Cart.PriceSummary.coupon.applyAction",placeholder:"Cart.PriceSummary.coupon.placeholder",ariaLabelRemove:"Cart.PriceSummary.coupon.ariaLabelRemove"}),y=async o=>{const e=o.coupon,r=new Set(d);r.add(e),p(new Set);const n=Array.from(r);S(n,h.REPLACE).then(a=>{if(a===null)throw new Error("Error adding coupon code");c(r)}).catch(a=>{console.warn(a),p(new Set([a.message]))})},A=o=>{const e=new Set(d);e.delete(o),p(new Set);const r=Array.from(e);S(r,h.REPLACE).then(n=>{if(n===null)throw new Error("Error removing coupon code");c(e)}).catch(n=>{console.warn(n),p(new Set([n.message]))})};m(()=>{const o=f.on("cart/data",e=>{const r=e==null?void 0:e.appliedCoupons;if(!r){C([]),p(new Set);return}const n=r.map(a=>a.code);C(n),p(new Set)},{eager:!0});return()=>{o==null||o.off()}},[]),m(()=>{c(new Set(i))},[i]),m(()=>{const o=f.on("shipping/estimate",()=>{p(new Set)},{eager:!0});return()=>{o==null||o.off()}},[]);const g=i.map((o,e)=>E(b,{className:"coupon-code-form__applied-item",children:[t("span",{children:o}),t("button",{"aria-label":`${s.ariaLabelRemove} ${o}`,onClick:()=>A(o),"data-testid":`remove-coupon-${e+1}`,children:t(x,{source:B,size:"16"})})]},o)),v=u.size>0?t("div",{"data-testid":"coupon-code-error",children:Array.from(u)[0]}):void 0;return t(P,{...w,couponCodeField:t(R,{"aria-label":s.placeholder,type:"text",placeholder:s.placeholder,name:"coupon",variant:"primary",value:"","data-testid":"coupon-code-input",maxLength:50,error:u.size>0}),applyCouponsButton:t(L,{variant:"secondary",children:s.applyButton}),error:v,appliedCoupons:t("div",{children:g}),onApplyCoupon:y})};export{W as Coupons,W as default};
4
4
  //# sourceMappingURL=Coupons.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Coupons.js","sources":["/@dropins/storefront-cart/src/containers/Coupons/Coupons.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { applyCouponsToCart, ApplyCouponsStrategy } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface CouponsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Coupons: Container<CouponsProps> = ({ children, ...props }) => {\n const [successfulCouponSet, setSuccessfulCouponSet] = useState(new Set());\n const [appliedCouponsArray, setAppliedCouponsArray] = useState<string[]>([]);\n const [couponError, setCouponError] = useState(new Set());\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.coupon.applyAction',\n placeholder: 'Cart.PriceSummary.coupon.placeholder',\n ariaLabelRemove: 'Cart.PriceSummary.coupon.ariaLabelRemove',\n });\n\n const handleApplyCoupon = async (value: { coupon: string }) => {\n const couponCode = value.coupon;\n\n const newSet = new Set(successfulCouponSet);\n newSet.add(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n const handleRemoveCoupon = (couponCode: string) => {\n const newSet = new Set(successfulCouponSet);\n newSet.delete(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedCoupons = payload?.appliedCoupons;\n\n if (!appliedCoupons) {\n // When appliedCoupons returns null, no coupons are applied\n setAppliedCouponsArray([]);\n // Clear error message\n setCouponError(new Set());\n return;\n }\n\n const couponCodes = appliedCoupons.map((coupon) => coupon.code);\n\n setAppliedCouponsArray(couponCodes);\n // Clear error message\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulCouponSet(new Set(appliedCouponsArray));\n }, [appliedCouponsArray]);\n\n useEffect(() => {\n const cartEvent = events.on(\n 'shipping/estimate',\n () => {\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n const appliedCoupons = appliedCouponsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveCoupon(code)}\n data-testid={`remove-coupon-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n couponError.size > 0 ? (\n <div data-testid=\"coupon-code-error\">\n {Array.from(couponError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n couponCodeField={\n <Input\n aria-label={dictionary.placeholder}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"coupon\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"coupon-code-input\"\n maxLength={50}\n error={couponError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedCoupons}</div>}\n onApplyCoupon={handleApplyCoupon}\n />\n );\n};\n"],"names":["Coupons","children","props","successfulCouponSet","setSuccessfulCouponSet","useState","appliedCouponsArray","setAppliedCouponsArray","couponError","setCouponError","dictionary","useText","handleApplyCoupon","value","couponCode","newSet","couponCodes","applyCouponsToCart","ApplyCouponsStrategy","result","error","handleRemoveCoupon","useEffect","cartEvent","events","payload","appliedCoupons","coupon","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","Input","Button"],"mappings":"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"}
1
+ {"version":3,"file":"Coupons.js","sources":["/@dropins/storefront-cart/src/containers/Coupons/Coupons.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close } from '@adobe-commerce/elsie/icons';\nimport { applyCouponsToCart, ApplyCouponsStrategy } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface CouponsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Coupons: Container<CouponsProps> = ({ children, ...props }) => {\n const [successfulCouponSet, setSuccessfulCouponSet] = useState(new Set());\n const [appliedCouponsArray, setAppliedCouponsArray] = useState<string[]>([]);\n const [couponError, setCouponError] = useState(new Set());\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.coupon.applyAction',\n placeholder: 'Cart.PriceSummary.coupon.placeholder',\n ariaLabelRemove: 'Cart.PriceSummary.coupon.ariaLabelRemove',\n });\n\n const handleApplyCoupon = async (value: { coupon: string }) => {\n const couponCode = value.coupon;\n\n const newSet = new Set(successfulCouponSet);\n newSet.add(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n const handleRemoveCoupon = (couponCode: string) => {\n const newSet = new Set(successfulCouponSet);\n newSet.delete(couponCode);\n setCouponError(new Set());\n\n const couponCodes: string[] = Array.from(newSet) as string[];\n applyCouponsToCart(couponCodes, ApplyCouponsStrategy.REPLACE)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing coupon code');\n }\n\n setSuccessfulCouponSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setCouponError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedCoupons = payload?.appliedCoupons;\n\n if (!appliedCoupons) {\n // When appliedCoupons returns null, no coupons are applied\n setAppliedCouponsArray([]);\n // Clear error message\n setCouponError(new Set());\n return;\n }\n\n const couponCodes = appliedCoupons.map((coupon) => coupon.code);\n\n setAppliedCouponsArray(couponCodes);\n // Clear error message\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulCouponSet(new Set(appliedCouponsArray));\n }, [appliedCouponsArray]);\n\n useEffect(() => {\n const cartEvent = events.on(\n 'shipping/estimate',\n () => {\n setCouponError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n const appliedCoupons = appliedCouponsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveCoupon(code)}\n data-testid={`remove-coupon-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n couponError.size > 0 ? (\n <div data-testid=\"coupon-code-error\">\n {Array.from(couponError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n couponCodeField={\n <Input\n aria-label={dictionary.placeholder}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"coupon\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"coupon-code-input\"\n maxLength={50}\n error={couponError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedCoupons}</div>}\n onApplyCoupon={handleApplyCoupon}\n />\n );\n};\n"],"names":["Coupons","children","props","successfulCouponSet","setSuccessfulCouponSet","useState","appliedCouponsArray","setAppliedCouponsArray","couponError","setCouponError","dictionary","useText","handleApplyCoupon","value","couponCode","newSet","couponCodes","applyCouponsToCart","ApplyCouponsStrategy","result","error","handleRemoveCoupon","useEffect","cartEvent","events","payload","appliedCoupons","coupon","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","Input","Button"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{E as s,E as d}from"../chunks/EmptyCart.js";import"@dropins/tools/preact-jsx-runtime.js";import"../chunks/EmptyCart2.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact-compat.js";import"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";export{s as EmptyCart,d as default};
3
+ import{E as s,E as d}from"../chunks/EmptyCart2.js";import"@dropins/tools/preact-jsx-runtime.js";import"../chunks/EmptyCart.js";import"@dropins/tools/lib.js";import"@dropins/tools/components.js";/* empty css */import"@dropins/tools/preact-compat.js";import"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";export{s as EmptyCart,d as default};
4
4
  //# sourceMappingURL=EmptyCart.js.map
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as T,jsx as e,Fragment as V}from"@dropins/tools/preact-jsx-runtime.js";import{classes as D,VComponent as B,getFormValues as $}from"@dropins/tools/lib.js";import{Button as q,Input as w,Picker as G,Price as U}from"@dropins/tools/components.js";/* empty css */import{useRef as H,useState as s,useEffect as Z,useCallback as J}from"@dropins/tools/preact-compat.js";import{useText as M,Text as k}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import{s as X}from"../chunks/resetCart.js";import{events as R}from"@dropins/tools/event-bus.js";import{s as j}from"../chunks/persisted-data.js";import{a as O,b as Q,g as W}from"../chunks/getEstimateShipping.js";import"@dropins/tools/fetch-graphql.js";const Y=({countryField:z,destinationText:f,estimateButton:I,estimated:A,loading:N,onEstimate:l,price:S,priceExcludingTax:F,priceIncludingTax:n,stateField:C,taxExcluded:y,taxIncluded:P,zipField:m})=>{const d=H(null),[L,x]=s(!0),[E,i]=s("zip"),r=M({editZipAction:"Cart.EstimateShipping.editZipAction",destinationLinkAriaLabel:"Cart.EstimateShipping.destinationLinkAriaLabel",shippingLabel:"Cart.EstimateShipping.label",zipPlaceholder:"Cart.EstimateShipping.zipPlaceholder"}),_=p=>{p.preventDefault(),x(b=>!b)},t=p=>{p.preventDefault(),x(!0),i(b=>b==="zip"?"state":"zip")},h=p=>{p.preventDefault(),x(!1);const b=$(d.current);l==null||l(b)},v=r.destinationLinkAriaLabel.replace("{destination}",f);return T("div",{"data-testid":"estimate-shipping",className:D(["cart-estimate-shipping",["cart-estimate-shipping--loading",N]]),children:[e("span",{className:"cart-estimate-shipping__label",children:A?f?T(V,{children:[e(k,{id:"Cart.EstimateShipping.estimatedDestination"})," ",e("a",{className:"cart-estimate-shippingLink",role:"button",href:"",onClick:_,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&_(p)},tabIndex:0,"aria-label":v,"data-testid":"shipping-destination-link",children:f})]}):e(k,{id:"Cart.EstimateShipping.estimated"}):e(k,{id:"Cart.EstimateShipping.label"})}),e(B,{node:S,className:"cart-estimate-shipping__price"}),A&&T(V,{children:[e("div",{className:D(["cart-estimate-shipping__caption"]),children:e("a",{href:"#",className:"cart-estimate-shipping__link",onClick:t,"data-testid":"shipping-alternate-field-link",children:E==="zip"?e(k,{id:"Cart.EstimateShipping.alternateField.state"}):e(k,{id:"Cart.EstimateShipping.alternateField.zip"})})}),T("form",{className:D(["cart-estimate-shipping--edit",["cart-estimate-shipping--hide",!L]]),ref:d,"data-testid":"shipping-estimate-form",children:[z&&e(B,{node:z,className:D(["cart-estimate-shipping--country"])}),E==="state"?C&&e(B,{node:C,className:D(["cart-estimate-shipping--state"])}):m&&e(B,{node:m,className:D(["cart-estimate-shipping--zip"])}),I&&e(B,{node:I,className:D(["cart-estimate-shipping--action"]),onClick:h,type:"submit"})]})]}),P&&e("div",{"data-testid":"shipping-tax-included",className:D(["cart-estimate-shipping__caption"]),children:T("span",{children:[n," ",e(k,{id:"Cart.EstimateShipping.withTaxes"})]})}),y?e("div",{"data-testid":"shipping-tax-included-excluded",className:D(["cart-estimate-shipping__caption"]),children:T("span",{children:[F," ",e(k,{id:"Cart.EstimateShipping.withoutTaxes"})]})}):void 0]})},ee=()=>{const[z,f]=s(!1),[I,A]=s([]),[N,l]=s("US"),[S,F]=s(""),[n,C]=s(""),[y,P]=s([]),[m,d]=s(!1),[L,x]=s(),[E,i]=s(),[r,_]=s(""),[t,h]=s(!1),v=()=>{l("US"),F(""),C(""),x(null),i(null),_(""),h(!1)},p=async u=>{const{shippingCountry:a,shippingState:o="",shippingZip:c=""}=u,K={countryCode:a,postcode:c,region:{region:o}};return f(!0),W(K).then(g=>(g&&(x({amount:g.amount.value,currency:g.amount.currency,priceIncludingtax:{amount:g.price_incl_tax.value,currency:g.price_incl_tax.currency},priceExcludingtax:{amount:g.price_excl_tax.value,currency:g.price_excl_tax.currency}}),i({carrier_code:g.carrier_code,method_code:g.method_code}),l(a),F(o),C(c),_(o||c||a),h(!0)),l(a),F(o),C(c),_(o||c||a),g)).finally(()=>{f(!1)})},b=u=>{u.preventDefault(),F(""),C("");const a=u.target.value;l(a)};return Z(()=>{O().then(u=>{let a="US";const o=u.map(c=>(c.isDefaultCountry&&(a=c.id),{text:c.label,value:c.id}));A(o),l(a)})},[]),Z(()=>{d(!0),Q(N).then(u=>{const a=u.map(o=>({text:o.name,value:o.code}));P(a)}).finally(()=>{d(!1)})},[N,d]),{loading:z,regionsLoading:m,estimatedDestinationText:r,countries:I,selectedCountry:N,selectedRegion:S,selectedZip:n,regions:y,estimatedShippingPrice:L,estimatedShippingMethod:E,shippingEstimated:t,handleEstimateShipping:p,handleCountrySelected:b,resetValues:v,setPriceSummaryLoading:f}},he=({showDefaultEstimatedShippingCost:z})=>{var _;const[f,I]=s(!1),{loading:A,countries:N,regions:l,selectedCountry:S,estimatedDestinationText:F,estimatedShippingPrice:n,handleCountrySelected:C,handleEstimateShipping:y,regionsLoading:P,selectedRegion:m,selectedZip:d,shippingEstimated:L,resetValues:x}=ee(),E=J(t=>{y(t).then(()=>{j(t)})},[y]);Z(()=>{const t=R.on("cart/data",h=>{var a,o,c;I((h==null?void 0:h.isVirtual)||!1);const v=(o=(a=h==null?void 0:h.addresses)==null?void 0:a.shipping)==null?void 0:o[0];if(z&&!v&&y({shippingCountry:((c=X.config)==null?void 0:c.defaultCountry)??""}),!v)return;const{countryCode:p,regionCode:b,zipCode:u}=v;E({shippingCountry:p,shippingState:b,shippingZip:u})},{eager:!0});return()=>{t==null||t.off()}},[]),Z(()=>{const t=R.on("cart/updated",()=>{L&&y({shippingCountry:S,shippingState:m,shippingZip:d})});return()=>{t==null||t.off()}},[L,S,m,d,y]),Z(()=>{const t=R.on("cart/reset",()=>{x(),j(null)});return()=>{t==null||t.off()}},[x]),Z(()=>{const t=R.on("cart/merged",()=>{L&&E({shippingCountry:S,shippingState:m,shippingZip:d})});return()=>{t==null||t.off()}},[L,S,m,d,E]);const i=M({applyButton:"Cart.PriceSummary.estimatedShippingForm.apply.label",countryField:"Cart.PriceSummary.estimatedShippingForm.country.placeholder",freeShipping:"Cart.PriceSummary.freeShipping",stateField:"Cart.PriceSummary.estimatedShippingForm.state.placeholder",taxToBeDetermined:"Cart.PriceSummary.taxToBeDetermined",zipField:"Cart.PriceSummary.estimatedShippingForm.zip.placeholder"});if(f)return null;const r=(_=X.config)==null?void 0:_.shoppingCartDisplaySetting;return e(Y,{loading:A,taxIncluded:(r==null?void 0:r.shipping)==="INCLUDING_TAX",taxExcluded:(r==null?void 0:r.shipping)==="INCLUDING_EXCLUDING_TAX",price:(n==null?void 0:n.amount)==0?e("span",{"data-testId":"free-shipping",children:i.freeShipping}):(r==null?void 0:r.shipping)==="INCLUDING_TAX"&&n?e(U,{"data-testid":"shipping",...n.priceIncludingtax}):n?e(U,{...n}):e("span",{children:i.taxToBeDetermined}),estimated:!0,priceExcludingTax:n!=null&&n.priceExcludingtax?e(U,{"data-testid":"shipping-excluding-tax",...n.priceExcludingtax}):e("span",{children:i.taxToBeDetermined}),countryField:e(G,{name:"shippingCountry",placeholder:i.countryField,value:S,variant:"primary",options:N,handleSelect:C,"data-testid":"estimate-shipping-country-selector"}),stateField:l.length>0?e(G,{name:"shippingState",placeholder:i.stateField,variant:"primary",options:l,value:m,"data-testid":"estimate-shipping-state-selector",disabled:P}):e(w,{"aria-label":i.stateField,name:"shippingState",placeholder:i.stateField,variant:"primary",value:m,disabled:P,"data-testid":"estimate-shipping-state-input",maxLength:50}),zipField:e(w,{"aria-label":i.zipField,name:"shippingZip",placeholder:i.zipField,variant:"primary","data-testid":"estimate-shipping-zip-input",value:d,maxLength:12}),estimateButton:e(q,{variant:"secondary","data-testid":"estimate-shipping-apply-button","aria-label":i.applyButton,children:i.applyButton}),destinationText:F||i.taxToBeDetermined,onEstimate:E})};export{he as EstimateShipping,he as default};
3
+ import{jsxs as T,jsx as e,Fragment as V}from"@dropins/tools/preact-jsx-runtime.js";import{classes as D,VComponent as B,getFormValues as $}from"@dropins/tools/lib.js";import{Button as q,Input as w,Picker as G,Price as U}from"@dropins/tools/components.js";/* empty css */import{useRef as H,useState as s,useEffect as Z,useCallback as J}from"@dropins/tools/preact-compat.js";import{useText as M,Text as k}from"@dropins/tools/i18n.js";import"@dropins/tools/preact-hooks.js";import{s as X}from"../chunks/state.js";import{events as R}from"@dropins/tools/event-bus.js";import{b as j}from"../chunks/persisted-data.js";import{a as O,b as Q,g as W}from"../chunks/getEstimateShipping.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";const Y=({countryField:z,destinationText:f,estimateButton:I,estimated:A,loading:N,onEstimate:l,price:S,priceExcludingTax:F,priceIncludingTax:n,stateField:C,taxExcluded:y,taxIncluded:P,zipField:m})=>{const d=H(null),[L,x]=s(!0),[E,i]=s("zip"),r=M({editZipAction:"Cart.EstimateShipping.editZipAction",destinationLinkAriaLabel:"Cart.EstimateShipping.destinationLinkAriaLabel",shippingLabel:"Cart.EstimateShipping.label",zipPlaceholder:"Cart.EstimateShipping.zipPlaceholder"}),_=p=>{p.preventDefault(),x(b=>!b)},t=p=>{p.preventDefault(),x(!0),i(b=>b==="zip"?"state":"zip")},h=p=>{p.preventDefault(),x(!1);const b=$(d.current);l==null||l(b)},v=r.destinationLinkAriaLabel.replace("{destination}",f);return T("div",{"data-testid":"estimate-shipping",className:D(["cart-estimate-shipping",["cart-estimate-shipping--loading",N]]),children:[e("span",{className:"cart-estimate-shipping__label",children:A?f?T(V,{children:[e(k,{id:"Cart.EstimateShipping.estimatedDestination"})," ",e("a",{className:"cart-estimate-shippingLink",role:"button",href:"",onClick:_,onKeyDown:p=>{(p.key==="Enter"||p.key===" ")&&_(p)},tabIndex:0,"aria-label":v,"data-testid":"shipping-destination-link",children:f})]}):e(k,{id:"Cart.EstimateShipping.estimated"}):e(k,{id:"Cart.EstimateShipping.label"})}),e(B,{node:S,className:"cart-estimate-shipping__price"}),A&&T(V,{children:[e("div",{className:D(["cart-estimate-shipping__caption"]),children:e("a",{href:"#",className:"cart-estimate-shipping__link",onClick:t,"data-testid":"shipping-alternate-field-link",children:E==="zip"?e(k,{id:"Cart.EstimateShipping.alternateField.state"}):e(k,{id:"Cart.EstimateShipping.alternateField.zip"})})}),T("form",{className:D(["cart-estimate-shipping--edit",["cart-estimate-shipping--hide",!L]]),ref:d,"data-testid":"shipping-estimate-form",children:[z&&e(B,{node:z,className:D(["cart-estimate-shipping--country"])}),E==="state"?C&&e(B,{node:C,className:D(["cart-estimate-shipping--state"])}):m&&e(B,{node:m,className:D(["cart-estimate-shipping--zip"])}),I&&e(B,{node:I,className:D(["cart-estimate-shipping--action"]),onClick:h,type:"submit"})]})]}),P&&e("div",{"data-testid":"shipping-tax-included",className:D(["cart-estimate-shipping__caption"]),children:T("span",{children:[n," ",e(k,{id:"Cart.EstimateShipping.withTaxes"})]})}),y?e("div",{"data-testid":"shipping-tax-included-excluded",className:D(["cart-estimate-shipping__caption"]),children:T("span",{children:[F," ",e(k,{id:"Cart.EstimateShipping.withoutTaxes"})]})}):void 0]})},ee=()=>{const[z,f]=s(!1),[I,A]=s([]),[N,l]=s("US"),[S,F]=s(""),[n,C]=s(""),[y,P]=s([]),[m,d]=s(!1),[L,x]=s(),[E,i]=s(),[r,_]=s(""),[t,h]=s(!1),v=()=>{l("US"),F(""),C(""),x(null),i(null),_(""),h(!1)},p=async u=>{const{shippingCountry:a,shippingState:o="",shippingZip:c=""}=u,K={countryCode:a,postcode:c,region:{region:o}};return f(!0),W(K).then(g=>(g&&(x({amount:g.amount.value,currency:g.amount.currency,priceIncludingtax:{amount:g.price_incl_tax.value,currency:g.price_incl_tax.currency},priceExcludingtax:{amount:g.price_excl_tax.value,currency:g.price_excl_tax.currency}}),i({carrier_code:g.carrier_code,method_code:g.method_code}),l(a),F(o),C(c),_(o||c||a),h(!0)),l(a),F(o),C(c),_(o||c||a),g)).finally(()=>{f(!1)})},b=u=>{u.preventDefault(),F(""),C("");const a=u.target.value;l(a)};return Z(()=>{O().then(u=>{let a="US";const o=u.map(c=>(c.isDefaultCountry&&(a=c.id),{text:c.label,value:c.id}));A(o),l(a)})},[]),Z(()=>{d(!0),Q(N).then(u=>{const a=u.map(o=>({text:o.name,value:o.code}));P(a)}).finally(()=>{d(!1)})},[N,d]),{loading:z,regionsLoading:m,estimatedDestinationText:r,countries:I,selectedCountry:N,selectedRegion:S,selectedZip:n,regions:y,estimatedShippingPrice:L,estimatedShippingMethod:E,shippingEstimated:t,handleEstimateShipping:p,handleCountrySelected:b,resetValues:v,setPriceSummaryLoading:f}},ue=({showDefaultEstimatedShippingCost:z})=>{var _;const[f,I]=s(!1),{loading:A,countries:N,regions:l,selectedCountry:S,estimatedDestinationText:F,estimatedShippingPrice:n,handleCountrySelected:C,handleEstimateShipping:y,regionsLoading:P,selectedRegion:m,selectedZip:d,shippingEstimated:L,resetValues:x}=ee(),E=J(t=>{y(t).then(()=>{j(t)})},[y]);Z(()=>{const t=R.on("cart/data",h=>{var a,o,c;I((h==null?void 0:h.isVirtual)||!1);const v=(o=(a=h==null?void 0:h.addresses)==null?void 0:a.shipping)==null?void 0:o[0];if(z&&!v&&y({shippingCountry:((c=X.config)==null?void 0:c.defaultCountry)??""}),!v)return;const{countryCode:p,regionCode:b,zipCode:u}=v;E({shippingCountry:p,shippingState:b,shippingZip:u})},{eager:!0});return()=>{t==null||t.off()}},[]),Z(()=>{const t=R.on("cart/updated",()=>{L&&y({shippingCountry:S,shippingState:m,shippingZip:d})});return()=>{t==null||t.off()}},[L,S,m,d,y]),Z(()=>{const t=R.on("cart/reset",()=>{x(),j(null)});return()=>{t==null||t.off()}},[x]),Z(()=>{const t=R.on("cart/merged",()=>{L&&E({shippingCountry:S,shippingState:m,shippingZip:d})});return()=>{t==null||t.off()}},[L,S,m,d,E]);const i=M({applyButton:"Cart.PriceSummary.estimatedShippingForm.apply.label",countryField:"Cart.PriceSummary.estimatedShippingForm.country.placeholder",freeShipping:"Cart.PriceSummary.freeShipping",stateField:"Cart.PriceSummary.estimatedShippingForm.state.placeholder",taxToBeDetermined:"Cart.PriceSummary.taxToBeDetermined",zipField:"Cart.PriceSummary.estimatedShippingForm.zip.placeholder"});if(f)return null;const r=(_=X.config)==null?void 0:_.shoppingCartDisplaySetting;return e(Y,{loading:A,taxIncluded:(r==null?void 0:r.shipping)==="INCLUDING_TAX",taxExcluded:(r==null?void 0:r.shipping)==="INCLUDING_EXCLUDING_TAX",price:(n==null?void 0:n.amount)==0?e("span",{"data-testId":"free-shipping",children:i.freeShipping}):(r==null?void 0:r.shipping)==="INCLUDING_TAX"&&n?e(U,{"data-testid":"shipping",...n.priceIncludingtax}):n?e(U,{...n}):e("span",{children:i.taxToBeDetermined}),estimated:!0,priceExcludingTax:n!=null&&n.priceExcludingtax?e(U,{"data-testid":"shipping-excluding-tax",...n.priceExcludingtax}):e("span",{children:i.taxToBeDetermined}),countryField:e(G,{name:"shippingCountry",placeholder:i.countryField,value:S,variant:"primary",options:N,handleSelect:C,"data-testid":"estimate-shipping-country-selector"}),stateField:l.length>0?e(G,{name:"shippingState",placeholder:i.stateField,variant:"primary",options:l,value:m,"data-testid":"estimate-shipping-state-selector",disabled:P}):e(w,{"aria-label":i.stateField,name:"shippingState",placeholder:i.stateField,variant:"primary",value:m,disabled:P,"data-testid":"estimate-shipping-state-input",maxLength:50}),zipField:e(w,{"aria-label":i.zipField,name:"shippingZip",placeholder:i.zipField,variant:"primary","data-testid":"estimate-shipping-zip-input",value:d,maxLength:12}),estimateButton:e(q,{variant:"secondary","data-testid":"estimate-shipping-apply-button","aria-label":i.applyButton,children:i.applyButton}),destinationText:F||i.taxToBeDetermined,onEstimate:E})};export{ue as EstimateShipping,ue as default};
4
4
  //# sourceMappingURL=EstimateShipping.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EstimateShipping.js","sources":["/@dropins/storefront-cart/src/components/EstimateShipping/EstimateShipping.tsx","/@dropins/storefront-cart/src/hooks/useEstimatedShipping.ts","/@dropins/storefront-cart/src/containers/EstimateShipping/EstimateShipping.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { VComponent, classes, getFormValues } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useRef, useState } from 'preact/compat';\n\nimport '@/cart/components/EstimateShipping/EstimateShipping.css';\n\nexport interface EstimateShippingProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n countryField?: VNode<HTMLAttributes<HTMLInputElement>>;\n destinationText?: string;\n estimateButton?: VNode<HTMLAttributes<HTMLButtonElement>>;\n estimated?: boolean;\n loading: boolean;\n onEstimate?: (formData: any) => void;\n price: VNode<HTMLAttributes<HTMLSpanElement>>;\n priceExcludingTax?: VNode<HTMLAttributes<HTMLSpanElement>>;\n priceIncludingTax?: VNode<HTMLAttributes<HTMLSpanElement>>;\n stateField?: VNode<HTMLAttributes<HTMLInputElement>>;\n taxExcluded?: boolean;\n taxIncluded?: boolean;\n zipField?: VNode<HTMLAttributes<HTMLInputElement>>;\n}\n\nexport const EstimateShipping: FunctionComponent<EstimateShippingProps> = ({\n countryField,\n destinationText,\n estimateButton,\n estimated,\n loading,\n onEstimate,\n price,\n priceExcludingTax,\n priceIncludingTax,\n stateField,\n taxExcluded,\n taxIncluded,\n zipField,\n}) => {\n const estimateFormRef = useRef<HTMLFormElement>(null);\n const [showEstimateForm, setShowEstimateForm] = useState(true);\n const [estimateField, setEstimateField] = useState<'zip' | 'state'>('zip');\n\n const dictionary = useText({\n editZipAction: 'Cart.EstimateShipping.editZipAction',\n destinationLinkAriaLabel: 'Cart.EstimateShipping.destinationLinkAriaLabel',\n shippingLabel: 'Cart.EstimateShipping.label',\n zipPlaceholder: 'Cart.EstimateShipping.zipPlaceholder',\n });\n\n const onDestinationLinkClick = (e: Event) => {\n e.preventDefault();\n setShowEstimateForm((show) => !show);\n };\n\n const onAlternateFieldClick = (e: Event) => {\n e.preventDefault();\n setShowEstimateForm(true);\n setEstimateField((field) => (field === 'zip' ? 'state' : 'zip'));\n };\n\n const onSubmitEstimate = (e: Event) => {\n e.preventDefault();\n setShowEstimateForm(false);\n\n const formData = getFormValues(estimateFormRef.current!);\n\n onEstimate?.(formData);\n };\n\n const destinationAriaLabel = dictionary.destinationLinkAriaLabel.replace('{destination}', destinationText);\n\n return ( \n <div\n data-testid=\"estimate-shipping\"\n className={classes([\n 'cart-estimate-shipping',\n ['cart-estimate-shipping--loading', loading],\n ])}\n >\n <span className={'cart-estimate-shipping__label'}>\n {estimated ? (\n destinationText ? (\n <>\n <Text id=\"Cart.EstimateShipping.estimatedDestination\" />\n &nbsp;\n <a\n className={'cart-estimate-shippingLink'}\n role=\"button\"\n href=\"\"\n onClick={onDestinationLinkClick}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n onDestinationLinkClick(event);\n }\n }}\n tabIndex={0}\n aria-label={destinationAriaLabel}\n data-testid=\"shipping-destination-link\"\n >\n {destinationText}\n </a>\n </>\n ) : (\n <Text id=\"Cart.EstimateShipping.estimated\" />\n )\n ) : (\n <Text id=\"Cart.EstimateShipping.label\" />\n )}\n </span>\n\n <VComponent node={price} className={'cart-estimate-shipping__price'} />\n\n {/* Edit estimate form */}\n {estimated && (\n <>\n <div className={classes(['cart-estimate-shipping__caption'])}>\n <a\n href=\"#\"\n className={'cart-estimate-shipping__link'}\n onClick={onAlternateFieldClick}\n data-testid=\"shipping-alternate-field-link\"\n >\n {estimateField === 'zip' ? (\n <Text id=\"Cart.EstimateShipping.alternateField.state\" />\n ) : (\n <Text id=\"Cart.EstimateShipping.alternateField.zip\" />\n )}\n </a>\n </div>\n\n <form\n className={classes([\n 'cart-estimate-shipping--edit',\n ['cart-estimate-shipping--hide', !showEstimateForm],\n ])}\n ref={estimateFormRef}\n data-testid=\"shipping-estimate-form\"\n >\n {countryField && (\n <VComponent\n node={countryField}\n className={classes(['cart-estimate-shipping--country'])}\n />\n )}\n {estimateField === 'state'\n ? stateField && (\n <VComponent\n node={stateField}\n className={classes(['cart-estimate-shipping--state'])}\n />\n )\n : zipField && (\n <VComponent\n node={zipField}\n className={classes(['cart-estimate-shipping--zip'])}\n />\n )}\n {estimateButton && (\n <VComponent\n node={estimateButton}\n className={classes(['cart-estimate-shipping--action'])}\n onClick={onSubmitEstimate}\n type=\"submit\"\n />\n )}\n </form>\n </>\n )}\n\n {taxIncluded && (\n <div\n data-testid=\"shipping-tax-included\"\n className={classes(['cart-estimate-shipping__caption'])}\n >\n <span>\n {priceIncludingTax} <Text id=\"Cart.EstimateShipping.withTaxes\" />\n </span>\n </div>\n )}\n\n {taxExcluded ? (\n <div\n data-testid=\"shipping-tax-included-excluded\"\n className={classes(['cart-estimate-shipping__caption'])}\n >\n <span>\n {priceExcludingTax} <Text id=\"Cart.EstimateShipping.withoutTaxes\" />\n </span>\n </div>\n ) : undefined}\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 { useEffect, useState } from 'preact/compat';\n\nimport {\n EstimateAddressInput,\n getCountries,\n getEstimateShipping,\n getRegions,\n} from '@/cart/api';\nimport { PriceProps } from '@adobe-commerce/elsie/components';\n\nexport const useEstimatedShipping = () => {\n const [priceSummaryLoading, setPriceSummaryLoading] =\n useState<boolean>(false);\n\n /* State data related to estimating costs in the Price Summary component */\n const [countries, setCountries] = useState<{ text: string; value: string }[]>(\n []\n );\n const [selectedCountry, setSelectedCountry] = useState<string>('US');\n const [selectedRegion, setSelectedRegion] = useState<string>('');\n const [selectedZip, setSelectedZip] = useState<string>('');\n const [regions, setRegions] = useState<{ text: string; value: string }[]>([]);\n const [regionsLoading, setRegionsLoading] = useState<boolean>(false);\n const [estimatedShippingPrice, setEstimatedShippingPrice] = useState<\n PriceProps | null | any\n >();\n const [estimatedShippingMethod, setEstimatedShippingMethod] = useState<any>();\n const [estimatedDestinationText, setEstimatedDestinationText] =\n useState<string>('');\n const [shippingEstimated, setShippingEstimated] = useState<boolean>(false);\n\n const resetValues = () => {\n setSelectedCountry('US');\n setSelectedRegion('');\n setSelectedZip('');\n setEstimatedShippingPrice(null);\n setEstimatedShippingMethod(null);\n setEstimatedDestinationText('');\n setShippingEstimated(false);\n };\n\n const handleEstimateShipping = async (formValues: {\n shippingCountry: string;\n shippingState?: string;\n shippingZip?: string;\n }) => {\n const {\n shippingCountry,\n shippingState = '',\n shippingZip = '',\n } = formValues;\n\n const addressData: EstimateAddressInput = {\n countryCode: shippingCountry,\n postcode: shippingZip,\n region: {\n region: shippingState,\n },\n };\n\n setPriceSummaryLoading(true);\n\n return getEstimateShipping(addressData)\n .then((data) => {\n if (data) {\n setEstimatedShippingPrice({\n amount: data.amount.value,\n currency: data.amount.currency,\n priceIncludingtax: {\n amount: data.price_incl_tax.value,\n currency: data.price_incl_tax.currency,\n },\n priceExcludingtax: {\n amount: data.price_excl_tax.value,\n currency: data.price_excl_tax.currency,\n },\n });\n setEstimatedShippingMethod({\n carrier_code: data.carrier_code,\n method_code: data.method_code,\n });\n\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n\n setShippingEstimated(true);\n }\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n return data;\n })\n .finally(() => {\n setPriceSummaryLoading(false);\n });\n };\n\n const handleCountrySelected = (event: Event) => {\n event.preventDefault();\n\n setSelectedRegion('');\n setSelectedZip('');\n\n const value = (event.target as HTMLSelectElement).value;\n setSelectedCountry(value);\n };\n\n // Get list of countries on initial load\n useEffect(() => {\n getCountries().then((countries) => {\n let defaultCountry = 'US';\n const transformedCountries = countries.map((country) => {\n if (country.isDefaultCountry) {\n defaultCountry = country.id;\n }\n return {\n text: country.label,\n value: country.id,\n };\n });\n setCountries(transformedCountries);\n setSelectedCountry(defaultCountry);\n });\n }, []);\n\n // Update regions when country is updated\n useEffect(() => {\n setRegionsLoading(true);\n getRegions(selectedCountry)\n .then((regions) => {\n const transformedRegions = regions.map((region) => {\n return {\n text: region.name,\n value: region.code,\n };\n });\n setRegions(transformedRegions);\n })\n .finally(() => {\n setRegionsLoading(false);\n });\n }, [selectedCountry, setRegionsLoading]);\n\n return {\n loading: priceSummaryLoading,\n regionsLoading,\n estimatedDestinationText,\n countries,\n selectedCountry,\n selectedRegion,\n selectedZip,\n regions,\n estimatedShippingPrice,\n estimatedShippingMethod,\n shippingEstimated,\n handleEstimateShipping,\n handleCountrySelected,\n resetValues,\n setPriceSummaryLoading,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { EstimateShipping as EstimateShippingComponent } from '@/cart/components';\nimport { useEstimatedShipping } from '@/cart/hooks';\nimport { setEstimatedShippingLocation } from '@/cart/lib/persisted-data';\nimport { state } from '@/cart/lib/state';\nimport { Button, Input, Picker, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\n\nexport interface EstimateShippingProps extends HTMLAttributes<HTMLDivElement> {\n showDefaultEstimatedShippingCost: boolean;\n}\n\nexport const EstimateShipping: Container<EstimateShippingProps> = ({\n showDefaultEstimatedShippingCost,\n}) => {\n const [isVirtual, setIsVirtual] = useState(false);\n\n const {\n loading,\n countries,\n regions,\n selectedCountry,\n estimatedDestinationText,\n estimatedShippingPrice,\n handleCountrySelected,\n handleEstimateShipping,\n regionsLoading,\n selectedRegion,\n selectedZip,\n shippingEstimated,\n resetValues,\n } = useEstimatedShipping();\n const handleEstimations = useCallback(\n (formValues: any) => {\n handleEstimateShipping(formValues).then(() => {\n setEstimatedShippingLocation(formValues);\n });\n },\n [handleEstimateShipping]\n );\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n setIsVirtual(payload?.isVirtual || false);\n\n const shippingAddress = payload?.addresses?.shipping?.[0];\n\n if (showDefaultEstimatedShippingCost && !shippingAddress) {\n handleEstimateShipping({\n shippingCountry: state.config?.defaultCountry ?? '',\n });\n }\n if (!shippingAddress) return;\n const { countryCode, regionCode, zipCode } = shippingAddress;\n\n handleEstimations({\n shippingCountry: countryCode,\n shippingState: regionCode,\n shippingZip: zipCode,\n });\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const updatedEvent = events.on('cart/updated', () => {\n if (!shippingEstimated) return;\n handleEstimateShipping({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n updatedEvent?.off();\n };\n }, [shippingEstimated, selectedCountry, selectedRegion, selectedZip, handleEstimateShipping]);\n\n useEffect(() => {\n const resetEvent = events.on('cart/reset', () => {\n resetValues();\n setEstimatedShippingLocation(null);\n });\n\n return () => {\n resetEvent?.off();\n };\n }, [resetValues]);\n\n useEffect(() => {\n const mergeEvent = events.on('cart/merged', () => {\n if (!shippingEstimated) return;\n\n handleEstimations({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n mergeEvent?.off();\n };\n }, [\n shippingEstimated,\n selectedCountry,\n selectedRegion,\n selectedZip,\n handleEstimations,\n ]);\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.estimatedShippingForm.apply.label',\n countryField: 'Cart.PriceSummary.estimatedShippingForm.country.placeholder',\n freeShipping: 'Cart.PriceSummary.freeShipping',\n stateField: 'Cart.PriceSummary.estimatedShippingForm.state.placeholder',\n taxToBeDetermined: 'Cart.PriceSummary.taxToBeDetermined',\n zipField: 'Cart.PriceSummary.estimatedShippingForm.zip.placeholder',\n });\n\n if (isVirtual) return null;\n\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n return (\n <EstimateShippingComponent\n loading={loading}\n taxIncluded={cartTaxesConfig?.shipping === 'INCLUDING_TAX'}\n taxExcluded={cartTaxesConfig?.shipping === 'INCLUDING_EXCLUDING_TAX'}\n price={\n estimatedShippingPrice?.amount == 0 ? (\n <span data-testId=\"free-shipping\">{dictionary.freeShipping}</span>\n ) : cartTaxesConfig?.shipping === 'INCLUDING_TAX' &&\n estimatedShippingPrice ? (\n <Price\n data-testid=\"shipping\"\n {...estimatedShippingPrice.priceIncludingtax}\n />\n ) : estimatedShippingPrice ? (\n <Price {...estimatedShippingPrice} />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n estimated={true}\n priceExcludingTax={\n estimatedShippingPrice?.priceExcludingtax ? (\n <Price\n data-testid=\"shipping-excluding-tax\"\n {...estimatedShippingPrice.priceExcludingtax}\n />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n countryField={\n <Picker\n name=\"shippingCountry\"\n placeholder={dictionary.countryField}\n value={selectedCountry}\n variant=\"primary\"\n options={countries}\n handleSelect={handleCountrySelected}\n data-testid=\"estimate-shipping-country-selector\"\n />\n }\n stateField={\n regions.length > 0 ? (\n <Picker\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n options={regions}\n value={selectedRegion}\n data-testid=\"estimate-shipping-state-selector\"\n disabled={regionsLoading}\n />\n ) : (\n <Input\n aria-label={dictionary.stateField}\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n value={selectedRegion}\n disabled={regionsLoading}\n data-testid=\"estimate-shipping-state-input\"\n maxLength={50}\n />\n )\n }\n zipField={\n <Input\n aria-label={dictionary.zipField}\n name=\"shippingZip\"\n placeholder={dictionary.zipField}\n variant=\"primary\"\n data-testid=\"estimate-shipping-zip-input\"\n value={selectedZip}\n maxLength={12}\n />\n }\n estimateButton={\n <Button\n variant=\"secondary\"\n data-testid=\"estimate-shipping-apply-button\"\n aria-label={dictionary.applyButton}\n >\n {dictionary.applyButton}\n </Button>\n }\n destinationText={estimatedDestinationText || dictionary.taxToBeDetermined}\n onEstimate={handleEstimations}\n />\n );\n};\n"],"names":["EstimateShipping","countryField","destinationText","estimateButton","estimated","loading","onEstimate","price","priceExcludingTax","priceIncludingTax","stateField","taxExcluded","taxIncluded","zipField","estimateFormRef","useRef","showEstimateForm","setShowEstimateForm","useState","estimateField","setEstimateField","dictionary","useText","onDestinationLinkClick","e","show","onAlternateFieldClick","field","onSubmitEstimate","formData","getFormValues","destinationAriaLabel","jsxs","classes","jsx","Fragment","Text","event","VComponent","useEstimatedShipping","priceSummaryLoading","setPriceSummaryLoading","countries","setCountries","selectedCountry","setSelectedCountry","selectedRegion","setSelectedRegion","selectedZip","setSelectedZip","regions","setRegions","regionsLoading","setRegionsLoading","estimatedShippingPrice","setEstimatedShippingPrice","estimatedShippingMethod","setEstimatedShippingMethod","estimatedDestinationText","setEstimatedDestinationText","shippingEstimated","setShippingEstimated","resetValues","handleEstimateShipping","formValues","shippingCountry","shippingState","shippingZip","addressData","getEstimateShipping","data","handleCountrySelected","value","useEffect","getCountries","defaultCountry","transformedCountries","country","getRegions","transformedRegions","region","showDefaultEstimatedShippingCost","isVirtual","setIsVirtual","handleEstimations","useCallback","setEstimatedShippingLocation","cartEvent","events","payload","shippingAddress","_b","_a","_c","state","countryCode","regionCode","zipCode","updatedEvent","resetEvent","mergeEvent","cartTaxesConfig","EstimateShippingComponent","Price","Picker","Input","Button"],"mappings":"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"}
1
+ {"version":3,"file":"EstimateShipping.js","sources":["/@dropins/storefront-cart/src/components/EstimateShipping/EstimateShipping.tsx","/@dropins/storefront-cart/src/hooks/useEstimatedShipping.ts","/@dropins/storefront-cart/src/containers/EstimateShipping/EstimateShipping.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { Text, useText } from '@adobe-commerce/elsie/i18n';\nimport { VComponent, classes, getFormValues } from '@adobe-commerce/elsie/lib';\nimport { FunctionComponent, VNode } from 'preact';\nimport { HTMLAttributes, useRef, useState } from 'preact/compat';\n\nimport '@/cart/components/EstimateShipping/EstimateShipping.css';\n\nexport interface EstimateShippingProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'loading'> {\n countryField?: VNode<HTMLAttributes<HTMLInputElement>>;\n destinationText?: string;\n estimateButton?: VNode<HTMLAttributes<HTMLButtonElement>>;\n estimated?: boolean;\n loading: boolean;\n onEstimate?: (formData: any) => void;\n price: VNode<HTMLAttributes<HTMLSpanElement>>;\n priceExcludingTax?: VNode<HTMLAttributes<HTMLSpanElement>>;\n priceIncludingTax?: VNode<HTMLAttributes<HTMLSpanElement>>;\n stateField?: VNode<HTMLAttributes<HTMLInputElement>>;\n taxExcluded?: boolean;\n taxIncluded?: boolean;\n zipField?: VNode<HTMLAttributes<HTMLInputElement>>;\n}\n\nexport const EstimateShipping: FunctionComponent<EstimateShippingProps> = ({\n countryField,\n destinationText,\n estimateButton,\n estimated,\n loading,\n onEstimate,\n price,\n priceExcludingTax,\n priceIncludingTax,\n stateField,\n taxExcluded,\n taxIncluded,\n zipField,\n}) => {\n const estimateFormRef = useRef<HTMLFormElement>(null);\n const [showEstimateForm, setShowEstimateForm] = useState(true);\n const [estimateField, setEstimateField] = useState<'zip' | 'state'>('zip');\n\n const dictionary = useText({\n editZipAction: 'Cart.EstimateShipping.editZipAction',\n destinationLinkAriaLabel: 'Cart.EstimateShipping.destinationLinkAriaLabel',\n shippingLabel: 'Cart.EstimateShipping.label',\n zipPlaceholder: 'Cart.EstimateShipping.zipPlaceholder',\n });\n\n const onDestinationLinkClick = (e: Event) => {\n e.preventDefault();\n setShowEstimateForm((show) => !show);\n };\n\n const onAlternateFieldClick = (e: Event) => {\n e.preventDefault();\n setShowEstimateForm(true);\n setEstimateField((field) => (field === 'zip' ? 'state' : 'zip'));\n };\n\n const onSubmitEstimate = (e: Event) => {\n e.preventDefault();\n setShowEstimateForm(false);\n\n const formData = getFormValues(estimateFormRef.current!);\n\n onEstimate?.(formData);\n };\n\n const destinationAriaLabel = dictionary.destinationLinkAriaLabel.replace('{destination}', destinationText);\n\n return ( \n <div\n data-testid=\"estimate-shipping\"\n className={classes([\n 'cart-estimate-shipping',\n ['cart-estimate-shipping--loading', loading],\n ])}\n >\n <span className={'cart-estimate-shipping__label'}>\n {estimated ? (\n destinationText ? (\n <>\n <Text id=\"Cart.EstimateShipping.estimatedDestination\" />\n &nbsp;\n <a\n className={'cart-estimate-shippingLink'}\n role=\"button\"\n href=\"\"\n onClick={onDestinationLinkClick}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n onDestinationLinkClick(event);\n }\n }}\n tabIndex={0}\n aria-label={destinationAriaLabel}\n data-testid=\"shipping-destination-link\"\n >\n {destinationText}\n </a>\n </>\n ) : (\n <Text id=\"Cart.EstimateShipping.estimated\" />\n )\n ) : (\n <Text id=\"Cart.EstimateShipping.label\" />\n )}\n </span>\n\n <VComponent node={price} className={'cart-estimate-shipping__price'} />\n\n {/* Edit estimate form */}\n {estimated && (\n <>\n <div className={classes(['cart-estimate-shipping__caption'])}>\n <a\n href=\"#\"\n className={'cart-estimate-shipping__link'}\n onClick={onAlternateFieldClick}\n data-testid=\"shipping-alternate-field-link\"\n >\n {estimateField === 'zip' ? (\n <Text id=\"Cart.EstimateShipping.alternateField.state\" />\n ) : (\n <Text id=\"Cart.EstimateShipping.alternateField.zip\" />\n )}\n </a>\n </div>\n\n <form\n className={classes([\n 'cart-estimate-shipping--edit',\n ['cart-estimate-shipping--hide', !showEstimateForm],\n ])}\n ref={estimateFormRef}\n data-testid=\"shipping-estimate-form\"\n >\n {countryField && (\n <VComponent\n node={countryField}\n className={classes(['cart-estimate-shipping--country'])}\n />\n )}\n {estimateField === 'state'\n ? stateField && (\n <VComponent\n node={stateField}\n className={classes(['cart-estimate-shipping--state'])}\n />\n )\n : zipField && (\n <VComponent\n node={zipField}\n className={classes(['cart-estimate-shipping--zip'])}\n />\n )}\n {estimateButton && (\n <VComponent\n node={estimateButton}\n className={classes(['cart-estimate-shipping--action'])}\n onClick={onSubmitEstimate}\n type=\"submit\"\n />\n )}\n </form>\n </>\n )}\n\n {taxIncluded && (\n <div\n data-testid=\"shipping-tax-included\"\n className={classes(['cart-estimate-shipping__caption'])}\n >\n <span>\n {priceIncludingTax} <Text id=\"Cart.EstimateShipping.withTaxes\" />\n </span>\n </div>\n )}\n\n {taxExcluded ? (\n <div\n data-testid=\"shipping-tax-included-excluded\"\n className={classes(['cart-estimate-shipping__caption'])}\n >\n <span>\n {priceExcludingTax} <Text id=\"Cart.EstimateShipping.withoutTaxes\" />\n </span>\n </div>\n ) : undefined}\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 { useEffect, useState } from 'preact/compat';\n\nimport {\n EstimateAddressInput,\n getCountries,\n getEstimateShipping,\n getRegions,\n} from '@/cart/api';\nimport { PriceProps } from '@adobe-commerce/elsie/components';\n\nexport const useEstimatedShipping = () => {\n const [priceSummaryLoading, setPriceSummaryLoading] =\n useState<boolean>(false);\n\n /* State data related to estimating costs in the Price Summary component */\n const [countries, setCountries] = useState<{ text: string; value: string }[]>(\n []\n );\n const [selectedCountry, setSelectedCountry] = useState<string>('US');\n const [selectedRegion, setSelectedRegion] = useState<string>('');\n const [selectedZip, setSelectedZip] = useState<string>('');\n const [regions, setRegions] = useState<{ text: string; value: string }[]>([]);\n const [regionsLoading, setRegionsLoading] = useState<boolean>(false);\n const [estimatedShippingPrice, setEstimatedShippingPrice] = useState<\n PriceProps | null | any\n >();\n const [estimatedShippingMethod, setEstimatedShippingMethod] = useState<any>();\n const [estimatedDestinationText, setEstimatedDestinationText] =\n useState<string>('');\n const [shippingEstimated, setShippingEstimated] = useState<boolean>(false);\n\n const resetValues = () => {\n setSelectedCountry('US');\n setSelectedRegion('');\n setSelectedZip('');\n setEstimatedShippingPrice(null);\n setEstimatedShippingMethod(null);\n setEstimatedDestinationText('');\n setShippingEstimated(false);\n };\n\n const handleEstimateShipping = async (formValues: {\n shippingCountry: string;\n shippingState?: string;\n shippingZip?: string;\n }) => {\n const {\n shippingCountry,\n shippingState = '',\n shippingZip = '',\n } = formValues;\n\n const addressData: EstimateAddressInput = {\n countryCode: shippingCountry,\n postcode: shippingZip,\n region: {\n region: shippingState,\n },\n };\n\n setPriceSummaryLoading(true);\n\n return getEstimateShipping(addressData)\n .then((data) => {\n if (data) {\n setEstimatedShippingPrice({\n amount: data.amount.value,\n currency: data.amount.currency,\n priceIncludingtax: {\n amount: data.price_incl_tax.value,\n currency: data.price_incl_tax.currency,\n },\n priceExcludingtax: {\n amount: data.price_excl_tax.value,\n currency: data.price_excl_tax.currency,\n },\n });\n setEstimatedShippingMethod({\n carrier_code: data.carrier_code,\n method_code: data.method_code,\n });\n\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n\n setShippingEstimated(true);\n }\n setSelectedCountry(shippingCountry);\n setSelectedRegion(shippingState);\n setSelectedZip(shippingZip);\n\n setEstimatedDestinationText(\n shippingState || shippingZip || shippingCountry\n );\n return data;\n })\n .finally(() => {\n setPriceSummaryLoading(false);\n });\n };\n\n const handleCountrySelected = (event: Event) => {\n event.preventDefault();\n\n setSelectedRegion('');\n setSelectedZip('');\n\n const value = (event.target as HTMLSelectElement).value;\n setSelectedCountry(value);\n };\n\n // Get list of countries on initial load\n useEffect(() => {\n getCountries().then((countries) => {\n let defaultCountry = 'US';\n const transformedCountries = countries.map((country) => {\n if (country.isDefaultCountry) {\n defaultCountry = country.id;\n }\n return {\n text: country.label,\n value: country.id,\n };\n });\n setCountries(transformedCountries);\n setSelectedCountry(defaultCountry);\n });\n }, []);\n\n // Update regions when country is updated\n useEffect(() => {\n setRegionsLoading(true);\n getRegions(selectedCountry)\n .then((regions) => {\n const transformedRegions = regions.map((region) => {\n return {\n text: region.name,\n value: region.code,\n };\n });\n setRegions(transformedRegions);\n })\n .finally(() => {\n setRegionsLoading(false);\n });\n }, [selectedCountry, setRegionsLoading]);\n\n return {\n loading: priceSummaryLoading,\n regionsLoading,\n estimatedDestinationText,\n countries,\n selectedCountry,\n selectedRegion,\n selectedZip,\n regions,\n estimatedShippingPrice,\n estimatedShippingMethod,\n shippingEstimated,\n handleEstimateShipping,\n handleCountrySelected,\n resetValues,\n setPriceSummaryLoading,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { EstimateShipping as EstimateShippingComponent } from '@/cart/components';\nimport { useEstimatedShipping } from '@/cart/hooks';\nimport { setEstimatedShippingLocation } from '@/cart/lib/persisted-data';\nimport { state } from '@/cart/lib/state';\nimport { Button, Input, Picker, Price } from '@adobe-commerce/elsie/components';\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n HTMLAttributes,\n useCallback,\n useEffect,\n useState,\n} from 'preact/compat';\n\nexport interface EstimateShippingProps extends HTMLAttributes<HTMLDivElement> {\n showDefaultEstimatedShippingCost: boolean;\n}\n\nexport const EstimateShipping: Container<EstimateShippingProps> = ({\n showDefaultEstimatedShippingCost,\n}) => {\n const [isVirtual, setIsVirtual] = useState(false);\n\n const {\n loading,\n countries,\n regions,\n selectedCountry,\n estimatedDestinationText,\n estimatedShippingPrice,\n handleCountrySelected,\n handleEstimateShipping,\n regionsLoading,\n selectedRegion,\n selectedZip,\n shippingEstimated,\n resetValues,\n } = useEstimatedShipping();\n const handleEstimations = useCallback(\n (formValues: any) => {\n handleEstimateShipping(formValues).then(() => {\n setEstimatedShippingLocation(formValues);\n });\n },\n [handleEstimateShipping]\n );\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n setIsVirtual(payload?.isVirtual || false);\n\n const shippingAddress = payload?.addresses?.shipping?.[0];\n\n if (showDefaultEstimatedShippingCost && !shippingAddress) {\n handleEstimateShipping({\n shippingCountry: state.config?.defaultCountry ?? '',\n });\n }\n if (!shippingAddress) return;\n const { countryCode, regionCode, zipCode } = shippingAddress;\n\n handleEstimations({\n shippingCountry: countryCode,\n shippingState: regionCode,\n shippingZip: zipCode,\n });\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const updatedEvent = events.on('cart/updated', () => {\n if (!shippingEstimated) return;\n handleEstimateShipping({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n updatedEvent?.off();\n };\n }, [shippingEstimated, selectedCountry, selectedRegion, selectedZip, handleEstimateShipping]);\n\n useEffect(() => {\n const resetEvent = events.on('cart/reset', () => {\n resetValues();\n setEstimatedShippingLocation(null);\n });\n\n return () => {\n resetEvent?.off();\n };\n }, [resetValues]);\n\n useEffect(() => {\n const mergeEvent = events.on('cart/merged', () => {\n if (!shippingEstimated) return;\n\n handleEstimations({\n shippingCountry: selectedCountry,\n shippingState: selectedRegion,\n shippingZip: selectedZip,\n });\n });\n\n return () => {\n mergeEvent?.off();\n };\n }, [\n shippingEstimated,\n selectedCountry,\n selectedRegion,\n selectedZip,\n handleEstimations,\n ]);\n\n const dictionary = useText({\n applyButton: 'Cart.PriceSummary.estimatedShippingForm.apply.label',\n countryField: 'Cart.PriceSummary.estimatedShippingForm.country.placeholder',\n freeShipping: 'Cart.PriceSummary.freeShipping',\n stateField: 'Cart.PriceSummary.estimatedShippingForm.state.placeholder',\n taxToBeDetermined: 'Cart.PriceSummary.taxToBeDetermined',\n zipField: 'Cart.PriceSummary.estimatedShippingForm.zip.placeholder',\n });\n\n if (isVirtual) return null;\n\n const cartTaxesConfig = state.config?.shoppingCartDisplaySetting;\n return (\n <EstimateShippingComponent\n loading={loading}\n taxIncluded={cartTaxesConfig?.shipping === 'INCLUDING_TAX'}\n taxExcluded={cartTaxesConfig?.shipping === 'INCLUDING_EXCLUDING_TAX'}\n price={\n estimatedShippingPrice?.amount == 0 ? (\n <span data-testId=\"free-shipping\">{dictionary.freeShipping}</span>\n ) : cartTaxesConfig?.shipping === 'INCLUDING_TAX' &&\n estimatedShippingPrice ? (\n <Price\n data-testid=\"shipping\"\n {...estimatedShippingPrice.priceIncludingtax}\n />\n ) : estimatedShippingPrice ? (\n <Price {...estimatedShippingPrice} />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n estimated={true}\n priceExcludingTax={\n estimatedShippingPrice?.priceExcludingtax ? (\n <Price\n data-testid=\"shipping-excluding-tax\"\n {...estimatedShippingPrice.priceExcludingtax}\n />\n ) : (\n <span>{dictionary.taxToBeDetermined}</span>\n )\n }\n countryField={\n <Picker\n name=\"shippingCountry\"\n placeholder={dictionary.countryField}\n value={selectedCountry}\n variant=\"primary\"\n options={countries}\n handleSelect={handleCountrySelected}\n data-testid=\"estimate-shipping-country-selector\"\n />\n }\n stateField={\n regions.length > 0 ? (\n <Picker\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n options={regions}\n value={selectedRegion}\n data-testid=\"estimate-shipping-state-selector\"\n disabled={regionsLoading}\n />\n ) : (\n <Input\n aria-label={dictionary.stateField}\n name=\"shippingState\"\n placeholder={dictionary.stateField}\n variant=\"primary\"\n value={selectedRegion}\n disabled={regionsLoading}\n data-testid=\"estimate-shipping-state-input\"\n maxLength={50}\n />\n )\n }\n zipField={\n <Input\n aria-label={dictionary.zipField}\n name=\"shippingZip\"\n placeholder={dictionary.zipField}\n variant=\"primary\"\n data-testid=\"estimate-shipping-zip-input\"\n value={selectedZip}\n maxLength={12}\n />\n }\n estimateButton={\n <Button\n variant=\"secondary\"\n data-testid=\"estimate-shipping-apply-button\"\n aria-label={dictionary.applyButton}\n >\n {dictionary.applyButton}\n </Button>\n }\n destinationText={estimatedDestinationText || dictionary.taxToBeDetermined}\n onEstimate={handleEstimations}\n />\n );\n};\n"],"names":["EstimateShipping","countryField","destinationText","estimateButton","estimated","loading","onEstimate","price","priceExcludingTax","priceIncludingTax","stateField","taxExcluded","taxIncluded","zipField","estimateFormRef","useRef","showEstimateForm","setShowEstimateForm","useState","estimateField","setEstimateField","dictionary","useText","onDestinationLinkClick","e","show","onAlternateFieldClick","field","onSubmitEstimate","formData","getFormValues","destinationAriaLabel","jsxs","classes","jsx","Fragment","Text","event","VComponent","useEstimatedShipping","priceSummaryLoading","setPriceSummaryLoading","countries","setCountries","selectedCountry","setSelectedCountry","selectedRegion","setSelectedRegion","selectedZip","setSelectedZip","regions","setRegions","regionsLoading","setRegionsLoading","estimatedShippingPrice","setEstimatedShippingPrice","estimatedShippingMethod","setEstimatedShippingMethod","estimatedDestinationText","setEstimatedDestinationText","shippingEstimated","setShippingEstimated","resetValues","handleEstimateShipping","formValues","shippingCountry","shippingState","shippingZip","addressData","getEstimateShipping","data","handleCountrySelected","value","useEffect","getCountries","defaultCountry","transformedCountries","country","getRegions","transformedRegions","region","showDefaultEstimatedShippingCost","isVirtual","setIsVirtual","handleEstimations","useCallback","setEstimatedShippingLocation","cartEvent","events","payload","shippingAddress","_b","_a","_c","state","countryCode","regionCode","zipCode","updatedEvent","resetEvent","mergeEvent","cartTaxesConfig","EstimateShippingComponent","Price","Picker","Input","Button"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  /*! Copyright 2025 Adobe
2
2
  All Rights Reserved. */
3
- import{jsxs as y,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as p,useEffect as l}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as G,Icon as v,Button as b,Input as A}from"@dropins/tools/components.js";/* empty css */import{C as L}from"../chunks/Coupons.js";import"@dropins/tools/preact-hooks.js";import"../chunks/resetCart.js";import{events as x}from"@dropins/tools/event-bus.js";import{r as E,a as P}from"../chunks/removeGiftCardFromCart.js";import{S as T}from"../chunks/Close.js";import{S as B}from"../chunks/GiftCard.js";import{useText as R}from"@dropins/tools/i18n.js";import"../chunks/Coupon.js";import"@dropins/tools/fetch-graphql.js";import"../chunks/persisted-data.js";import"../chunks/refreshCart.js";import"../fragments.js";import"../chunks/acdl.js";const Y=({children:z,...C})=>{const[m,d]=p(new Set),[s,f]=p([]),[c,i]=p(new Set),o=R({giftCardTitle:"Cart.PriceSummary.giftCard.title",applyButton:"Cart.PriceSummary.giftCard.applyAction",placeholder:"Cart.PriceSummary.giftCard.placeholder",ariaLabel:"Cart.PriceSummary.giftCard.ariaLabel",ariaLabelRemove:"Cart.PriceSummary.giftCard.ariaLabelRemove",empty:"Cart.PriceSummary.giftCard.errors.empty"}),u=async r=>{const t=r==null?void 0:r.giftCardCode;if(t==="")return i(new Set([o.empty])),!0;const e=new Set(m);e.add(t),i(new Set),P(t).then(n=>{if(n===null)throw new Error("Error adding gift card code");d(e)}).catch(n=>{console.warn(n),i(new Set([n.message]))})},S=r=>{const t=new Set(m);t.delete(r),i(new Set),E(r).then(e=>{if(e===null)throw new Error("Error removing gift card code");d(t)}).catch(e=>{console.warn(e),i(new Set([e.message]))})};l(()=>{const r=x.on("cart/data",t=>{const e=t==null?void 0:t.appliedGiftCards;if(!e){f([]),i(new Set);return}const n=e.map(({code:w})=>w);f(n),i(new Set)},{eager:!0});return()=>{r==null||r.off()}},[]),l(()=>{d(new Set(s))},[s]);const g=s.map((r,t)=>y(G,{className:"coupon-code-form__applied-item",children:[a("span",{children:r}),a("button",{"aria-label":`${o.ariaLabelRemove} ${r}`,onClick:()=>S(r),"data-testid":`remove-giftcard-${t+1}`,children:a(v,{source:T,size:"16"})})]},r)),h=c.size>0?a("div",{"data-testid":"giftcard-code-error",children:Array.from(c)[0]}):void 0;return a(L,{...C,className:"cart-gift-cards",accordionSectionTitle:o.giftCardTitle,accordionSectionIcon:B,couponCodeField:a(A,{"aria-label":o.ariaLabel,type:"text",placeholder:o.placeholder,name:"giftCardCode",variant:"primary",value:"","data-testid":"giftcard-code-input",maxLength:50,error:c.size>0}),applyCouponsButton:a(b,{variant:"secondary",children:o.applyButton}),error:h,appliedCoupons:a("div",{children:g}),onApplyCoupon:u})};export{Y as GiftCards,Y as default};
3
+ import{jsxs as y,jsx as a}from"@dropins/tools/preact-jsx-runtime.js";import{useState as p,useEffect as l}from"@dropins/tools/preact-compat.js";import"@dropins/tools/lib.js";import{Tag as G,Icon as v,Button as b,Input as A}from"@dropins/tools/components.js";/* empty css */import{C as L}from"../chunks/Coupons.js";import"@dropins/tools/preact-hooks.js";import"../chunks/state.js";import{events as x}from"@dropins/tools/event-bus.js";import{r as E,a as P}from"../chunks/removeGiftCardFromCart.js";import{S as T}from"../chunks/Close.js";import{S as B}from"../chunks/GiftCard.js";import{useText as R}from"@dropins/tools/i18n.js";import"../chunks/Coupon.js";import"../chunks/persisted-data.js";import"../chunks/refreshCart.js";import"../chunks/resetCart.js";import"@dropins/tools/fetch-graphql.js";import"../fragments.js";import"../chunks/acdl.js";const Z=({children:z,...C})=>{const[m,d]=p(new Set),[s,f]=p([]),[c,i]=p(new Set),o=R({giftCardTitle:"Cart.PriceSummary.giftCard.title",applyButton:"Cart.PriceSummary.giftCard.applyAction",placeholder:"Cart.PriceSummary.giftCard.placeholder",ariaLabel:"Cart.PriceSummary.giftCard.ariaLabel",ariaLabelRemove:"Cart.PriceSummary.giftCard.ariaLabelRemove",empty:"Cart.PriceSummary.giftCard.errors.empty"}),u=async r=>{const t=r==null?void 0:r.giftCardCode;if(t==="")return i(new Set([o.empty])),!0;const e=new Set(m);e.add(t),i(new Set),P(t).then(n=>{if(n===null)throw new Error("Error adding gift card code");d(e)}).catch(n=>{console.warn(n),i(new Set([n.message]))})},S=r=>{const t=new Set(m);t.delete(r),i(new Set),E(r).then(e=>{if(e===null)throw new Error("Error removing gift card code");d(t)}).catch(e=>{console.warn(e),i(new Set([e.message]))})};l(()=>{const r=x.on("cart/data",t=>{const e=t==null?void 0:t.appliedGiftCards;if(!e){f([]),i(new Set);return}const n=e.map(({code:w})=>w);f(n),i(new Set)},{eager:!0});return()=>{r==null||r.off()}},[]),l(()=>{d(new Set(s))},[s]);const g=s.map((r,t)=>y(G,{className:"coupon-code-form__applied-item",children:[a("span",{children:r}),a("button",{"aria-label":`${o.ariaLabelRemove} ${r}`,onClick:()=>S(r),"data-testid":`remove-giftcard-${t+1}`,children:a(v,{source:T,size:"16"})})]},r)),h=c.size>0?a("div",{"data-testid":"giftcard-code-error",children:Array.from(c)[0]}):void 0;return a(L,{...C,className:"cart-gift-cards",accordionSectionTitle:o.giftCardTitle,accordionSectionIcon:B,couponCodeField:a(A,{"aria-label":o.ariaLabel,type:"text",placeholder:o.placeholder,name:"giftCardCode",variant:"primary",value:"","data-testid":"giftcard-code-input",maxLength:50,error:c.size>0}),applyCouponsButton:a(b,{variant:"secondary",children:o.applyButton}),error:h,appliedCoupons:a("div",{children:g}),onApplyCoupon:u})};export{Z as GiftCards,Z as default};
4
4
  //# sourceMappingURL=GiftCards.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GiftCards.js","sources":["/@dropins/storefront-cart/src/containers/GiftCards/GiftCards.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close, GiftCard } from '@adobe-commerce/elsie/icons';\nimport { applyGiftCardToCart, removeGiftCardFromCart } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface GiftCardsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const GiftCards: Container<GiftCardsProps> = ({\n children,\n ...props\n}) => {\n const [successfulGiftCardSet, setSuccessfulGiftCardSet] = useState(new Set());\n const [appliedGiftCardsArray, setAppliedGiftCardsArray] = useState<string[]>(\n []\n );\n const [giftCardError, setGiftCardError] = useState(new Set());\n\n const dictionary = useText({\n giftCardTitle: 'Cart.PriceSummary.giftCard.title',\n applyButton: 'Cart.PriceSummary.giftCard.applyAction',\n placeholder: 'Cart.PriceSummary.giftCard.placeholder',\n ariaLabel: 'Cart.PriceSummary.giftCard.ariaLabel',\n ariaLabelRemove: 'Cart.PriceSummary.giftCard.ariaLabelRemove',\n empty: 'Cart.PriceSummary.giftCard.errors.empty',\n });\n\n const handleApplyGiftCard = async (value: { giftCardCode: string }) => {\n const giftCardCode = value?.giftCardCode;\n\n if (giftCardCode === '') {\n setGiftCardError(new Set([dictionary.empty]));\n return true;\n }\n\n const newSet = new Set(successfulGiftCardSet);\n newSet.add(giftCardCode);\n setGiftCardError(new Set());\n\n applyGiftCardToCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n const handleRemoveGiftCard = (giftCardCode: string) => {\n const newSet = new Set(successfulGiftCardSet);\n newSet.delete(giftCardCode);\n setGiftCardError(new Set());\n\n removeGiftCardFromCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedGiftCards = payload?.appliedGiftCards;\n\n if (!appliedGiftCards) {\n // When appliedGiftCards returns null, no GiftCards are applied\n setAppliedGiftCardsArray([]);\n // Clear error message\n setGiftCardError(new Set());\n return;\n }\n\n const giftCardCodes = appliedGiftCards.map(({ code }) => code);\n\n setAppliedGiftCardsArray(giftCardCodes);\n // Clear error message\n setGiftCardError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulGiftCardSet(new Set(appliedGiftCardsArray));\n }, [appliedGiftCardsArray]);\n\n const appliedGiftCards = appliedGiftCardsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveGiftCard(code)}\n data-testid={`remove-giftcard-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n giftCardError.size > 0 ? (\n <div data-testid=\"giftcard-code-error\">\n {Array.from(giftCardError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n className={'cart-gift-cards'}\n accordionSectionTitle={dictionary.giftCardTitle}\n accordionSectionIcon={GiftCard}\n couponCodeField={\n <Input\n aria-label={dictionary.ariaLabel}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"giftCardCode\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"giftcard-code-input\"\n maxLength={50}\n error={giftCardError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedGiftCards}</div>}\n onApplyCoupon={handleApplyGiftCard}\n />\n );\n};\n"],"names":["GiftCards","children","props","successfulGiftCardSet","setSuccessfulGiftCardSet","useState","appliedGiftCardsArray","setAppliedGiftCardsArray","giftCardError","setGiftCardError","dictionary","useText","handleApplyGiftCard","value","giftCardCode","newSet","applyGiftCardToCart","result","error","handleRemoveGiftCard","removeGiftCardFromCart","useEffect","cartEvent","events","payload","appliedGiftCards","giftCardCodes","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","GiftCard","Input","Button"],"mappings":"u0BA4BO,MAAMA,EAAuC,CAAC,CACnD,SAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAAuBC,CAAwB,EAAIC,EAAS,IAAI,GAAK,EACtE,CAACC,EAAuBC,CAAwB,EAAIF,EACxD,CAAA,CACF,EACM,CAACG,EAAeC,CAAgB,EAAIJ,EAAS,IAAI,GAAK,EAEtDK,EAAaC,EAAQ,CACzB,cAAe,mCACf,YAAa,yCACb,YAAa,yCACb,UAAW,uCACX,gBAAiB,6CACjB,MAAO,yCAAA,CACR,EAEKC,EAAsB,MAAOC,GAAoC,CACrE,MAAMC,EAAeD,GAAA,YAAAA,EAAO,aAE5B,GAAIC,IAAiB,GACnB,OAAAL,MAAqB,IAAI,CAACC,EAAW,KAAK,CAAC,CAAC,EACrC,GAGH,MAAAK,EAAS,IAAI,IAAIZ,CAAqB,EAC5CY,EAAO,IAAID,CAAY,EACNL,EAAA,IAAI,GAAK,EAE1BO,EAAoBF,CAAY,EAC7B,KAAMG,GAAW,CAChB,GAAIA,IAAW,KACP,MAAA,IAAI,MAAM,6BAA6B,EAG/Cb,EAAyBW,CAAM,CAAA,CAChC,EACA,MAAOG,GAAU,CAChB,QAAQ,KAAKA,CAAK,EAClBT,MAAqB,IAAI,CAACS,EAAM,OAAO,CAAC,CAAC,CAAA,CAC1C,CACL,EAEMC,EAAwBL,GAAyB,CAC/C,MAAAC,EAAS,IAAI,IAAIZ,CAAqB,EAC5CY,EAAO,OAAOD,CAAY,EACTL,EAAA,IAAI,GAAK,EAE1BW,EAAuBN,CAAY,EAChC,KAAMG,GAAW,CAChB,GAAIA,IAAW,KACP,MAAA,IAAI,MAAM,+BAA+B,EAGjDb,EAAyBW,CAAM,CAAA,CAChC,EACA,MAAOG,GAAU,CAChB,QAAQ,KAAKA,CAAK,EAClBT,MAAqB,IAAI,CAACS,EAAM,OAAO,CAAC,CAAC,CAAA,CAC1C,CACL,EAEAG,EAAU,IAAM,CACd,MAAMC,EAAYC,EAAO,GACvB,YACCC,GAAY,CACX,MAAMC,EAAmBD,GAAA,YAAAA,EAAS,iBAElC,GAAI,CAACC,EAAkB,CAErBlB,EAAyB,CAAA,CAAE,EAEVE,EAAA,IAAI,GAAK,EAC1B,MAAA,CAGF,MAAMiB,EAAgBD,EAAiB,IAAI,CAAC,CAAE,KAAAE,KAAWA,CAAI,EAE7DpB,EAAyBmB,CAAa,EAErBjB,EAAA,IAAI,GAAK,CAC5B,EACA,CAAE,MAAO,EAAK,CAChB,EAEA,MAAO,IAAM,CACXa,GAAA,MAAAA,EAAW,KACb,CACF,EAAG,EAAE,EAELD,EAAU,IAAM,CACWjB,EAAA,IAAI,IAAIE,CAAqB,CAAC,CAAA,EACtD,CAACA,CAAqB,CAAC,EAEpB,MAAAmB,EAAmBnB,EAAsB,IAAI,CAACqB,EAAMC,IACxDC,EAACC,EAAe,CAAA,UAAU,iCACxB,SAAA,CAAAC,EAAC,QAAM,SAAKJ,CAAA,CAAA,EACZI,EAAC,SAAA,CACC,aAAY,GAAGrB,EAAW,eAAe,IAAIiB,CAAI,GACjD,QAAS,IAAMR,EAAqBQ,CAAI,EACxC,cAAa,mBAAmBC,EAAQ,CAAC,GAEzC,SAACG,EAAAC,EAAA,CAAK,OAAQC,EAAO,KAAM,IAAM,CAAA,CAAA,CAAA,CACnC,CAAA,EARQN,CASV,CACD,EAEKO,EACJ1B,EAAc,KAAO,IAClB,MAAI,CAAA,cAAY,sBACd,SAAA,MAAM,KAAKA,CAAa,EAAE,CAAC,CAC9B,CAAA,EACE,OAGJ,OAAAuB,EAACI,EAAA,CACE,GAAGjC,EACJ,UAAW,kBACX,sBAAuBQ,EAAW,cAClC,qBAAsB0B,EACtB,gBACEL,EAACM,EAAA,CACC,aAAY3B,EAAW,UACvB,KAAK,OACL,YAAaA,EAAW,YACxB,KAAK,eACL,QAAQ,UACR,MAAM,GACN,cAAY,sBACZ,UAAW,GACX,MAAOF,EAAc,KAAO,CAAA,CAC9B,EAEF,mBACGuB,EAAAO,EAAA,CAAO,QAAQ,YAAa,WAAW,YAAY,EAEtD,MAAOJ,EACP,eAAiBH,EAAA,MAAA,CAAK,SAAiBN,CAAA,CAAA,EACvC,cAAeb,CAAA,CACjB,CAEJ"}
1
+ {"version":3,"file":"GiftCards.js","sources":["/@dropins/storefront-cart/src/containers/GiftCards/GiftCards.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { HTMLAttributes, useState, useEffect } from 'preact/compat';\nimport { Container } from '@adobe-commerce/elsie/lib';\nimport { Coupons as CouponsComponent } from '@/cart/components';\nimport { Button, Input, Icon, Tag } from '@adobe-commerce/elsie/components';\nimport { Close, GiftCard } from '@adobe-commerce/elsie/icons';\nimport { applyGiftCardToCart, removeGiftCardFromCart } from '@/cart/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { useText } from '@adobe-commerce/elsie/i18n';\n\nexport interface GiftCardsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const GiftCards: Container<GiftCardsProps> = ({\n children,\n ...props\n}) => {\n const [successfulGiftCardSet, setSuccessfulGiftCardSet] = useState(new Set());\n const [appliedGiftCardsArray, setAppliedGiftCardsArray] = useState<string[]>(\n []\n );\n const [giftCardError, setGiftCardError] = useState(new Set());\n\n const dictionary = useText({\n giftCardTitle: 'Cart.PriceSummary.giftCard.title',\n applyButton: 'Cart.PriceSummary.giftCard.applyAction',\n placeholder: 'Cart.PriceSummary.giftCard.placeholder',\n ariaLabel: 'Cart.PriceSummary.giftCard.ariaLabel',\n ariaLabelRemove: 'Cart.PriceSummary.giftCard.ariaLabelRemove',\n empty: 'Cart.PriceSummary.giftCard.errors.empty',\n });\n\n const handleApplyGiftCard = async (value: { giftCardCode: string }) => {\n const giftCardCode = value?.giftCardCode;\n\n if (giftCardCode === '') {\n setGiftCardError(new Set([dictionary.empty]));\n return true;\n }\n\n const newSet = new Set(successfulGiftCardSet);\n newSet.add(giftCardCode);\n setGiftCardError(new Set());\n\n applyGiftCardToCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error adding gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n const handleRemoveGiftCard = (giftCardCode: string) => {\n const newSet = new Set(successfulGiftCardSet);\n newSet.delete(giftCardCode);\n setGiftCardError(new Set());\n\n removeGiftCardFromCart(giftCardCode)\n .then((result) => {\n if (result === null) {\n throw new Error('Error removing gift card code');\n }\n\n setSuccessfulGiftCardSet(newSet);\n })\n .catch((error) => {\n console.warn(error);\n setGiftCardError(new Set([error.message]));\n });\n };\n\n useEffect(() => {\n const cartEvent = events.on(\n 'cart/data',\n (payload) => {\n const appliedGiftCards = payload?.appliedGiftCards;\n\n if (!appliedGiftCards) {\n // When appliedGiftCards returns null, no GiftCards are applied\n setAppliedGiftCardsArray([]);\n // Clear error message\n setGiftCardError(new Set());\n return;\n }\n\n const giftCardCodes = appliedGiftCards.map(({ code }) => code);\n\n setAppliedGiftCardsArray(giftCardCodes);\n // Clear error message\n setGiftCardError(new Set());\n },\n { eager: true }\n );\n\n return () => {\n cartEvent?.off();\n };\n }, []);\n\n useEffect(() => {\n setSuccessfulGiftCardSet(new Set(appliedGiftCardsArray));\n }, [appliedGiftCardsArray]);\n\n const appliedGiftCards = appliedGiftCardsArray.map((code, index) => (\n <Tag key={code} className=\"coupon-code-form__applied-item\">\n <span>{code}</span>\n <button\n aria-label={`${dictionary.ariaLabelRemove} ${code}`}\n onClick={() => handleRemoveGiftCard(code)}\n data-testid={`remove-giftcard-${index + 1}`}\n >\n <Icon source={Close} size={'16'} />\n </button>\n </Tag>\n ));\n\n const errorMessage =\n giftCardError.size > 0 ? (\n <div data-testid=\"giftcard-code-error\">\n {Array.from(giftCardError)[0] as string}\n </div>\n ) : undefined;\n\n return (\n <CouponsComponent\n {...props}\n className={'cart-gift-cards'}\n accordionSectionTitle={dictionary.giftCardTitle}\n accordionSectionIcon={GiftCard}\n couponCodeField={\n <Input\n aria-label={dictionary.ariaLabel}\n type=\"text\"\n placeholder={dictionary.placeholder}\n name=\"giftCardCode\"\n variant=\"primary\"\n value=\"\"\n data-testid=\"giftcard-code-input\"\n maxLength={50}\n error={giftCardError.size > 0}\n />\n }\n applyCouponsButton={\n <Button variant=\"secondary\">{dictionary.applyButton}</Button>\n }\n error={errorMessage}\n appliedCoupons={<div>{appliedGiftCards}</div>}\n onApplyCoupon={handleApplyGiftCard}\n />\n );\n};\n"],"names":["GiftCards","children","props","successfulGiftCardSet","setSuccessfulGiftCardSet","useState","appliedGiftCardsArray","setAppliedGiftCardsArray","giftCardError","setGiftCardError","dictionary","useText","handleApplyGiftCard","value","giftCardCode","newSet","applyGiftCardToCart","result","error","handleRemoveGiftCard","removeGiftCardFromCart","useEffect","cartEvent","events","payload","appliedGiftCards","giftCardCodes","code","index","jsxs","Tag","jsx","Icon","Close","errorMessage","CouponsComponent","GiftCard","Input","Button"],"mappings":"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"}