fix cart update and add API calls to work for logged-in users

Signed-off-by: Loan Laux <loan@outgrow.io>
This commit is contained in:
Loan Laux 2021-04-27 18:40:02 +04:00
parent 3563e93a3b
commit f52978e1a3
No known key found for this signature in database
GPG Key ID: AF9E9BD6548AD52E
9 changed files with 70 additions and 35 deletions

View File

@ -6,14 +6,16 @@ import {
import getCartCookie from '@framework/api/utils/get-cart-cookie' import getCartCookie from '@framework/api/utils/get-cart-cookie'
import { import {
REACTION_ANONYMOUS_CART_TOKEN_COOKIE, REACTION_ANONYMOUS_CART_TOKEN_COOKIE,
REACTION_ANONYMOUS_CART_ID_COOKIE, REACTION_CART_ID_COOKIE,
REACTION_CUSTOMER_TOKEN_COOKIE,
} from '@framework/const' } from '@framework/const'
const addItem: CartHandlers['addItem'] = async ({ const addItem: CartHandlers['addItem'] = async ({
req: { req: {
cookies: { cookies: {
[REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken, [REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken,
[REACTION_ANONYMOUS_CART_ID_COOKIE]: cartId, [REACTION_CART_ID_COOKIE]: cartId,
[REACTION_CUSTOMER_TOKEN_COOKIE]: reactionCustomerToken,
}, },
}, },
res, res,
@ -23,6 +25,13 @@ const addItem: CartHandlers['addItem'] = async ({
console.log('add-item API', item.productId) console.log('add-item API', item.productId)
console.log('variantId', item.variantId) console.log('variantId', item.variantId)
if (!cartId) {
return res.status(400).json({
data: null,
errors: [{ message: 'Missing cartId cookie' }],
})
}
if (!item) { if (!item) {
return res.status(400).json({ return res.status(400).json({
data: null, data: null,
@ -60,18 +69,34 @@ const addItem: CartHandlers['addItem'] = async ({
999 999
), ),
getCartCookie( getCartCookie(
config.anonymousCartIdCookie, config.cartIdCookie,
createdCart.data.createCart.cart._id, createdCart.data.createCart.cart._id,
999 999
), ),
]) ])
return res.status(200).json(createdCart.data) return res.status(200).json(createdCart.data)
} else if (cartId && anonymousCartToken) { }
const updatedCart = await config.fetch(addCartItemsMutation, {
const anonymousTokenParam = <any>{}
const authorizationHeaderParam = <any>{}
if (anonymousCartToken) {
anonymousTokenParam.cartToken = anonymousCartToken
}
if (reactionCustomerToken) {
authorizationHeaderParam[
'Authorization'
] = `Bearer ${reactionCustomerToken}`
}
const updatedCart = await config.fetch(
addCartItemsMutation,
{
variables: { variables: {
input: { input: {
cartId, cartId,
cartToken: anonymousCartToken, ...anonymousTokenParam,
items: [ items: [
{ {
productConfiguration: { productConfiguration: {
@ -84,14 +109,17 @@ const addItem: CartHandlers['addItem'] = async ({
], ],
}, },
}, },
}) },
{
headers: {
...authorizationHeaderParam,
},
}
)
console.log('updatedCart', updatedCart) console.log('updatedCart', updatedCart)
return res.status(200).json(updatedCart.data) return res.status(200).json(updatedCart.data)
}
res.status(200)
} }
export default addItem export default addItem

View File

@ -7,7 +7,7 @@ import getCartCookie from '@framework/api/utils/get-cart-cookie'
import getViewerId from '@framework/customer/get-viewer-id' import getViewerId from '@framework/customer/get-viewer-id'
import { import {
REACTION_ANONYMOUS_CART_TOKEN_COOKIE, REACTION_ANONYMOUS_CART_TOKEN_COOKIE,
REACTION_ANONYMOUS_CART_ID_COOKIE, REACTION_CART_ID_COOKIE,
REACTION_CUSTOMER_TOKEN_COOKIE, REACTION_CUSTOMER_TOKEN_COOKIE,
} from '@framework/const.ts' } from '@framework/const.ts'
import { normalizeCart } from '@framework/utils' import { normalizeCart } from '@framework/utils'
@ -17,14 +17,14 @@ const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => {
const { const {
cookies: { cookies: {
[REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken, [REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken,
[REACTION_ANONYMOUS_CART_ID_COOKIE]: anonymousCartId, [REACTION_CART_ID_COOKIE]: cartId,
[REACTION_CUSTOMER_TOKEN_COOKIE]: reactionCustomerToken, [REACTION_CUSTOMER_TOKEN_COOKIE]: reactionCustomerToken,
}, },
} = req } = req
let normalizedCart let normalizedCart
if (anonymousCartId && anonymousCartToken && reactionCustomerToken) { if (cartId && anonymousCartToken && reactionCustomerToken) {
const { const {
data: { data: {
reconcileCarts: { cart: rawReconciledCart }, reconcileCarts: { cart: rawReconciledCart },
@ -34,7 +34,7 @@ const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => {
{ {
variables: { variables: {
input: { input: {
anonymousCartId, anonymousCartId: cartId,
cartToken: anonymousCartToken, cartToken: anonymousCartToken,
shopId: config.shopId, shopId: config.shopId,
}, },
@ -49,23 +49,23 @@ const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => {
normalizedCart = normalizeCart(rawReconciledCart) normalizedCart = normalizeCart(rawReconciledCart)
// Clear the anonymous cart cookies, as we're now using an account-tied cart // Clear the anonymous cart token cookie and update cart ID cookie
res.setHeader('Set-Cookie', [ res.setHeader('Set-Cookie', [
getCartCookie(config.anonymousCartTokenCookie), getCartCookie(config.anonymousCartTokenCookie),
getCartCookie(config.anonymousCartIdCookie), getCartCookie(config.cartIdCookie, normalizedCart.id, 999),
]) ])
} else if (anonymousCartId && anonymousCartToken) { } else if (cartId && anonymousCartToken) {
const { const {
data: { cart: rawAnonymousCart }, data: { cart: rawAnonymousCart },
} = await config.fetch(getAnomymousCartQuery, { } = await config.fetch(getAnomymousCartQuery, {
variables: { variables: {
cartId: anonymousCartId, cartId,
cartToken: anonymousCartToken, cartToken: anonymousCartToken,
}, },
}) })
normalizedCart = normalizeCart(rawAnonymousCart) normalizedCart = normalizeCart(rawAnonymousCart)
} else if (reactionCustomerToken && !anonymousCartToken && !anonymousCartId) { } else if (reactionCustomerToken && !anonymousCartToken) {
const accountId = await getViewerId({ const accountId = await getViewerId({
customerToken: reactionCustomerToken, customerToken: reactionCustomerToken,
config, config,
@ -89,11 +89,18 @@ const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => {
) )
normalizedCart = normalizeCart(rawAccountCart) normalizedCart = normalizeCart(rawAccountCart)
if (cartId !== normalizedCart.id) {
res.setHeader(
'Set-Cookie',
getCartCookie(config.cartIdCookie, rawAccountCart._id, 999)
)
}
} else { } else {
// If there's no cart for now, return a dummy cart ID to keep Next Commerce happy // If there's no cart for now, store a dummy cart ID to keep Next Commerce happy
res.setHeader( res.setHeader(
'Set-Cookie', 'Set-Cookie',
getCartCookie(config.anonymousCartIdCookie, config.dummyEmptyCartId, 999) getCartCookie(config.cartIdCookie, config.dummyEmptyCartId, 999)
) )
} }

View File

@ -3,7 +3,7 @@ import type { CommerceAPIConfig } from '@commerce/api'
import { import {
API_URL, API_URL,
REACTION_ANONYMOUS_CART_TOKEN_COOKIE, REACTION_ANONYMOUS_CART_TOKEN_COOKIE,
REACTION_ANONYMOUS_CART_ID_COOKIE, REACTION_CART_ID_COOKIE,
REACTION_EMPTY_DUMMY_CART_ID, REACTION_EMPTY_DUMMY_CART_ID,
REACTION_CUSTOMER_TOKEN_COOKIE, REACTION_CUSTOMER_TOKEN_COOKIE,
REACTION_COOKIE_EXPIRE, REACTION_COOKIE_EXPIRE,
@ -43,7 +43,7 @@ const config = new Config({
locale: 'en-US', locale: 'en-US',
commerceUrl: API_URL, commerceUrl: API_URL,
anonymousCartTokenCookie: REACTION_ANONYMOUS_CART_TOKEN_COOKIE, anonymousCartTokenCookie: REACTION_ANONYMOUS_CART_TOKEN_COOKIE,
anonymousCartIdCookie: REACTION_ANONYMOUS_CART_ID_COOKIE, cartIdCookie: REACTION_CART_ID_COOKIE,
dummyEmptyCartId: REACTION_EMPTY_DUMMY_CART_ID, dummyEmptyCartId: REACTION_EMPTY_DUMMY_CART_ID,
anonymousCartTokenCookieMaxAge: REACTION_COOKIE_EXPIRE, anonymousCartTokenCookieMaxAge: REACTION_COOKIE_EXPIRE,
fetch: fetchGraphqlApi, fetch: fetchGraphqlApi,

View File

@ -16,7 +16,7 @@ import useCart from './use-cart'
import { import {
removeCartItemsMutation, removeCartItemsMutation,
getAnonymousCartToken, getAnonymousCartToken,
getCartId, getAnonymousCartId,
normalizeCart, normalizeCart,
} from '../utils' } from '../utils'
import { Cart, LineItem } from '../types' import { Cart, LineItem } from '../types'
@ -49,7 +49,7 @@ export const handler = {
...options, ...options,
variables: { variables: {
input: { input: {
cartId: getCartId(), cartId: getAnonymousCartId(),
cartToken: getAnonymousCartToken(), cartToken: getAnonymousCartToken(),
cartItemIds: [itemId], cartItemIds: [itemId],
}, },

View File

@ -15,7 +15,7 @@ import { handler as removeItemHandler } from './use-remove-item'
import type { Cart, LineItem, UpdateCartItemBody } from '../types' import type { Cart, LineItem, UpdateCartItemBody } from '../types'
import { import {
getAnonymousCartToken, getAnonymousCartToken,
getCartId, getAnonymousCartId,
updateCartItemsQuantityMutation, updateCartItemsQuantityMutation,
normalizeCart, normalizeCart,
} from '../utils' } from '../utils'
@ -59,7 +59,7 @@ export const handler = {
...options, ...options,
variables: { variables: {
updateCartItemsQuantityInput: { updateCartItemsQuantityInput: {
cartId: getCartId(), cartId: getAnonymousCartId(),
cartToken: getAnonymousCartToken(), cartToken: getAnonymousCartToken(),
items: [ items: [
{ {

View File

@ -1,7 +1,7 @@
export const REACTION_ANONYMOUS_CART_TOKEN_COOKIE = export const REACTION_ANONYMOUS_CART_TOKEN_COOKIE =
'reaction_anonymousCartToken' 'reaction_anonymousCartToken'
export const REACTION_ANONYMOUS_CART_ID_COOKIE = 'reaction_cartId' export const REACTION_CART_ID_COOKIE = 'reaction_cartId'
export const REACTION_EMPTY_DUMMY_CART_ID = 'DUMMY_EMPTY_CART_ID' export const REACTION_EMPTY_DUMMY_CART_ID = 'DUMMY_EMPTY_CART_ID'

View File

@ -1,6 +1,6 @@
import { import {
REACTION_ANONYMOUS_CART_TOKEN_COOKIE, REACTION_ANONYMOUS_CART_TOKEN_COOKIE,
REACTION_ANONYMOUS_CART_ID_COOKIE, REACTION_CART_ID_COOKIE,
STORE_DOMAIN, STORE_DOMAIN,
} from './const' } from './const'
@ -21,7 +21,7 @@ import fetcher from './fetcher'
export const reactionCommerceProvider = { export const reactionCommerceProvider = {
locale: 'en-us', locale: 'en-us',
anonymousCartTokenCookie: REACTION_ANONYMOUS_CART_TOKEN_COOKIE, anonymousCartTokenCookie: REACTION_ANONYMOUS_CART_TOKEN_COOKIE,
anonymousCartIdCookie: REACTION_ANONYMOUS_CART_ID_COOKIE, cartIdCookie: REACTION_CART_ID_COOKIE,
storeDomain: STORE_DOMAIN, storeDomain: STORE_DOMAIN,
fetcher, fetcher,
cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, cart: { useCart, useAddItem, useUpdateItem, useRemoveItem },

View File

@ -1,8 +1,8 @@
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
import { REACTION_ANONYMOUS_CART_ID_COOKIE } from '../const' import { REACTION_CART_ID_COOKIE } from '../const'
const getCartId = (id?: string) => { const getCartId = (id?: string) => {
return id ?? Cookies.get(REACTION_ANONYMOUS_CART_ID_COOKIE) return id ?? Cookies.get(REACTION_CART_ID_COOKIE)
} }
export default getCartId export default getCartId

View File

@ -4,7 +4,7 @@ export { default as getSortVariables } from './get-sort-variables'
export { default as getVendors } from './get-vendors' export { default as getVendors } from './get-vendors'
export { default as getCategories } from './get-categories' export { default as getCategories } from './get-categories'
export { default as getAnonymousCartToken } from './get-anonymous-cart-token' export { default as getAnonymousCartToken } from './get-anonymous-cart-token'
export { default as getCartId } from './get-cart-id' export { default as getAnonymousCartId } from './get-cart-id'
export * from './queries' export * from './queries'
export * from './mutations' export * from './mutations'
export * from './normalize' export * from './normalize'