@automattic/shopping-cart
Version:
A library to use the WordPress.com shopping cart.
42 lines (34 loc) • 1.42 kB
text/typescript
import { useContext, useState, useEffect, useRef } from 'react';
import { createUseShoppingCartState } from './shopping-cart-hook-manager';
import ShoppingCartOptionsContext from './shopping-cart-options-context';
import useManagerClient from './use-manager-client';
import useRefetchOnFocus from './use-refetch-on-focus';
import type { UseShoppingCart, CartKey } from './types';
export default function useShoppingCart( cartKey: CartKey | undefined ): UseShoppingCart {
const managerClient = useManagerClient( 'useShoppingCart' );
const { defaultCartKey } = useContext( ShoppingCartOptionsContext );
const finalCartKey = cartKey ?? defaultCartKey;
const manager = managerClient.forCartKey( finalCartKey );
useRefetchOnFocus( finalCartKey );
useEffect( () => {
manager.fetchInitialCart().catch( () => {
// The consumer of the cart data can display any errors returned by the
// endpoint, so we will ignore them here.
} );
}, [ manager ] );
const isMounted = useRef( true );
useEffect( () => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, [] );
// Re-render when the cart changes
const [ cartState, setCartState ] = useState( createUseShoppingCartState( manager ) );
useEffect( () => {
return manager.subscribe( () => {
isMounted.current && setCartState( createUseShoppingCartState( manager ) );
} );
}, [ manager ] );
return cartState;
}