import { useMemo } from 'react'; import type { SWRHook } from '@commerce/utils/types'; import useWishlist from '@commerce/wishlist/use-wishlist'; import type { UseWishlist } from '@commerce/wishlist/use-wishlist'; import type { GetWishlistHook } from '@commerce/types/wishlist'; import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token'; import type { GraphQLFetcherResult } from '@commerce/api'; import type { Wishlist } from '@spree/storefront-api-v2-sdk/types/interfaces/Wishlist'; import ensureIToken from '../utils/tokens/ensure-itoken'; import normalizeWishlist from '../utils/normalizations/normalize-wishlist'; import isLoggedIn from '../utils/tokens/is-logged-in'; export default useWishlist as UseWishlist; export const handler: SWRHook = { // Provide fetchOptions for SWR cache key fetchOptions: { url: 'wishlists', query: 'default' }, async fetcher({ input, options, fetch }) { console.info( 'useWishlist fetcher called. Configuration: ', 'input: ', input, 'options: ', options ); if (!isLoggedIn()) { return null; } // TODO: Optimize with includeProducts. const token: IToken | undefined = ensureIToken(); const { data: spreeWishlistsDefaultSuccessResponse } = await fetch< GraphQLFetcherResult >({ variables: { methodPath: 'wishlists.default', arguments: [ token, { include: [ 'wished_items', 'wished_items.variant', 'wished_items.variant.product', 'wished_items.variant.product.primary_variant', 'wished_items.variant.product.images', 'wished_items.variant.product.option_types', 'wished_items.variant.product.variants', 'wished_items.variant.product.variants.option_values' ].join(',') } ] } }); return normalizeWishlist( spreeWishlistsDefaultSuccessResponse, spreeWishlistsDefaultSuccessResponse.data ); }, useHook: ({ useData }) => { const useWrappedHook: ReturnType['useHook']> = (input) => { const response = useData({ swrOptions: { revalidateOnFocus: false, ...input?.swrOptions } }); return useMemo( () => Object.create(response, { isEmpty: { get() { return (response.data?.items?.length || 0) <= 0; }, enumerable: true } }), [response] ); }; return useWrappedHook; } };