import { HookFetcher } from '@commerce/utils/types' import useData, { SwrOptions } from '@commerce/utils/use-data' import useResponse from '@commerce/utils/use-response' import { cartFragment } from '../api/fragments/cart' import { CartFragment } from '../schema' import { normalizeCart } from '@framework/lib/normalize' export const getCartQuery = /* GraphQL */ ` query activeOrder { activeOrder { ...Cart } } ${cartFragment} ` export const fetcher: HookFetcher = ( options, input, fetch ) => { return fetch({ ...options, query: getCartQuery }) } export type CartResult = { activeOrder?: CartFragment; addItemToOrder?: CartFragment; adjustOrderLine?: CartFragment; removeOrderLine?: CartFragment; } export function extendHook( customFetcher: typeof fetcher, swrOptions?: SwrOptions ) { const useCart = () => { const response = useData({ query: getCartQuery }, [], customFetcher, swrOptions) const res = useResponse(response, { normalizer: (data => { const order = data?.activeOrder || data?.addItemToOrder || data?.adjustOrderLine || data?.removeOrderLine; return (order ? normalizeCart(order) : null) }), descriptors: { isEmpty: { get() { return response.data?.activeOrder?.totalQuantity === 0 }, enumerable: true } } }) return res } useCart.extend = extendHook return useCart } export default extendHook(fetcher)