mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 23:46:58 +00:00
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import type { GraphQLFetcherResult } from '@vercel/commerce/api'
|
|
import type { HookFetcherContext } from '@vercel/commerce/utils/types'
|
|
import type { AuthTokenAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Authentication'
|
|
import type { AssociateCart } from '@spree/storefront-api-v2-sdk/types/interfaces/endpoints/CartClass'
|
|
import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order'
|
|
import type {
|
|
IOAuthToken,
|
|
IToken,
|
|
} from '@spree/storefront-api-v2-sdk/types/interfaces/Token'
|
|
import { getCartToken, removeCartToken } from './tokens/cart-token'
|
|
import { setUserTokenResponse } from './tokens/user-token-response'
|
|
|
|
const login = async (
|
|
fetch: HookFetcherContext<{
|
|
data: any
|
|
}>['fetch'],
|
|
getTokenParameters: AuthTokenAttr,
|
|
associateGuestCart: boolean
|
|
): Promise<void> => {
|
|
const { data: spreeGetTokenSuccessResponse } = await fetch<
|
|
GraphQLFetcherResult<IOAuthToken>
|
|
>({
|
|
variables: {
|
|
methodPath: 'authentication.getToken',
|
|
arguments: [getTokenParameters],
|
|
},
|
|
})
|
|
|
|
setUserTokenResponse(spreeGetTokenSuccessResponse)
|
|
|
|
if (associateGuestCart) {
|
|
const cartToken = getCartToken()
|
|
|
|
if (cartToken) {
|
|
// If the user had a cart as guest still use its contents
|
|
// after logging in.
|
|
const accessToken = spreeGetTokenSuccessResponse.access_token
|
|
const token: IToken = { bearerToken: accessToken }
|
|
|
|
const associateGuestCartParameters: AssociateCart = {
|
|
guest_order_token: cartToken,
|
|
}
|
|
|
|
await fetch<GraphQLFetcherResult<IOrder>>({
|
|
variables: {
|
|
methodPath: 'cart.associateGuestCart',
|
|
arguments: [token, associateGuestCartParameters],
|
|
},
|
|
})
|
|
|
|
// We no longer need the guest cart token, so let's remove it.
|
|
}
|
|
}
|
|
|
|
removeCartToken()
|
|
}
|
|
|
|
export default login
|