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
This commit is contained in:
parent
7a469029fd
commit
ed95c423ae
4 changed files with 72 additions and 46 deletions
|
@ -34,11 +34,16 @@ export type UseMutationHook<TData, TVariables> = (
|
||||||
export type MutationHookOptions<TData, TVariables> = BaseMutationHookOptions<
|
export type MutationHookOptions<TData, TVariables> = BaseMutationHookOptions<
|
||||||
TData,
|
TData,
|
||||||
TVariables
|
TVariables
|
||||||
>;
|
> & { disableErrorHandling?: boolean };
|
||||||
|
|
||||||
export function useMutation<TData, TVariables>(
|
export function useMutation<TData, TVariables>(
|
||||||
mutation: DocumentNode,
|
mutation: DocumentNode,
|
||||||
{ onCompleted, onError, ...opts }: MutationHookOptions<TData, TVariables>,
|
{
|
||||||
|
onCompleted,
|
||||||
|
onError,
|
||||||
|
disableErrorHandling,
|
||||||
|
...opts
|
||||||
|
}: MutationHookOptions<TData, TVariables>,
|
||||||
): UseMutation<TData, TVariables> {
|
): UseMutation<TData, TVariables> {
|
||||||
const notify = useNotifier();
|
const notify = useNotifier();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
@ -47,39 +52,43 @@ export function useMutation<TData, TVariables>(
|
||||||
const [mutateFn, result] = useBaseMutation(mutation, {
|
const [mutateFn, result] = useBaseMutation(mutation, {
|
||||||
...opts,
|
...opts,
|
||||||
onCompleted: data => {
|
onCompleted: data => {
|
||||||
handleNestedMutationErrors({
|
if (!disableErrorHandling) {
|
||||||
data,
|
handleNestedMutationErrors({
|
||||||
intl,
|
data,
|
||||||
notify,
|
intl,
|
||||||
});
|
notify,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (onCompleted) {
|
if (onCompleted) {
|
||||||
onCompleted(data);
|
onCompleted(data);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onError: (err: ApolloError) => {
|
onError: (err: ApolloError) => {
|
||||||
if (err.graphQLErrors) {
|
if (!disableErrorHandling) {
|
||||||
if (hasError(err, GqlErrors.ReadOnlyException)) {
|
if (err.graphQLErrors) {
|
||||||
notify({
|
if (hasError(err, GqlErrors.ReadOnlyException)) {
|
||||||
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 => {
|
|
||||||
notify({
|
notify({
|
||||||
status: "error",
|
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) {
|
if (onError) {
|
||||||
|
|
|
@ -210,6 +210,7 @@ const OrderOperations: React.FC<OrderOperationsProps> = ({
|
||||||
});
|
});
|
||||||
const approveFulfillment = useOrderFulfillmentApproveMutation({
|
const approveFulfillment = useOrderFulfillmentApproveMutation({
|
||||||
onCompleted: onOrderFulfillmentApprove,
|
onCompleted: onOrderFulfillmentApprove,
|
||||||
|
disableErrorHandling: true,
|
||||||
});
|
});
|
||||||
const cancelFulfillment = useOrderFulfillmentCancelMutation({
|
const cancelFulfillment = useOrderFulfillmentCancelMutation({
|
||||||
onCompleted: onOrderFulfillmentCancel,
|
onCompleted: onOrderFulfillmentCancel,
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { handleNestedMutationErrors } from "@saleor/auth";
|
||||||
import messages from "@saleor/containers/BackgroundTasks/messages";
|
import messages from "@saleor/containers/BackgroundTasks/messages";
|
||||||
import {
|
import {
|
||||||
InvoiceEmailSendMutation,
|
InvoiceEmailSendMutation,
|
||||||
|
@ -8,6 +9,7 @@ import {
|
||||||
OrderDraftCancelMutation,
|
OrderDraftCancelMutation,
|
||||||
OrderDraftFinalizeMutation,
|
OrderDraftFinalizeMutation,
|
||||||
OrderDraftUpdateMutation,
|
OrderDraftUpdateMutation,
|
||||||
|
OrderErrorCode,
|
||||||
OrderFulfillmentApproveMutation,
|
OrderFulfillmentApproveMutation,
|
||||||
OrderFulfillmentCancelMutation,
|
OrderFulfillmentCancelMutation,
|
||||||
OrderFulfillmentUpdateTrackingMutation,
|
OrderFulfillmentUpdateTrackingMutation,
|
||||||
|
@ -68,7 +70,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
params,
|
params,
|
||||||
}) => {
|
}) => {
|
||||||
const navigate = useNavigator();
|
const navigate = useNavigator();
|
||||||
const pushMessage = useNotifier();
|
const notify = useNotifier();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
const [, closeModal] = createDialogActionHandlers(
|
const [, closeModal] = createDialogActionHandlers(
|
||||||
|
@ -80,7 +82,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handlePaymentCapture = (data: OrderCaptureMutation) => {
|
const handlePaymentCapture = (data: OrderCaptureMutation) => {
|
||||||
const errs = data.orderCapture?.errors;
|
const errs = data.orderCapture?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "9RCuN3",
|
id: "9RCuN3",
|
||||||
|
@ -93,7 +95,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleOrderMarkAsPaid = (data: OrderMarkAsPaidMutation) => {
|
const handleOrderMarkAsPaid = (data: OrderMarkAsPaidMutation) => {
|
||||||
const errs = data.orderMarkAsPaid?.errors;
|
const errs = data.orderMarkAsPaid?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "lL1HTg",
|
id: "lL1HTg",
|
||||||
|
@ -106,7 +108,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleOrderCancel = (data: OrderCancelMutation) => {
|
const handleOrderCancel = (data: OrderCancelMutation) => {
|
||||||
const errs = data.orderCancel?.errors;
|
const errs = data.orderCancel?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "W/Es0H",
|
id: "W/Es0H",
|
||||||
|
@ -119,7 +121,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleDraftCancel = (data: OrderDraftCancelMutation) => {
|
const handleDraftCancel = (data: OrderDraftCancelMutation) => {
|
||||||
const errs = data.draftOrderDelete?.errors;
|
const errs = data.draftOrderDelete?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "W/Es0H",
|
id: "W/Es0H",
|
||||||
|
@ -132,7 +134,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleOrderVoid = (data: OrderVoidMutation) => {
|
const handleOrderVoid = (data: OrderVoidMutation) => {
|
||||||
const errs = data.orderVoid?.errors;
|
const errs = data.orderVoid?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "L87bp7",
|
id: "L87bp7",
|
||||||
|
@ -145,7 +147,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleNoteAdd = (data: OrderAddNoteMutation) => {
|
const handleNoteAdd = (data: OrderAddNoteMutation) => {
|
||||||
const errs = data.orderAddNote?.errors;
|
const errs = data.orderAddNote?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "KmPicj",
|
id: "KmPicj",
|
||||||
|
@ -157,7 +159,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleUpdate = (data: OrderUpdateMutation) => {
|
const handleUpdate = (data: OrderUpdateMutation) => {
|
||||||
const errs = data.orderUpdate?.errors;
|
const errs = data.orderUpdate?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "j2fPVo",
|
id: "j2fPVo",
|
||||||
|
@ -170,7 +172,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleDraftUpdate = (data: OrderDraftUpdateMutation) => {
|
const handleDraftUpdate = (data: OrderDraftUpdateMutation) => {
|
||||||
const errs = data.draftOrderUpdate?.errors;
|
const errs = data.draftOrderUpdate?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "j2fPVo",
|
id: "j2fPVo",
|
||||||
|
@ -185,7 +187,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
) => {
|
) => {
|
||||||
const errs = data.orderUpdateShipping?.errors;
|
const errs = data.orderUpdateShipping?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "7U8GRy",
|
id: "7U8GRy",
|
||||||
|
@ -198,7 +200,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleOrderLineDelete = (data: OrderLineDeleteMutation) => {
|
const handleOrderLineDelete = (data: OrderLineDeleteMutation) => {
|
||||||
const errs = data.orderLineDelete?.errors;
|
const errs = data.orderLineDelete?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "9OtpHt",
|
id: "9OtpHt",
|
||||||
|
@ -210,7 +212,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleOrderLinesAdd = (data: OrderLinesAddMutation) => {
|
const handleOrderLinesAdd = (data: OrderLinesAddMutation) => {
|
||||||
const errs = data.orderLinesCreate?.errors;
|
const errs = data.orderLinesCreate?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "HlCkMT",
|
id: "HlCkMT",
|
||||||
|
@ -223,7 +225,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleOrderLineUpdate = (data: OrderLineUpdateMutation) => {
|
const handleOrderLineUpdate = (data: OrderLineUpdateMutation) => {
|
||||||
const errs = data.orderLineUpdate?.errors;
|
const errs = data.orderLineUpdate?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "Fn3bE0",
|
id: "Fn3bE0",
|
||||||
|
@ -232,7 +234,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
errs.forEach(error =>
|
errs.forEach(error =>
|
||||||
pushMessage({
|
notify({
|
||||||
status: "error",
|
status: "error",
|
||||||
text: getOrderErrorMessage(error, intl),
|
text: getOrderErrorMessage(error, intl),
|
||||||
}),
|
}),
|
||||||
|
@ -244,7 +246,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
) => {
|
) => {
|
||||||
const errs = data.orderFulfillmentApprove?.errors;
|
const errs = data.orderFulfillmentApprove?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "+sX7yS",
|
id: "+sX7yS",
|
||||||
|
@ -252,6 +254,10 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
closeModal();
|
closeModal();
|
||||||
|
} else {
|
||||||
|
if (!errs.every(err => err.code === OrderErrorCode.INSUFFICIENT_STOCK)) {
|
||||||
|
handleNestedMutationErrors({ data, intl, notify });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const handleOrderFulfillmentCancel = (
|
const handleOrderFulfillmentCancel = (
|
||||||
|
@ -259,7 +265,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
) => {
|
) => {
|
||||||
const errs = data.orderFulfillmentCancel?.errors;
|
const errs = data.orderFulfillmentCancel?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "uMpv1v",
|
id: "uMpv1v",
|
||||||
|
@ -274,7 +280,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
) => {
|
) => {
|
||||||
const errs = data.orderFulfillmentUpdateTracking?.errors;
|
const errs = data.orderFulfillmentUpdateTracking?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "CZmloB",
|
id: "CZmloB",
|
||||||
|
@ -287,7 +293,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleDraftFinalize = (data: OrderDraftFinalizeMutation) => {
|
const handleDraftFinalize = (data: OrderDraftFinalizeMutation) => {
|
||||||
const errs = data.draftOrderComplete?.errors;
|
const errs = data.draftOrderComplete?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "c4gbXr",
|
id: "c4gbXr",
|
||||||
|
@ -299,7 +305,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleInvoiceGeneratePending = (data: InvoiceRequestMutation) => {
|
const handleInvoiceGeneratePending = (data: InvoiceRequestMutation) => {
|
||||||
const errs = data.invoiceRequest?.errors;
|
const errs = data.invoiceRequest?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "ND5x+V",
|
id: "ND5x+V",
|
||||||
defaultMessage:
|
defaultMessage:
|
||||||
|
@ -316,7 +322,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleInvoiceGenerateFinished = (data: InvoiceRequestMutation) => {
|
const handleInvoiceGenerateFinished = (data: InvoiceRequestMutation) => {
|
||||||
const errs = data.invoiceRequest?.errors;
|
const errs = data.invoiceRequest?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
status: "success",
|
status: "success",
|
||||||
text: intl.formatMessage(messages.invoiceGenerateFinishedText),
|
text: intl.formatMessage(messages.invoiceGenerateFinishedText),
|
||||||
title: intl.formatMessage(messages.invoiceGenerateFinishedTitle),
|
title: intl.formatMessage(messages.invoiceGenerateFinishedTitle),
|
||||||
|
@ -327,7 +333,7 @@ export const OrderDetailsMessages: React.FC<OrderDetailsMessages> = ({
|
||||||
const handleInvoiceSend = (data: InvoiceEmailSendMutation) => {
|
const handleInvoiceSend = (data: InvoiceEmailSendMutation) => {
|
||||||
const errs = data.invoiceSendNotification?.errors;
|
const errs = data.invoiceSendNotification?.errors;
|
||||||
if (errs.length === 0) {
|
if (errs.length === 0) {
|
||||||
pushMessage({
|
notify({
|
||||||
text: intl.formatMessage({
|
text: intl.formatMessage({
|
||||||
id: "3u+4NZ",
|
id: "3u+4NZ",
|
||||||
defaultMessage: "Invoice email sent",
|
defaultMessage: "Invoice email sent",
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { handleNestedMutationErrors } from "@saleor/auth";
|
||||||
import { WindowTitle } from "@saleor/components/WindowTitle";
|
import { WindowTitle } from "@saleor/components/WindowTitle";
|
||||||
import {
|
import {
|
||||||
useFulfillOrderMutation,
|
useFulfillOrderMutation,
|
||||||
|
@ -59,8 +60,17 @@ const OrderFulfill: React.FC<OrderFulfillProps> = ({ orderId, params }) => {
|
||||||
description: "order fulfilled success message",
|
description: "order fulfilled success message",
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
if (
|
||||||
|
!data.orderFulfill.errors.every(
|
||||||
|
err => err.code === "INSUFFICIENT_STOCK",
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
handleNestedMutationErrors({ data, intl, notify });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
disableErrorHandling: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
Loading…
Reference in a new issue