From ed4404ac20a98098922710359a62f9b8c58bbc8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lar=C3=ADcia=20Mota?= Date: Mon, 20 Nov 2023 10:48:01 -0300 Subject: [PATCH 1/3] Add clearOrderFormMessages req --- .../platforms/vtex/clients/commerce/index.ts | 11 +++++++++++ .../platforms/vtex/resolvers/validateCart.ts | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/packages/api/src/platforms/vtex/clients/commerce/index.ts b/packages/api/src/platforms/vtex/clients/commerce/index.ts index f897c6dd2b..6c9e93cdc3 100644 --- a/packages/api/src/platforms/vtex/clients/commerce/index.ts +++ b/packages/api/src/platforms/vtex/clients/commerce/index.ts @@ -163,6 +163,17 @@ export const VtexCommerce = ( requestInit ) }, + + clearOrderFormMessages: ({ id }: { id: string }) => { + return fetchAPI( + `${base}/api/checkout/pub/orderForm/${id}/messages/clear`, + { + ...BASE_INIT, + body: '{}', + } + ) + }, + updateOrderFormItems: ({ id, orderItems, diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index 50e24985c5..2320252d99 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -214,6 +214,15 @@ const getOrderForm = async (id: string, { clients: { commerce } }: Context) => { }) } +const clearOrderFormMessages = async ( + id: string, + { clients: { commerce } }: Context +) => { + return commerce.checkout.clearOrderFormMessages({ + id, + }) +} + const updateOrderFormShippingData = async ( orderForm: OrderForm, session: Maybe | undefined, @@ -310,6 +319,11 @@ export const validateCart = async ( // Step1: Get OrderForm from VTEX Commerce const orderForm = await getOrderForm(orderNumber, ctx) + // Clear messages so it doesn't keep populating toasts on a loop + if (orderForm.messages.length !== 0) { + await clearOrderFormMessages(orderNumber, ctx) + } + // Step1.5: Check if another system changed the orderForm with this orderNumber // If so, this means the user interacted with this cart elsewhere and expects // to see this new cart state instead of what's stored on the user's browser. @@ -386,6 +400,10 @@ export const validateCart = async ( .then((form: OrderForm) => setOrderFormEtag(form, commerce)) .then(joinItems) + if (orderForm.messages.length !== updatedOrderForm.messages.length) { + return orderFormToCart(updatedOrderForm, skuLoader) + } + // Step5: If no changes detected before/after updating orderForm, the order is validated if (equals(order, updatedOrderForm)) { return null From 8f35fa677075c28e61f1d79c7c4007c974749c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lar=C3=ADcia=20Mota?= Date: Tue, 21 Nov 2023 16:20:58 -0300 Subject: [PATCH 2/3] Compare messages --- .../api/src/platforms/vtex/resolvers/validateCart.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/api/src/platforms/vtex/resolvers/validateCart.ts b/packages/api/src/platforms/vtex/resolvers/validateCart.ts index 2320252d99..15ce2a2911 100644 --- a/packages/api/src/platforms/vtex/resolvers/validateCart.ts +++ b/packages/api/src/platforms/vtex/resolvers/validateCart.ts @@ -320,6 +320,7 @@ export const validateCart = async ( const orderForm = await getOrderForm(orderNumber, ctx) // Clear messages so it doesn't keep populating toasts on a loop + // In the next validateCart mutation it will only have messages if a new message is created on orderForm if (orderForm.messages.length !== 0) { await clearOrderFormMessages(orderNumber, ctx) } @@ -400,12 +401,13 @@ export const validateCart = async ( .then((form: OrderForm) => setOrderFormEtag(form, commerce)) .then(joinItems) - if (orderForm.messages.length !== updatedOrderForm.messages.length) { - return orderFormToCart(updatedOrderForm, skuLoader) - } + const equalMessages = deepEquals( + orderForm.messages, + updatedOrderForm.messages + ) // Step5: If no changes detected before/after updating orderForm, the order is validated - if (equals(order, updatedOrderForm)) { + if (equals(order, updatedOrderForm) && equalMessages) { return null } // Step6: There were changes, convert orderForm to StoreCart From 6974ce17e112fad2d1a37190aac9672b1750baeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lar=C3=ADcia=20Mota?= Date: Wed, 22 Nov 2023 11:17:49 -0300 Subject: [PATCH 3/3] Do not push duplicate toasts --- packages/components/src/hooks/UIProvider.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/components/src/hooks/UIProvider.tsx b/packages/components/src/hooks/UIProvider.tsx index e222b1c36f..9e72fe8ff8 100644 --- a/packages/components/src/hooks/UIProvider.tsx +++ b/packages/components/src/hooks/UIProvider.tsx @@ -66,6 +66,16 @@ const reducer = (state: State, action: Action): State => { } case 'pushToast': { + const isDuplicate = state.toasts.some( + (existingToast) => + existingToast.message === action.payload.message && + existingToast.status === action.payload.status + ) + + if (isDuplicate) { + return state + } + return { ...state, toasts: [...state.toasts, action.payload],