use-shopping-cart logouse-shopping-cart
Hooks

useShoppingCart()

The main hook for accessing shopping cart state and methods. Returns all cart properties and action methods.

Signature

function useShoppingCart(): UseShoppingCartReturn

Usage

import { useShoppingCart } from 'use-shopping-cart'

function MyComponent() {
  const {
    // Cart state
    cartCount,
    totalPrice,
    formattedTotalPrice,
    cartDetails,

    // Cart actions
    addItem,
    removeItem,
    incrementItem,
    decrementItem,
    clearCart,

    // Checkout
    redirectToCheckout
  } = useShoppingCart()

  // Use cart state and methods
}

Return Value

The hook returns an object with all cart state and methods:

Cart State Properties

PropertyTypeDescription
cartCountnumberTotal number of items in cart
totalPricenumberTotal price in smallest currency unit
formattedTotalPricestringFormatted total price with currency symbol
cartDetailsobjectObject containing all cart items with details
shouldDisplayCartbooleanUI helper for displaying cart
lastClickedstringID of last clicked product

Cart Manipulation Methods

MethodDescription
addItem(product, options?)Add product to cart
incrementItem(id, options?)Increase quantity by 1
decrementItem(id, options?)Decrease quantity by 1
setItemQuantity(id, quantity)Set specific quantity
removeItem(id)Remove item from cart
clearCart()Remove all items
loadCart(cartDetails)Load cart from external source

Checkout Methods

MethodDescription
redirectToCheckout(sessionUrl)Redirect to Stripe checkout with server-created session URL

UI Helper Methods

MethodDescription
handleCartClick()Toggle cart display
handleCartHover()Handle cart hover
handleCloseCart()Close cart display
storeLastClicked(productId)Store last clicked product

Complete Examples

Basic Cart Operations

function ProductCard({ product }) {
  const { addItem, cartDetails, redirectToCheckout } = useShoppingCart()

  const itemInCart = cartDetails[product.id]

  const handleCheckout = async () => {
    const response = await fetch('/api/checkout', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ cartDetails })
    })

    const { sessionUrl } = await response.json()
    await redirectToCheckout(sessionUrl)
  }

  return (
    <div className="product">
      <h3>{product.name}</h3>
      <p>${product.price / 100}</p>

      {itemInCart ? (
        <p>In cart: {itemInCart.quantity}</p>
      ) : (
        <button onClick={() => addItem(product)}>Add to Cart</button>
      )}
    </div>
  )
}

Cart Display Component

function CartSummary() {
  const {
    cartCount,
    formattedTotalPrice,
    cartDetails,
    incrementItem,
    decrementItem,
    removeItem,
    redirectToCheckout
  } = useShoppingCart()

  const handleCheckout = async () => {
    const response = await fetch('/api/checkout', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ cartDetails })
    })

    const { sessionUrl } = await response.json()
    await redirectToCheckout(sessionUrl)
  }

  if (cartCount === 0) {
    return <p>Your cart is empty</p>
  }

  return (
    <div className="cart">
      <h2>Cart ({cartCount} items)</h2>

      {Object.entries(cartDetails).map(([id, item]) => (
        <div key={id} className="cart-item">
          <h4>{item.name}</h4>
          <p>{item.formattedPrice}</p>

          <div className="quantity-controls">
            <button onClick={() => decrementItem(id)}>-</button>
            <span>{item.quantity}</span>
            <button onClick={() => incrementItem(id)}>+</button>
            <button onClick={() => removeItem(id)}>Remove</button>
          </div>
        </div>
      ))}

      <div className="cart-total">
        <h3>Total: {formattedTotalPrice}</h3>
        <button onClick={handleCheckout}>Checkout</button>
      </div>
    </div>
  )
}

TypeScript Support

import { useShoppingCart } from 'use-shopping-cart'
import type { Product } from 'use-shopping-cart/core'

function TypeSafeComponent() {
  const { addItem, cartDetails, incrementItem } = useShoppingCart()

  // Fully typed product
  const product: Product = {
    id: 'banana_001',
    name: 'Bananas',
    price: 400,
    currency: 'USD'
  }

  addItem(product)
}

Notes

  • Must be used within a <CartProvider> component
  • Returns stable references (safe to use in dependency arrays)
  • All methods are memoized
  • State updates trigger re-renders
  • Works with React 19+ features

See Also

Shopping Cart

Your cart is empty

Try the interactive demos on the docs pages!