import { MutationHook } from '@commerce/utils/types'; import useLogout, { UseLogout } from '@commerce/auth/use-logout'; import type { LogoutHook } from '@commerce/types/logout'; import { useCallback } from 'react'; import useCustomer from '../customer/use-customer'; import useCart from '../cart/use-cart'; import useWishlist from '../wishlist/use-wishlist'; import { ensureUserTokenResponse, removeUserTokenResponse } from '../utils/tokens/user-token-response'; import revokeUserTokens from '../utils/tokens/revoke-user-tokens'; import TokensNotRejectedError from '../errors/TokensNotRejectedError'; export default useLogout as UseLogout; export const handler: MutationHook = { // Provide fetchOptions for SWR cache key fetchOptions: { url: 'authentication', query: 'revokeToken' }, async fetcher({ input, options, fetch }) { console.info( 'useLogout fetcher called. Configuration: ', 'input: ', input, 'options: ', options ); const userToken = ensureUserTokenResponse(); if (userToken) { try { // Revoke any tokens associated with the logged in user. await revokeUserTokens(fetch, { accessToken: userToken.access_token, refreshToken: userToken.refresh_token }); } catch (revokeUserTokenError) { // Squash token revocation errors and rethrow anything else. if (!(revokeUserTokenError instanceof TokensNotRejectedError)) { throw revokeUserTokenError; } } // Whether token revocation succeeded or not, remove them from local storage. removeUserTokenResponse(); } return null; }, useHook: ({ fetch }) => { const useWrappedHook: ReturnType['useHook']> = () => { const customer = useCustomer({ swrOptions: { isPaused: () => true } }); const cart = useCart({ swrOptions: { isPaused: () => true } }); const wishlist = useWishlist({ swrOptions: { isPaused: () => true } }); return useCallback(async () => { const data = await fetch(); await customer.mutate(null, false); await cart.mutate(null, false); await wishlist.mutate(null, false); return data; }, [customer, cart, wishlist]); }; return useWrappedHook; } };