{"version":3,"file":"CartProvider.mjs","names":[],"sources":["../../src/CartProvider.tsx"],"sourcesContent":["import {\n  useCallback,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  useTransition,\n  createContext,\n  useContext,\n} from 'react';\nimport {\n  AttributeInput,\n  CartBuyerIdentityInput,\n  CartInput,\n  CartLineInput,\n  CartLineUpdateInput,\n  CountryCode,\n  LanguageCode,\n  Cart as CartType,\n  MutationCartNoteUpdateArgs,\n} from './storefront-api-types.js';\nimport {\n  BuyerIdentityUpdateEvent,\n  CartMachineContext,\n  CartMachineEvent,\n  CartMachineTypeState,\n  CartWithActions,\n  CartWithActionsDocs,\n} from './cart-types.js';\nimport {useCartAPIStateMachine} from './useCartAPIStateMachine.js';\nimport {CART_ID_STORAGE_KEY} from './cart-constants.js';\nimport {PartialDeep} from 'type-fest';\nimport {defaultCartFragment} from './cart-queries.js';\nimport {useShop} from './ShopifyProvider.js';\n\nexport const CartContext = createContext<CartWithActions | null>(null);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n/**\n * `useCart` hook must be a descendent of a `CartProvider` component.\n * @publicDocs */\nexport type UseCartDocs = () => CartWithActionsDocs;\n\n/**\n * The `useCart` hook provides access to the cart object. It must be a descendent of a `CartProvider` component.\n * @publicDocs\n */\nexport function useCart(): CartWithActions {\n  const context = useContext(CartContext);\n\n  if (!context) {\n    throw new Error('Expected a Cart Context, but no Cart Context was found');\n  }\n\n  return context;\n}\n\ntype CartProviderProps = {\n  /** Any `ReactNode` elements. */\n  children: React.ReactNode;\n  /**  Maximum number of cart lines to fetch. Defaults to 250 cart lines. */\n  numCartLines?: number;\n  /** A callback that is invoked when the process to create a cart begins, but before the cart is created in the Storefront API. */\n  onCreate?: () => void;\n  /** A callback that is invoked when the process to add a line item to the cart begins, but before the line item is added to the Storefront API. */\n  onLineAdd?: () => void;\n  /** A callback that is invoked when the process to remove a line item to the cart begins, but before the line item is removed from the Storefront API. */\n  onLineRemove?: () => void;\n  /** A callback that is invoked when the process to update a line item in the cart begins, but before the line item is updated in the Storefront API. */\n  onLineUpdate?: () => void;\n  /** A callback that is invoked when the process to add or update a note in the cart begins, but before the note is added or updated in the Storefront API. */\n  onNoteUpdate?: () => void;\n  /** A callback that is invoked when the process to update the buyer identity begins, but before the buyer identity is updated in the Storefront API. */\n  onBuyerIdentityUpdate?: () => void;\n  /** A callback that is invoked when the process to update the cart attributes begins, but before the attributes are updated in the Storefront API. */\n  onAttributesUpdate?: () => void;\n  /** A callback that is invoked when the process to update the cart discount codes begins, but before the discount codes are updated in the Storefront API. */\n  onDiscountCodesUpdate?: () => void;\n  /** A callback that is invoked when the process to create a cart completes */\n  onCreateComplete?: () => void;\n  /** A callback that is invoked when the process to add a line item to the cart completes */\n  onLineAddComplete?: () => void;\n  /** A callback that is invoked when the process to remove a line item to the cart completes */\n  onLineRemoveComplete?: () => void;\n  /** A callback that is invoked when the process to update a line item in the cart completes */\n  onLineUpdateComplete?: () => void;\n  /** A callback that is invoked when the process to add or update a note in the cart completes */\n  onNoteUpdateComplete?: () => void;\n  /** A callback that is invoked when the process to update the buyer identity completes */\n  onBuyerIdentityUpdateComplete?: () => void;\n  /** A callback that is invoked when the process to update the cart attributes completes */\n  onAttributesUpdateComplete?: () => void;\n  /** A callback that is invoked when the process to update the cart discount codes completes */\n  onDiscountCodesUpdateComplete?: () => void;\n  /** An object with fields that correspond to the Storefront API's [Cart object](https://shopify.dev/api/storefront/2026-04/objects/cart). */\n  data?: PartialDeep<CartType, {recurseIntoArrays: true}>;\n  /** A fragment used to query the Storefront API's [Cart object](https://shopify.dev/api/storefront/2026-04/objects/cart) for all queries and mutations. A default value is used if no argument is provided. */\n  cartFragment?: string;\n  /** A customer access token that's accessible on the server if there's a customer login. */\n  customerAccessToken?: CartBuyerIdentityInput['customerAccessToken'];\n  /** The ISO country code for i18n. */\n  countryCode?: CountryCode;\n  /** The ISO language code for i18n. */\n  languageCode?: LanguageCode;\n};\n\n/**\n * The `CartProvider` component synchronizes the state of the Storefront API Cart and a customer's cart,\n * and allows you to more easily manipulate the cart by adding, removing, and updating it.\n * It could be placed at the root of your app so that your whole app is able to use the `useCart()` hook anywhere.\n *\n * There are props that trigger when a call to the Storefront API is made, such as `onLineAdd={}` when a line is added to the cart.\n * There are also props that trigger when a call to the Storefront API is completed, such as `onLineAddComplete={}` when the fetch request for adding a line to the cart completes.\n *\n * The `CartProvider` component must be a descendant of the `ShopifyProvider` component.\n * @publicDocs\n */\nexport function CartProvider({\n  children,\n  numCartLines,\n  onCreate,\n  onLineAdd,\n  onLineRemove,\n  onLineUpdate,\n  onNoteUpdate,\n  onBuyerIdentityUpdate,\n  onAttributesUpdate,\n  onDiscountCodesUpdate,\n  onCreateComplete,\n  onLineAddComplete,\n  onLineRemoveComplete,\n  onLineUpdateComplete,\n  onNoteUpdateComplete,\n  onBuyerIdentityUpdateComplete,\n  onAttributesUpdateComplete,\n  onDiscountCodesUpdateComplete,\n  data: cart,\n  cartFragment = defaultCartFragment,\n  customerAccessToken,\n  countryCode,\n  languageCode,\n}: CartProviderProps): JSX.Element {\n  const shop = useShop();\n\n  if (!shop)\n    throw new Error(\n      '<CartProvider> needs to be a descendant of <ShopifyProvider>',\n    );\n\n  countryCode = (\n    (countryCode as string) ??\n    shop.countryIsoCode ??\n    'US'\n  ).toUpperCase() as CountryCode;\n\n  languageCode = (\n    (languageCode as string) ??\n    shop.languageIsoCode ??\n    'EN'\n  ).toUpperCase() as LanguageCode;\n\n  if (countryCode) countryCode = countryCode.toUpperCase() as CountryCode;\n\n  const [prevCountryCode, setPrevCountryCode] = useState(countryCode);\n  const [prevCustomerAccessToken, setPrevCustomerAccessToken] =\n    useState(customerAccessToken);\n  const customerOverridesCountryCode = useRef(false);\n\n  if (\n    prevCountryCode !== countryCode ||\n    prevCustomerAccessToken !== customerAccessToken\n  ) {\n    setPrevCountryCode(countryCode);\n    setPrevCustomerAccessToken(customerAccessToken);\n    customerOverridesCountryCode.current = false;\n  }\n\n  const [cartState, cartSend] = useCartAPIStateMachine({\n    numCartLines,\n    data: cart,\n    cartFragment,\n    countryCode,\n    languageCode,\n    onCartActionEntry(_, event) {\n      try {\n        switch (event.type) {\n          case 'CART_CREATE':\n            return onCreate?.();\n          case 'CARTLINE_ADD':\n            return onLineAdd?.();\n          case 'CARTLINE_REMOVE':\n            return onLineRemove?.();\n          case 'CARTLINE_UPDATE':\n            return onLineUpdate?.();\n          case 'NOTE_UPDATE':\n            return onNoteUpdate?.();\n          case 'BUYER_IDENTITY_UPDATE':\n            return onBuyerIdentityUpdate?.();\n          case 'CART_ATTRIBUTES_UPDATE':\n            return onAttributesUpdate?.();\n          case 'DISCOUNT_CODES_UPDATE':\n            return onDiscountCodesUpdate?.();\n        }\n      } catch (error) {\n        console.error('Cart entry action failed', error);\n      }\n    },\n    onCartActionOptimisticUI(context, event) {\n      if (!context.cart) return {...context};\n      switch (event.type) {\n        case 'CARTLINE_REMOVE':\n          return {\n            ...context,\n            cart: {\n              ...context.cart,\n              lines: context?.cart?.lines?.filter(\n                (line) => line?.id && !event.payload.lines.includes(line?.id),\n              ),\n            },\n          };\n        case 'CARTLINE_UPDATE':\n          return {\n            ...context,\n            cart: {\n              ...context.cart,\n              lines: context?.cart?.lines?.map((line) => {\n                const updatedLine = event.payload.lines.find(\n                  ({id}) => id === line?.id,\n                );\n\n                if (updatedLine && updatedLine.quantity) {\n                  return {\n                    ...line,\n                    quantity: updatedLine.quantity,\n                  };\n                }\n\n                return line;\n              }),\n            },\n          };\n      }\n      return {...context};\n    },\n    onCartActionComplete(context, event) {\n      const cartActionEvent = event.payload.cartActionEvent;\n      try {\n        switch (event.type) {\n          case 'RESOLVE':\n            switch (cartActionEvent.type) {\n              case 'CART_CREATE':\n                return onCreateComplete?.();\n              case 'CARTLINE_ADD':\n                return onLineAddComplete?.();\n              case 'CARTLINE_REMOVE':\n                return onLineRemoveComplete?.();\n              case 'CARTLINE_UPDATE':\n                return onLineUpdateComplete?.();\n              case 'NOTE_UPDATE':\n                return onNoteUpdateComplete?.();\n              case 'BUYER_IDENTITY_UPDATE':\n                if (countryCodeNotUpdated(context, cartActionEvent)) {\n                  customerOverridesCountryCode.current = true;\n                }\n                return onBuyerIdentityUpdateComplete?.();\n              case 'CART_ATTRIBUTES_UPDATE':\n                return onAttributesUpdateComplete?.();\n              case 'DISCOUNT_CODES_UPDATE':\n                return onDiscountCodesUpdateComplete?.();\n            }\n        }\n      } catch (error) {\n        console.error('onCartActionComplete failed', error);\n      }\n    },\n  });\n\n  const cartReady = useRef(false);\n  const [isCartReady, setIsCartReady] = useState(false);\n  const cartCompleted = cartState.matches('cartCompleted');\n\n  const countryChanged =\n    (cartState.value === 'idle' ||\n      cartState.value === 'error' ||\n      cartState.value === 'cartCompleted') &&\n    countryCode !== cartState?.context?.cart?.buyerIdentity?.countryCode &&\n    !cartState.context.errors;\n\n  const fetchingFromStorage = useRef(false);\n\n  /**\n   * Initializes cart with priority in this order:\n   * 1. cart props\n   * 2. localStorage cartId\n   */\n  useEffect(() => {\n    if (!cartReady.current && !fetchingFromStorage.current) {\n      if (!cart && storageAvailable('localStorage')) {\n        fetchingFromStorage.current = true;\n        try {\n          const cartId = window.localStorage.getItem(CART_ID_STORAGE_KEY);\n          if (cartId) {\n            cartSend({type: 'CART_FETCH', payload: {cartId}});\n          }\n        } catch (error) {\n          console.warn('error fetching cartId');\n          console.warn(error);\n        }\n      }\n      cartReady.current = true;\n      // Providing a separate cart ready state variable to avoid re-renders in this logic while still being able to pass the reactive status through context.\n      setIsCartReady(true);\n    }\n  }, [cart, cartReady, cartSend]);\n\n  // Update cart country code if cart and props countryCode's as different\n  useEffect(() => {\n    if (!countryChanged || customerOverridesCountryCode.current) return;\n    cartSend({\n      type: 'BUYER_IDENTITY_UPDATE',\n      payload: {buyerIdentity: {countryCode, customerAccessToken}},\n    });\n  }, [\n    countryCode,\n    customerAccessToken,\n    countryChanged,\n    customerOverridesCountryCode,\n    cartSend,\n  ]);\n\n  // send cart events when ready\n  const onCartReadySend = useCallback(\n    (cartEvent: CartMachineEvent) => {\n      if (!cartReady.current) {\n        return console.warn(\"Cart isn't ready yet\");\n      }\n      cartSend(cartEvent);\n    },\n    [cartSend],\n  );\n\n  // save cart id to local storage\n  useEffect(() => {\n    if (cartState?.context?.cart?.id && storageAvailable('localStorage')) {\n      try {\n        window.localStorage.setItem(\n          CART_ID_STORAGE_KEY,\n          cartState.context.cart?.id,\n        );\n      } catch (error) {\n        console.warn('Failed to save cartId to localStorage', error);\n      }\n    }\n  }, [cartState?.context?.cart?.id]);\n\n  // delete cart from local storage if cart fetched has been completed\n  useEffect(() => {\n    if (cartCompleted && storageAvailable('localStorage')) {\n      try {\n        window.localStorage.removeItem(CART_ID_STORAGE_KEY);\n      } catch (error) {\n        console.warn('Failed to delete cartId from localStorage', error);\n      }\n    }\n  }, [cartCompleted]);\n\n  const cartCreate = useCallback(\n    (cartInput: CartInput) => {\n      if (countryCode && !cartInput.buyerIdentity?.countryCode) {\n        if (cartInput.buyerIdentity == null) {\n          cartInput.buyerIdentity = {};\n        }\n        cartInput.buyerIdentity.countryCode = countryCode;\n      }\n\n      if (\n        customerAccessToken &&\n        !cartInput.buyerIdentity?.customerAccessToken\n      ) {\n        if (cartInput.buyerIdentity == null) {\n          cartInput.buyerIdentity = {};\n        }\n        cartInput.buyerIdentity.customerAccessToken = customerAccessToken;\n      }\n      onCartReadySend({\n        type: 'CART_CREATE',\n        payload: cartInput,\n      });\n    },\n    [countryCode, customerAccessToken, onCartReadySend],\n  );\n\n  // Delays the cart state in the context if the page is hydrating\n  // preventing suspense boundary errors.\n  const cartDisplayState = useDelayedStateUntilHydration(cartState);\n\n  const cartContextValue = useMemo<CartWithActions>(() => {\n    return {\n      ...(cartDisplayState?.context?.cart ?? {lines: [], attributes: []}),\n      status: transposeStatus(cartDisplayState.value),\n      error: cartDisplayState?.context?.errors,\n      totalQuantity: cartDisplayState?.context?.cart?.totalQuantity ?? 0,\n      cartCreate,\n      cartReady: isCartReady,\n      linesAdd(lines: CartLineInput[]): void {\n        if (cartDisplayState?.context?.cart?.id) {\n          onCartReadySend({\n            type: 'CARTLINE_ADD',\n            payload: {lines},\n          });\n        } else {\n          cartCreate({lines});\n        }\n      },\n      linesRemove(lines: string[]): void {\n        onCartReadySend({\n          type: 'CARTLINE_REMOVE',\n          payload: {\n            lines,\n          },\n        });\n      },\n      linesUpdate(lines: CartLineUpdateInput[]): void {\n        onCartReadySend({\n          type: 'CARTLINE_UPDATE',\n          payload: {\n            lines,\n          },\n        });\n      },\n      noteUpdate(note: MutationCartNoteUpdateArgs['note']): void {\n        onCartReadySend({\n          type: 'NOTE_UPDATE',\n          payload: {\n            note,\n          },\n        });\n      },\n      buyerIdentityUpdate(buyerIdentity: CartBuyerIdentityInput): void {\n        onCartReadySend({\n          type: 'BUYER_IDENTITY_UPDATE',\n          payload: {\n            buyerIdentity,\n          },\n        });\n      },\n      cartAttributesUpdate(attributes: AttributeInput[]): void {\n        onCartReadySend({\n          type: 'CART_ATTRIBUTES_UPDATE',\n          payload: {\n            attributes,\n          },\n        });\n      },\n      discountCodesUpdate(discountCodes: string[]): void {\n        onCartReadySend({\n          type: 'DISCOUNT_CODES_UPDATE',\n          payload: {\n            discountCodes,\n          },\n        });\n      },\n      cartFragment,\n    };\n  }, [\n    cartCreate,\n    isCartReady,\n    cartDisplayState?.context?.cart,\n    cartDisplayState?.context?.errors,\n    cartDisplayState.value,\n    cartFragment,\n    onCartReadySend,\n  ]);\n\n  return (\n    <CartContext.Provider value={cartContextValue}>\n      {children}\n    </CartContext.Provider>\n  );\n}\n\nfunction transposeStatus(\n  status: CartMachineTypeState['value'],\n): CartWithActions['status'] {\n  switch (status) {\n    case 'uninitialized':\n    case 'initializationError':\n      return 'uninitialized';\n    case 'idle':\n    case 'cartCompleted':\n    case 'error':\n      return 'idle';\n    case 'cartFetching':\n      return 'fetching';\n    case 'cartCreating':\n      return 'creating';\n    case 'cartLineAdding':\n    case 'cartLineRemoving':\n    case 'cartLineUpdating':\n    case 'noteUpdating':\n    case 'buyerIdentityUpdating':\n    case 'cartAttributesUpdating':\n    case 'discountCodesUpdating':\n      return 'updating';\n  }\n}\n\n/**\n * Delays a state update until hydration finishes. Useful for preventing suspense boundaries errors when updating a context\n * @remarks this uses startTransition and waits for it to finish.\n */\nfunction useDelayedStateUntilHydration<T>(state: T): T {\n  const [isPending, startTransition] = useTransition();\n  const [delayedState, setDelayedState] = useState(state);\n\n  const firstTimePending = useRef(false);\n  if (isPending) {\n    firstTimePending.current = true;\n  }\n\n  const firstTimePendingFinished = useRef(false);\n  if (!isPending && firstTimePending.current) {\n    firstTimePendingFinished.current = true;\n  }\n\n  useEffect(() => {\n    startTransition(() => {\n      if (!firstTimePendingFinished.current) {\n        setDelayedState(state);\n      }\n    });\n  }, [state]);\n\n  const displayState = firstTimePendingFinished.current ? state : delayedState;\n\n  return displayState;\n}\n\n/**\n * Check for storage availability function obtained from\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API\n */\nexport function storageAvailable(\n  type: 'localStorage' | 'sessionStorage',\n): boolean {\n  let storage;\n  try {\n    storage = window[type];\n    const x = '__storage_test__';\n    storage.setItem(x, x);\n    storage.removeItem(x);\n    return true;\n  } catch (e) {\n    return !!(\n      e instanceof DOMException &&\n      // everything except Firefox\n      (e.code === 22 ||\n        // Firefox\n        e.code === 1014 ||\n        // test name field too, because code might not be present\n        // everything except Firefox\n        e.name === 'QuotaExceededError' ||\n        // Firefox\n        e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&\n      // acknowledge QuotaExceededError only if there's something already stored\n      storage &&\n      storage.length !== 0\n    );\n  }\n}\n\nfunction countryCodeNotUpdated(\n  context: CartMachineContext,\n  event: BuyerIdentityUpdateEvent,\n): boolean {\n  return !!(\n    event.payload.buyerIdentity.countryCode &&\n    context.cart?.buyerIdentity?.countryCode !==\n      event.payload.buyerIdentity.countryCode\n  );\n}\n"],"mappings":"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"}