forked from crowetic/commerce
* Minimal list/detail views working with Vendure * Implement useCart/useAddItem * Implement useUpdateItem & useRemoveItem * Implement useSearch * Add operations codegen, tidy up * Dummy checkout page * Implement auth/customer hooks * Use env var for Shop API url * Add some documentation * Improve error handling * Optimize preview image size * Fix accidental change * Update Vendure provider to latest changes * Vendure provider: split out gql operations, remove unused files * Update Vendure provider readme * Add local next.config to Vendure provider, update docs * Update to use demo server * Fix build errors * Use proxy for vendure api * Simplify instructions in Vendure readme * Refactor Vendure checkout api handler * Improve image quality
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { Cart } from '@commerce/types'
|
|
import { SWRHook } from '@commerce/utils/types'
|
|
import useCart, { FetchCartInput, UseCart } from '@commerce/cart/use-cart'
|
|
import { ActiveOrderQuery, CartFragment } from '../schema'
|
|
import { normalizeCart } from '../lib/normalize'
|
|
import { useMemo } from 'react'
|
|
import { getCartQuery } from '../lib/queries/get-cart-query'
|
|
|
|
export type CartResult = {
|
|
activeOrder?: CartFragment
|
|
addItemToOrder?: CartFragment
|
|
adjustOrderLine?: CartFragment
|
|
removeOrderLine?: CartFragment
|
|
}
|
|
|
|
export default useCart as UseCart<typeof handler>
|
|
|
|
export const handler: SWRHook<
|
|
Cart | null,
|
|
{},
|
|
FetchCartInput,
|
|
{ isEmpty?: boolean }
|
|
> = {
|
|
fetchOptions: {
|
|
query: getCartQuery,
|
|
},
|
|
async fetcher({ input: { cartId }, options, fetch }) {
|
|
const { activeOrder } = await fetch<ActiveOrderQuery>(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]
|
|
)
|
|
},
|
|
}
|