import type { SWRHook } from '@commerce/utils/types' import useCustomer from '@commerce/customer/use-customer' import type { UseCustomer } from '@commerce/customer/use-customer' import type { CustomerHook } from '@commerce/types/customer' import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' import type { GraphQLFetcherResult } from '@commerce/api' import type { IAccount } from '@spree/storefront-api-v2-sdk/types/interfaces/Account' import { FetcherError } from '@commerce/utils/errors' import normalizeUser from '../utils/normalizations/normalize-user' import isLoggedIn from '../utils/tokens/is-logged-in' import ensureIToken from '../utils/tokens/ensure-itoken' export default useCustomer as UseCustomer export const handler: SWRHook = { // Provide fetchOptions for SWR cache key fetchOptions: { url: 'account', query: 'get', }, async fetcher({ input, options, fetch }) { console.info( 'useCustomer fetcher called. Configuration: ', 'input: ', input, 'options: ', options ) if (!isLoggedIn()) { return null } const token: IToken | undefined = ensureIToken() if (!token) { return null } try { const { data: spreeAccountInfoSuccessResponse } = await fetch< GraphQLFetcherResult >({ variables: { methodPath: 'account.accountInfo', arguments: [token], }, }) const spreeUser = spreeAccountInfoSuccessResponse.data const normalizedUser = normalizeUser( spreeAccountInfoSuccessResponse, spreeUser ) return normalizedUser } catch (fetchUserError) { if ( !(fetchUserError instanceof FetcherError) || fetchUserError.status !== 404 ) { throw fetchUserError } return null } }, useHook: ({ useData }) => { const useWrappedHook: ReturnType['useHook']> = ( input ) => { return useData({ swrOptions: { revalidateOnFocus: false, ...input?.swrOptions, }, }) } return useWrappedHook }, }