From ed95c423ae375af59d01ea43f43d14a9936848a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Dro=C5=84?= Date: Thu, 15 Sep 2022 11:45:46 +0200 Subject: [PATCH] Remove errors on fulfilling insufficient stock (#2298) * Add error handling override for queries * Handle errors in order fulfill view * Handle errors in order details view * Disable errors in approval mutation --- src/hooks/makeMutation.ts | 59 +++++++++++-------- src/orders/containers/OrderOperations.tsx | 1 + .../OrderDetails/OrderDetailsMessages.tsx | 48 ++++++++------- .../views/OrderFulfill/OrderFulfill.tsx | 10 ++++ 4 files changed, 72 insertions(+), 46 deletions(-) diff --git a/src/hooks/makeMutation.ts b/src/hooks/makeMutation.ts index e28d2c58f..1b704099a 100644 --- a/src/hooks/makeMutation.ts +++ b/src/hooks/makeMutation.ts @@ -34,11 +34,16 @@ export type UseMutationHook = ( export type MutationHookOptions = BaseMutationHookOptions< TData, TVariables ->; +> & { disableErrorHandling?: boolean }; export function useMutation( mutation: DocumentNode, - { onCompleted, onError, ...opts }: MutationHookOptions, + { + onCompleted, + onError, + disableErrorHandling, + ...opts + }: MutationHookOptions, ): UseMutation { const notify = useNotifier(); const intl = useIntl(); @@ -47,39 +52,43 @@ export function useMutation( const [mutateFn, result] = useBaseMutation(mutation, { ...opts, onCompleted: data => { - handleNestedMutationErrors({ - data, - intl, - notify, - }); + if (!disableErrorHandling) { + handleNestedMutationErrors({ + data, + intl, + notify, + }); + } if (onCompleted) { onCompleted(data); } }, onError: (err: ApolloError) => { - if (err.graphQLErrors) { - if (hasError(err, GqlErrors.ReadOnlyException)) { - notify({ - status: "error", - text: intl.formatMessage(commonMessages.readOnly), - }); - } else if (err.graphQLErrors.some(isJwtError)) { - user.logout(); - notify({ - status: "error", - text: intl.formatMessage(commonMessages.sessionExpired), - }); - } else if (!hasError(err, GqlErrors.LimitReachedException)) { - err.graphQLErrors.map(graphQLError => { + if (!disableErrorHandling) { + if (err.graphQLErrors) { + if (hasError(err, GqlErrors.ReadOnlyException)) { notify({ status: "error", - apiMessage: graphQLError.message, + text: intl.formatMessage(commonMessages.readOnly), }); - }); + } else if (err.graphQLErrors.some(isJwtError)) { + user.logout(); + notify({ + status: "error", + text: intl.formatMessage(commonMessages.sessionExpired), + }); + } else if (!hasError(err, GqlErrors.LimitReachedException)) { + err.graphQLErrors.map(graphQLError => { + notify({ + status: "error", + apiMessage: graphQLError.message, + }); + }); + } + } else { + showAllErrors({ notify, error: err }); } - } else { - showAllErrors({ notify, error: err }); } if (onError) { diff --git a/src/orders/containers/OrderOperations.tsx b/src/orders/containers/OrderOperations.tsx index 867fd0aa8..d9795bd00 100644 --- a/src/orders/containers/OrderOperations.tsx +++ b/src/orders/containers/OrderOperations.tsx @@ -210,6 +210,7 @@ const OrderOperations: React.FC = ({ }); const approveFulfillment = useOrderFulfillmentApproveMutation({ onCompleted: onOrderFulfillmentApprove, + disableErrorHandling: true, }); const cancelFulfillment = useOrderFulfillmentCancelMutation({ onCompleted: onOrderFulfillmentCancel, diff --git a/src/orders/views/OrderDetails/OrderDetailsMessages.tsx b/src/orders/views/OrderDetails/OrderDetailsMessages.tsx index 5626d860c..3e0018d0a 100644 --- a/src/orders/views/OrderDetails/OrderDetailsMessages.tsx +++ b/src/orders/views/OrderDetails/OrderDetailsMessages.tsx @@ -1,3 +1,4 @@ +import { handleNestedMutationErrors } from "@saleor/auth"; import messages from "@saleor/containers/BackgroundTasks/messages"; import { InvoiceEmailSendMutation, @@ -8,6 +9,7 @@ import { OrderDraftCancelMutation, OrderDraftFinalizeMutation, OrderDraftUpdateMutation, + OrderErrorCode, OrderFulfillmentApproveMutation, OrderFulfillmentCancelMutation, OrderFulfillmentUpdateTrackingMutation, @@ -68,7 +70,7 @@ export const OrderDetailsMessages: React.FC = ({ params, }) => { const navigate = useNavigator(); - const pushMessage = useNotifier(); + const notify = useNotifier(); const intl = useIntl(); const [, closeModal] = createDialogActionHandlers( @@ -80,7 +82,7 @@ export const OrderDetailsMessages: React.FC = ({ const handlePaymentCapture = (data: OrderCaptureMutation) => { const errs = data.orderCapture?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "9RCuN3", @@ -93,7 +95,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleOrderMarkAsPaid = (data: OrderMarkAsPaidMutation) => { const errs = data.orderMarkAsPaid?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "lL1HTg", @@ -106,7 +108,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleOrderCancel = (data: OrderCancelMutation) => { const errs = data.orderCancel?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "W/Es0H", @@ -119,7 +121,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleDraftCancel = (data: OrderDraftCancelMutation) => { const errs = data.draftOrderDelete?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "W/Es0H", @@ -132,7 +134,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleOrderVoid = (data: OrderVoidMutation) => { const errs = data.orderVoid?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "L87bp7", @@ -145,7 +147,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleNoteAdd = (data: OrderAddNoteMutation) => { const errs = data.orderAddNote?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "KmPicj", @@ -157,7 +159,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleUpdate = (data: OrderUpdateMutation) => { const errs = data.orderUpdate?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "j2fPVo", @@ -170,7 +172,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleDraftUpdate = (data: OrderDraftUpdateMutation) => { const errs = data.draftOrderUpdate?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "j2fPVo", @@ -185,7 +187,7 @@ export const OrderDetailsMessages: React.FC = ({ ) => { const errs = data.orderUpdateShipping?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "7U8GRy", @@ -198,7 +200,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleOrderLineDelete = (data: OrderLineDeleteMutation) => { const errs = data.orderLineDelete?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "9OtpHt", @@ -210,7 +212,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleOrderLinesAdd = (data: OrderLinesAddMutation) => { const errs = data.orderLinesCreate?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "HlCkMT", @@ -223,7 +225,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleOrderLineUpdate = (data: OrderLineUpdateMutation) => { const errs = data.orderLineUpdate?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "Fn3bE0", @@ -232,7 +234,7 @@ export const OrderDetailsMessages: React.FC = ({ }); } else { errs.forEach(error => - pushMessage({ + notify({ status: "error", text: getOrderErrorMessage(error, intl), }), @@ -244,7 +246,7 @@ export const OrderDetailsMessages: React.FC = ({ ) => { const errs = data.orderFulfillmentApprove?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "+sX7yS", @@ -252,6 +254,10 @@ export const OrderDetailsMessages: React.FC = ({ }), }); closeModal(); + } else { + if (!errs.every(err => err.code === OrderErrorCode.INSUFFICIENT_STOCK)) { + handleNestedMutationErrors({ data, intl, notify }); + } } }; const handleOrderFulfillmentCancel = ( @@ -259,7 +265,7 @@ export const OrderDetailsMessages: React.FC = ({ ) => { const errs = data.orderFulfillmentCancel?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "uMpv1v", @@ -274,7 +280,7 @@ export const OrderDetailsMessages: React.FC = ({ ) => { const errs = data.orderFulfillmentUpdateTracking?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "CZmloB", @@ -287,7 +293,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleDraftFinalize = (data: OrderDraftFinalizeMutation) => { const errs = data.draftOrderComplete?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage({ id: "c4gbXr", @@ -299,7 +305,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleInvoiceGeneratePending = (data: InvoiceRequestMutation) => { const errs = data.invoiceRequest?.errors; if (errs.length === 0) { - pushMessage({ + notify({ text: intl.formatMessage({ id: "ND5x+V", defaultMessage: @@ -316,7 +322,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleInvoiceGenerateFinished = (data: InvoiceRequestMutation) => { const errs = data.invoiceRequest?.errors; if (errs.length === 0) { - pushMessage({ + notify({ status: "success", text: intl.formatMessage(messages.invoiceGenerateFinishedText), title: intl.formatMessage(messages.invoiceGenerateFinishedTitle), @@ -327,7 +333,7 @@ export const OrderDetailsMessages: React.FC = ({ const handleInvoiceSend = (data: InvoiceEmailSendMutation) => { const errs = data.invoiceSendNotification?.errors; if (errs.length === 0) { - pushMessage({ + notify({ text: intl.formatMessage({ id: "3u+4NZ", defaultMessage: "Invoice email sent", diff --git a/src/orders/views/OrderFulfill/OrderFulfill.tsx b/src/orders/views/OrderFulfill/OrderFulfill.tsx index 11dcd11ef..79aa63754 100644 --- a/src/orders/views/OrderFulfill/OrderFulfill.tsx +++ b/src/orders/views/OrderFulfill/OrderFulfill.tsx @@ -1,3 +1,4 @@ +import { handleNestedMutationErrors } from "@saleor/auth"; import { WindowTitle } from "@saleor/components/WindowTitle"; import { useFulfillOrderMutation, @@ -59,8 +60,17 @@ const OrderFulfill: React.FC = ({ orderId, params }) => { description: "order fulfilled success message", }), }); + } else { + if ( + !data.orderFulfill.errors.every( + err => err.code === "INSUFFICIENT_STOCK", + ) + ) { + handleNestedMutationErrors({ data, intl, notify }); + } } }, + disableErrorHandling: true, }); return (