Skip to content

Commit faec42e

Browse files
committed
fix: shop 컴포넌트에서 backend 오류 메시지 포맷팅 함수 사용
1 parent 8ebb6ea commit faec42e

5 files changed

Lines changed: 29 additions & 27 deletions

File tree

packages/common/src/apis/client.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,23 @@ export class BackendAPIClientError extends Error {
5959
}
6060
}
6161

62+
export const formatBackendErrorMessage = (error: unknown, fallback: string): string => {
63+
if (error instanceof BackendAPIClientError) {
64+
const seen = new Set<string>();
65+
const messages: string[] = [];
66+
for (const detailedError of error.detail.errors) {
67+
const detail = detailedError.detail;
68+
if (detail && !seen.has(detail)) {
69+
seen.add(detail);
70+
messages.push(detail);
71+
}
72+
}
73+
if (messages.length > 0) return messages.join("\n");
74+
}
75+
if (error instanceof Error && error.message) return error.message;
76+
return fallback;
77+
};
78+
6279
type supportedLanguages = "ko" | "en";
6380

6481
type AxiosRequestWithoutPayload = <T = unknown, Resp = AxiosResponse<T>, D = unknown>(url: string, config?: AxiosRequestConfig<D>) => Promise<Resp>;

packages/shop/src/apis/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import type {
1616
UserSignedInStatus,
1717
} from "@frontend/shop/schemas";
1818

19-
export { BackendAPIClient, BackendAPIClientError } from "@frontend/common/apis/client";
19+
export { BackendAPIClient, BackendAPIClientError, formatBackendErrorMessage } from "@frontend/common/apis/client";
2020

2121
/**
2222
* 로그인합니다.

packages/shop/src/components/features/cart.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { useForm } from "react-hook-form";
88
import { useNavigate } from "react-router-dom";
99
import { isArray } from "remeda";
1010

11-
import { BackendAPIClientError } from "@frontend/shop/apis";
11+
import { formatBackendErrorMessage } from "@frontend/shop/apis";
1212
import { CustomerInfoFormDialog, OrderProductRelationOptionInput, PriceDisplay, SignInGuard } from "@frontend/shop/components/common";
1313
import { useCart, usePrepareCartOrderMutation, useRemoveItemFromCartMutation, useShopClient, useShopContext } from "@frontend/shop/hooks";
1414
import type { CustomerInfo, Order, OrderProductItem } from "@frontend/shop/schemas";
@@ -105,7 +105,7 @@ export const CartStatus: FC = Suspense.with({ fallback: <CircularProgress /> },
105105
{ cartProductId },
106106
{
107107
onSuccess: () => addSnackbar(succeededToRemoveItemFromCartStr, "success"),
108-
onError: (error) => addSnackbar(error.message || errorWhilePreparingOrderStr, "error"),
108+
onError: (error) => addSnackbar(formatBackendErrorMessage(error, errorWhilePreparingOrderStr), "error"),
109109
}
110110
);
111111

@@ -131,11 +131,7 @@ export const CartStatus: FC = Suspense.with({ fallback: <CircularProgress /> },
131131
closeBackdrop
132132
);
133133
},
134-
onError: (error) =>
135-
alert(
136-
(error instanceof BackendAPIClientError ? error.detail.errors.map((errDetail) => errDetail.detail).join("\n") : error.message) ||
137-
errorWhilePreparingOrderStr
138-
),
134+
onError: (error) => alert(formatBackendErrorMessage(error, errorWhilePreparingOrderStr)),
139135
});
140136
};
141137

packages/shop/src/components/features/order.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { FC, ReactNode } from "react";
1919
import { useForm } from "react-hook-form";
2020
import { isNullish } from "remeda";
2121

22+
import { formatBackendErrorMessage } from "@frontend/shop/apis";
2223
import { OrderProductRelationOptionInput, PriceDisplay, SignInGuard } from "@frontend/shop/components/common";
2324
import {
2425
useOneItemRefundMutation,
@@ -113,7 +114,7 @@ const OrderProductRelationItem: FC<OrderProductRelationItemProps> = ({
113114
{ order_id: order.id, order_product_relation_id: prodRel.id },
114115
{
115116
onSuccess: () => addSnackbar(succeededToRefundOrderStr, "success"),
116-
onError: () => addSnackbar(failedToRefundOrderStr, "error"),
117+
onError: (error) => addSnackbar(formatBackendErrorMessage(error, failedToRefundOrderStr), "error"),
117118
}
118119
);
119120
const patchOneItemOptions = () => {
@@ -139,7 +140,7 @@ const OrderProductRelationItem: FC<OrderProductRelationItemProps> = ({
139140
},
140141
{
141142
onSuccess: () => addSnackbar(succeededToPatchOptionsStr, "success"),
142-
onError: () => addSnackbar(failedToPatchOptionsStr, "error"),
143+
onError: (error) => addSnackbar(formatBackendErrorMessage(error, failedToPatchOptionsStr), "error"),
143144
}
144145
);
145146
};
@@ -211,7 +212,7 @@ const OrderItem: FC<OrderItemProps> = ({ order, disabled, ...props }) => {
211212
{ order_id: order.id },
212213
{
213214
onSuccess: () => addSnackbar(succeededToRefundFullOrderStr, "success"),
214-
onError: () => addSnackbar(failedToRefundFullOrderStr, "error"),
215+
onError: (error) => addSnackbar(formatBackendErrorMessage(error, failedToRefundFullOrderStr), "error"),
215216
}
216217
);
217218
const openReceipt = () => window.open(`${backendApiDomain}/v1/shop/orders/${order.id}/receipt/`, "_blank");

packages/shop/src/components/features/product.tsx

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { useForm } from "react-hook-form";
3232
import { useNavigate } from "react-router-dom";
3333
import { isEmpty, isNullish, isNumber, isString } from "remeda";
3434

35-
import { BackendAPIClientError } from "@frontend/shop/apis";
35+
import { formatBackendErrorMessage } from "@frontend/shop/apis";
3636
import { CustomerInfoFormDialog, OptionGroupInput, PriceDisplay, SignInGuard } from "@frontend/shop/components/common";
3737
import { useAddItemToCartMutation, usePrepareOneItemOrderMutation, useProducts, useShopClient, useShopContext } from "@frontend/shop/hooks";
3838
import type { CartItemAppendRequest, CustomerInfo, Order, Product, ProductListQueryParams } from "@frontend/shop/schemas";
@@ -246,11 +246,7 @@ const ProductItem: FC<ProductItemPropType> = ({ disabled: rootDisabled, language
246246
);
247247
onAddToCartSuccess?.();
248248
},
249-
onError: (error) =>
250-
alert(
251-
(error instanceof BackendAPIClientError ? error.detail.errors.map((errDetail) => errDetail.detail).join("\n") : error.message) ||
252-
failedToAddOneItemToCartStr
253-
),
249+
onError: (error) => alert(formatBackendErrorMessage(error, failedToAddOneItemToCartStr)),
254250
});
255251
};
256252
const onOrderOneItemButtonClick = () => {
@@ -485,11 +481,7 @@ export const ProductList: FC<ProductListQueryParams> = (qs) => {
485481
closeBackdrop
486482
);
487483
},
488-
onError: (error) =>
489-
alert(
490-
(error instanceof BackendAPIClientError ? error.detail.errors.map((errDetail) => errDetail.detail).join("\n") : error.message) ||
491-
orderErrorStr
492-
),
484+
onError: (error) => alert(formatBackendErrorMessage(error, orderErrorStr)),
493485
}
494486
);
495487
};
@@ -584,11 +576,7 @@ export const ProductImageCardList: FC<ProductListQueryParams> = (qs) => {
584576
closeBackdrop
585577
);
586578
},
587-
onError: (error) =>
588-
alert(
589-
(error instanceof BackendAPIClientError ? error.detail.errors.map((errDetail) => errDetail.detail).join("\n") : error.message) ||
590-
orderErrorStr
591-
),
579+
onError: (error) => alert(formatBackendErrorMessage(error, orderErrorStr)),
592580
}
593581
);
594582
};

0 commit comments

Comments
 (0)