From 8a65cd644832a75d7c84748f639029e772520280 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Wed, 5 Nov 2025 18:21:43 +0900 Subject: [PATCH] Add permission checks and localization to ARS pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add grant check (52, 'D') to ARS list download button - Add grant check (52, 'X') to ARS payment request button - Add grant check (52, 'X') to ARS detail SMS resend button - Refactor inline onClick handlers to method references - Replace hardcoded Korean text with i18n translation keys in ARS detail page Changes: - ars/list-page: Add permission checks for download and payment request - ars/detail-page: Add permission check for SMS resend, localize all UI text Localized fields: - Page title, transaction info, payment method, payment status, order status - Order date/time, product name, order number, buyer, phone number, email - Verification code, SMS resend button and success/error messages ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../additional-service/ars/detail-page.tsx | 46 +++++++++++-------- .../additional-service/ars/list-page.tsx | 14 +++++- 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/pages/additional-service/ars/detail-page.tsx b/src/pages/additional-service/ars/detail-page.tsx index f18cfd3..c5abecf 100644 --- a/src/pages/additional-service/ars/detail-page.tsx +++ b/src/pages/additional-service/ars/detail-page.tsx @@ -25,6 +25,8 @@ import { ArsResendSmsBottomSheet } from '@/entities/additional-service/ui/ars/re import { useExtensionArsResendMutation } from '@/entities/additional-service/api/ars/use-extension-ars-resend-mutation'; import { getArsOrderStatusName, getArsPaymentStatusName } from '@/entities/additional-service/model/ars/constant'; import { snackBar } from '@/shared/lib'; +import { checkGrant } from '@/shared/lib/check-grant'; +import { showAlert } from '@/widgets/show-alert'; export const ArsDetailPage = () => { const { t, i18n } = useTranslation(); @@ -50,7 +52,7 @@ export const ArsDetailPage = () => { }); }; - useSetHeaderTitle('ARS ๊ฒฐ์ œ ์ƒ์„ธ'); + useSetHeaderTitle(t('additionalService.ars.detailTitle')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { @@ -62,6 +64,10 @@ export const ArsDetailPage = () => { }, []); const onClickToOpenResendBottomSheet = () => { + if (!checkGrant(52, 'X')) { + showAlert(t('common.nopermission')); + return; + } setBottomSheetOn(true); }; @@ -76,18 +82,18 @@ export const ArsDetailPage = () => { } extensionArsResend(params).then((rs: ExtensionArsResendResponse) => { if (rs.status) { - snackBar("SMS ์žฌ์ „์†ก์„ ์„ฑ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค."); + snackBar(t('additionalService.ars.smsResendSuccess')); setBottomSheetOn(false); callDetail(); // ์ƒ์„ธ ์ •๋ณด ๊ฐฑ์‹  } else { - const errorMessage = rs.error?.message || 'SMS ์žฌ์ „์†ก์ด ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.'; - snackBar(`[์‹คํŒจ] ${errorMessage}`); + const errorMessage = rs.error?.message || t('additionalService.ars.smsResendFailed'); + snackBar(`[${t('common.failed')}] ${errorMessage}`); } }).catch((error) => { const errorMessage = error?.response?.data?.error?.message || error?.message || - 'SMS ์žฌ์ „์†ก ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'; - snackBar(`[์‹คํŒจ] ${errorMessage}`); + t('additionalService.ars.smsResendError'); + snackBar(`[${t('common.failed')}] ${errorMessage}`); }); }; @@ -107,52 +113,52 @@ export const ArsDetailPage = () => {
-
๊ฑฐ๋ž˜ ์ •๋ณด
+
{t('additionalService.ars.transactionInfo')}
  • MID { detail?.mid }
  • - ๊ฒฐ์ œ๋ฐฉ์‹ + {t('additionalService.ars.paymentMethod')} { detail?.arsPaymentMethod }
  • - ๊ฒฐ์ œ์ƒํƒœ + {t('additionalService.ars.paymentStatus')} { getArsPaymentStatusName(t)(detail?.paymentStatus) }
  • - ์ฃผ๋ฌธ์ƒํƒœ + {t('additionalService.ars.orderStatus')} { getArsOrderStatusName(t)(detail?.orderStatus) }
  • - ์ฃผ๋ฌธ์ผ์‹œ - { + {t('additionalService.ars.orderDateTime')} + { detail?.paymentDate ? moment(detail.paymentDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-' }
  • - ์ƒํ’ˆ๋ช… + {t('additionalService.ars.productName')} { detail?.goodsName }
  • - ์ฃผ๋ฌธ๋ฒˆํ˜ธ + {t('additionalService.ars.orderNumber')} { detail?.tid }
  • - ๊ตฌ๋งค์ž + {t('additionalService.ars.buyer')} { detail?.buyerName }
  • - ํœด๋Œ€ํฐ๋ฒˆํ˜ธ + {t('additionalService.ars.phoneNumber')} { detail?.maskPhoneNumber }
  • - ์ด๋ฉ”์ผ + {t('additionalService.ars.email')} { detail?.email }
  • - ๋ฐœ์†ก ์ธ์ฆ๋ฒˆํ˜ธ + {t('additionalService.ars.sendVerificationCode')} { detail?.smsVerificationCode }
@@ -161,9 +167,9 @@ export const ArsDetailPage = () => {
+ >{t('additionalService.ars.smsResend')}
)}
diff --git a/src/pages/additional-service/ars/list-page.tsx b/src/pages/additional-service/ars/list-page.tsx index d493969..a317444 100644 --- a/src/pages/additional-service/ars/list-page.tsx +++ b/src/pages/additional-service/ars/list-page.tsx @@ -26,6 +26,8 @@ import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access import useIntersectionObserver from '@/widgets/intersection-observer'; import { ArsList } from '@/entities/additional-service/ui/ars/ars-list'; import { ArsDetail } from '@/entities/additional-service/ui/ars/detail/ars-detail'; +import { checkGrant } from '@/shared/lib/check-grant'; +import { showAlert } from '@/widgets/show-alert'; export const ArsListPage = () => { const { navigate } = useNavigate(); @@ -136,6 +138,10 @@ export const ArsListPage = () => { }; const onClickToOpenEmailBottomSheet = () => { + if (!checkGrant(52, 'D')) { + showAlert(t('common.nopermission')); + return; + } setEmailBottomSheetOn(true); }; @@ -170,6 +176,10 @@ export const ArsListPage = () => { }; const onClickToNavigate = () => { + if (!checkGrant(52, 'X')) { + showAlert(t('common.nopermission')); + return; + } navigate(PATHS.additionalService.ars.request, { state: { mid } }); @@ -230,7 +240,7 @@ export const ArsListPage = () => {