import { Cart } from '@commerce/types' import { SWRHook } from '@commerce/utils/types' import useCart, { FetchCartInput, UseCart } from '@commerce/cart/use-cart' import { cartFragment } from '../api/fragments/cart' import { ActiveOrderQuery, CartFragment } from '../schema' import { normalizeCart } from '../lib/normalize' import { useMemo } from 'react' export const getCartQuery = /* GraphQL */ ` query activeOrder { activeOrder { ...Cart } } ${cartFragment} ` export type CartResult = { activeOrder?: CartFragment addItemToOrder?: CartFragment adjustOrderLine?: CartFragment removeOrderLine?: CartFragment } export default useCart as UseCart export const handler: SWRHook< Cart | null, {}, FetchCartInput, { isEmpty?: boolean } > = { fetchOptions: { query: getCartQuery, }, async fetcher({ input: { cartId }, options, fetch }) { const { activeOrder } = await fetch(options) return activeOrder ? normalizeCart(activeOrder) : null }, useHook: ({ useData }) => (input) => { const response = useData({ swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, }) return useMemo( () => Object.create(response, { isEmpty: { get() { return (response.data?.lineItems.length ?? 0) <= 0 }, enumerable: true, }, }), [response] ) }, }