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:
Michał Droń 2022-09-15 11:45:46 +02:00 committed by GitHub
parent 7a469029fd
commit ed95c423ae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 46 deletions

View file

@ -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) {

View file

@ -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,

View file

@ -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",

View file

@ -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 (