From a4807c40136f361eae86010b9281c04b10986f29 Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Wed, 5 Nov 2025 14:03:50 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EA=B6=8C=ED=95=9C=20?= =?UTF-8?q?=EB=B0=8F=20ui=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/menu/ui/menu-category.tsx | 28 ++- src/entities/support/ui/detail/faq-detail.tsx | 5 +- .../support/ui/detail/notice-detail.tsx | 5 +- src/entities/support/ui/detail/qna-detail.tsx | 10 +- src/entities/support/ui/faq-item.tsx | 2 - src/entities/support/ui/notice-item.tsx | 3 - .../all-transaction/cancel-page.tsx | 1 - .../transaction/all-transaction/list-page.tsx | 8 +- src/pages/transaction/billing/detail-page.tsx | 97 -------- .../transaction/cash-receipt/detail-page.tsx | 161 -------------- src/pages/transaction/escrow/detail-page.tsx | 209 ------------------ src/shared/ui/assets/css/style-fix.css | 2 +- src/widgets/show-alert/index.tsx | 11 +- 13 files changed, 53 insertions(+), 489 deletions(-) delete mode 100644 src/pages/transaction/billing/detail-page.tsx delete mode 100644 src/pages/transaction/cash-receipt/detail-page.tsx delete mode 100644 src/pages/transaction/escrow/detail-page.tsx diff --git a/src/entities/menu/ui/menu-category.tsx b/src/entities/menu/ui/menu-category.tsx index 41954c5..497aaa9 100644 --- a/src/entities/menu/ui/menu-category.tsx +++ b/src/entities/menu/ui/menu-category.tsx @@ -5,6 +5,7 @@ import { RefObject, useEffect, useState } from 'react'; import { MenuItem } from '../model/types'; import { useTranslation } from 'react-i18next'; import { MenuItems } from '@/entities/common/model/constant'; +import { showAlert } from '@/widgets/show-alert'; export interface MenuCategoryProps { menuId?: number; @@ -33,15 +34,30 @@ export const MenuCategory = ({ }: MenuCategoryProps) => { const { navigate } = useNavigate(); const { i18n } = useTranslation(); + const menuGrantsByKey = useStore.getState().UserStore.menuGrantsByKey; const [favoriteItems, setFavoriteItems] = useState>([]); const [menuIds, setMenuIds] = useState>([]); - const onClickToNavigate = (path?: string, menuId?: number) => { - if(!!path && !!setMenuOn && !editMode){ - setMenuOn(false); - navigate(path); + const checkGrant = (menuId?: number) => { + const myGrants = menuGrantsByKey['' + menuId]; + if(myGrants?.includes('R')){ + return true } + return false; + }; + + const onClickToNavigate = (menuId?: number, path?: string) => { + if(menuId && checkGrant(menuId)){ + if(!!path && !!setMenuOn && !editMode){ + setMenuOn(false); + navigate(path); + } + } + else{ + showAlert('권한이 없습니다.'); + } + }; const favoriteSetting = ( @@ -121,7 +137,7 @@ export const MenuCategory = ({ rs.push(
  • onClickToNavigate(subMenu[i]?.programPath) } + onClick={ () => onClickToNavigate(subMenu[i]?.menuId, subMenu[i]?.programPath) } > { displayName }
    @@ -151,7 +167,7 @@ export const MenuCategory = ({ rs.push(
  • onClickToNavigate(subMenu[i]?.programPath) } + onClick={ () => onClickToNavigate(subMenu[i]?.menuId, subMenu[i]?.programPath) } >{ displayName }
  • ); } diff --git a/src/entities/support/ui/detail/faq-detail.tsx b/src/entities/support/ui/detail/faq-detail.tsx index 0094ef4..cef13f4 100644 --- a/src/entities/support/ui/detail/faq-detail.tsx +++ b/src/entities/support/ui/detail/faq-detail.tsx @@ -59,7 +59,10 @@ export const FaqDetail = ({
    { title }
    -
    +
    } diff --git a/src/entities/support/ui/detail/notice-detail.tsx b/src/entities/support/ui/detail/notice-detail.tsx index 0d84023..d0c1b2c 100644 --- a/src/entities/support/ui/detail/notice-detail.tsx +++ b/src/entities/support/ui/detail/notice-detail.tsx @@ -67,7 +67,10 @@ export const NoticeDetail = ({
    { result.title }
    { result.regDt? moment(result.regDt).format('YYYY.MM.DD'): '' } | { t(`support.notice.categories.${result.informCl}`) }
    -
    +
    diff --git a/src/entities/support/ui/detail/qna-detail.tsx b/src/entities/support/ui/detail/qna-detail.tsx index fc41e94..28faae2 100644 --- a/src/entities/support/ui/detail/qna-detail.tsx +++ b/src/entities/support/ui/detail/qna-detail.tsx @@ -85,11 +85,17 @@ export const QnaDetail = ({
    {t('support.qna.detailLabels.inquiryAnswer')}
    -
    +
    {t('support.qna.detailLabels.inquiryContents')}
    -
    +
    diff --git a/src/entities/support/ui/faq-item.tsx b/src/entities/support/ui/faq-item.tsx index a738a8a..30e0dbb 100644 --- a/src/entities/support/ui/faq-item.tsx +++ b/src/entities/support/ui/faq-item.tsx @@ -1,5 +1,3 @@ -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { FaqItemProps } from '../model/types'; import { useTranslation } from 'react-i18next'; diff --git a/src/entities/support/ui/notice-item.tsx b/src/entities/support/ui/notice-item.tsx index 2e1f961..25f7fa3 100644 --- a/src/entities/support/ui/notice-item.tsx +++ b/src/entities/support/ui/notice-item.tsx @@ -1,6 +1,4 @@ import moment from 'moment'; -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { NoticeItemProps } from '../model/types'; import { useTranslation } from 'react-i18next'; @@ -8,7 +6,6 @@ export const SupportNoticeItem = ({ noticeItem, setDetailData, }: NoticeItemProps) => { - const { navigate } = useNavigate(); const { t } = useTranslation(); const onClickToDetail = () => { diff --git a/src/pages/transaction/all-transaction/cancel-page.tsx b/src/pages/transaction/all-transaction/cancel-page.tsx index 7634c8a..f664609 100644 --- a/src/pages/transaction/all-transaction/cancel-page.tsx +++ b/src/pages/transaction/all-transaction/cancel-page.tsx @@ -19,7 +19,6 @@ import { useSetFooterMode } from '@/widgets/sub-layout/use-sub-layout'; import { useAllTransactioCancleInfoMutation } from '@/entities/transaction/api/use-all-transaction-cancel-info-mutation'; -import { NumericFormat } from 'react-number-format'; import { useStore } from '@/shared/model/store'; import { AllTransactionCancelPreventBond } from '@/entities/transaction/ui/all-transaction-cancel-prevent-bond'; import { snackBar } from '@/shared/lib'; diff --git a/src/pages/transaction/all-transaction/list-page.tsx b/src/pages/transaction/all-transaction/list-page.tsx index 96f85f7..53a155c 100644 --- a/src/pages/transaction/all-transaction/list-page.tsx +++ b/src/pages/transaction/all-transaction/list-page.tsx @@ -32,13 +32,13 @@ import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import useIntersectionObserver from '@/widgets/intersection-observer'; import { useTranslation } from 'react-i18next'; import { AllTransactionDetail } from '@/entities/transaction/ui/detail/all-transaction-detail'; +import { showAlert } from '@/widgets/show-alert'; +import { snackBar } from '@/shared/lib'; /* 거래내역조회 31 */ export const AllTransactionListPage = () => { - const menuGrantsByKey = useStore.getState().UserStore.menuGrantsByKey; - const myGrants = menuGrantsByKey['31']; - const { navigate } = useNavigate(); + const { t, i18n } = useTranslation(); const userMid = useStore.getState().UserStore.mid; @@ -244,7 +244,7 @@ export const AllTransactionListPage = () => { return nameMap[name] || name; }; - + useEffect(() => { callServiceCodeOptions(); }, []); diff --git a/src/pages/transaction/billing/detail-page.tsx b/src/pages/transaction/billing/detail-page.tsx deleted file mode 100644 index 49afef9..0000000 --- a/src/pages/transaction/billing/detail-page.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useLocation } from 'react-router'; -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useBillingDetailMutation } from '@/entities/transaction/api/use-billing-detail-mutation'; -import { BillingInfoSection } from '@/entities/transaction/ui/section/billing-info-section'; -import { HeaderType } from '@/entities/common/model/types'; -import { - TransactionCategory, - BillingDetailParams, - BillingDetailResponse, - BillingInfo, - AmountInfo -} from '@/entities/transaction/model/types'; -import { - useSetOnBack, - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode -} from '@/widgets/sub-layout/use-sub-layout'; -import { NumericFormat } from 'react-number-format'; -import { C } from 'node_modules/react-router/dist/development/index-react-server-client-DRhjXpk2.mjs'; -import { AmountInfoSection } from '@/entities/transaction/ui/section/amount-info-section'; - -export const BillingDetailPage = () => { - const { navigate } = useNavigate(); - const { t, i18n } = useTranslation(); - const location = useLocation(); - const tid = location?.state.tid; - const serviceCode = location?.state.serviceCode; - - - const [billingInfo, setBillingInfo] = useState(); - const [amountInfo, setAmountInfo] = useState(); - - useSetHeaderTitle(t('billing.detailTitle')); - useSetHeaderType(HeaderType.RightClose); - useSetOnBack(() => { - navigate(PATHS.transaction.billing.list); - }); - useSetFooterMode(false); - - const { mutateAsync: billingDetail } = useBillingDetailMutation(); - - const callDetail = () => { - let billingDetailParams: BillingDetailParams = { - tid: tid - }; - billingDetail(billingDetailParams).then((rs: BillingDetailResponse) => { - setBillingInfo(rs); - setAmountInfo({ - transactionAmount: rs.transactionAmount, - buyerName: rs.buyerName - }) - }); - }; - useEffect(() => { - callDetail(); - }, []); - - return ( - <> -
    -
    -
    -
    -
    -
    -
    -
    - { i18n.language === 'en' && { t('home.currencySymbol') } } - - { i18n.language !== 'en' && { t('home.currencyWon') } } -
    -
    -
    - { amountInfo?.buyerName } -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - ); -}; \ No newline at end of file diff --git a/src/pages/transaction/cash-receipt/detail-page.tsx b/src/pages/transaction/cash-receipt/detail-page.tsx deleted file mode 100644 index 455e8a7..0000000 --- a/src/pages/transaction/cash-receipt/detail-page.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useLocation } from 'react-router'; -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useCashReceiptDetailMutation } from '@/entities/transaction/api/use-cash-receipt-detail-mutation'; -import { IssueInfoSection } from '@/entities/transaction/ui/section/issue-info-section'; -import { DetailInfoSection } from '@/entities/transaction/ui/section/detail-info-section'; -import { HeaderType } from '@/entities/common/model/types'; -import { - TransactionCategory, - CashReceiptDetailParams, - DetailResponse, - IssueInfo, - DetailInfo, - InfoSectionKeys, - CashReceiptPurposeType, - AmountInfo, - CashReceiptPurposeUpdateParams, - CashReceiptTransactionType -} from '@/entities/transaction/model/types'; -import { - useSetOnBack, - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode -} from '@/widgets/sub-layout/use-sub-layout'; -import { CashReceitPurposeUpdateBottomSheet } from '@/entities/transaction/ui/cash-receit-purpose-update-bottom-sheet'; -import { useCashReceiptPurposeUpdateMutation } from '@/entities/transaction/api/use-cash-receipt-purpose-update-mutation'; -import { AmountInfoSection } from '@/entities/transaction/ui/section/amount-info-section'; -import { snackBar } from '@/shared/lib'; - -export const CashReceiptDetailPage = () => { - const { navigate, reload } = useNavigate(); - const { t } = useTranslation(); - const location = useLocation(); - - const [amountInfo, setAmountInfo] = useState(); - const [issueInfo, setIssueInfo] = useState(); - const [detailInfo, setDetailInfo] = useState(); - const [showAmountInfo, setShowAmountInfo] = useState(false); - const [showDetailInfo, setShowDetailInfo] = useState(false); - const [bottomSheetOn, setBottomSheetOn] = useState(false); - const [purposeType, setPurposeType] = useState(); - const [canDownloadReceipt, setCanDownloadReceipt] = useState(false); - - - useSetHeaderTitle(t('cashReceipt.detailTitle')); - useSetHeaderType(HeaderType.RightClose); - useSetOnBack(() => { - navigate(PATHS.transaction.cashReceipt.list); - }); - useSetFooterMode(false); - - const tid = location?.state.tid - - const { mutateAsync: cashReceiptDetail } = useCashReceiptDetailMutation(); - const { mutateAsync: cashReceiptPurposeUpdate } = useCashReceiptPurposeUpdateMutation(); - - const callPurposeUpdate = () => { - let newPurpose = (purposeType === CashReceiptPurposeType.EXPENSE_PROOF) - ? CashReceiptPurposeType.INCOME_DEDUCTION: CashReceiptPurposeType.EXPENSE_PROOF; - let params: CashReceiptPurposeUpdateParams = { - tid: tid, - newPurpose: newPurpose - }; - cashReceiptPurposeUpdate(params).then((rs) => { - setPurposeType(rs.afterPurposeType); - setBottomSheetOn(false); - snackBar('용도 변경을 성공하였습니다.', function(){ - reload(); - }, 2000); - }); - }; - - const callDetail = () => { - let cashReceitDetailParams: CashReceiptDetailParams = { - tid: tid - }; - cashReceiptDetail(cashReceitDetailParams).then((rs: DetailResponse) => { - if(rs.amountDetail){ - rs.amountDetail.customerName = rs.customerName; - } - setAmountInfo(rs.amountDetail || {}); - setIssueInfo(rs.issueInfo || {}); - setDetailInfo(rs.detailInfo || {}); - setCanDownloadReceipt(rs.detailInfo?.canDownloadReceipt || false); - if(rs.issueInfo){ - setPurposeType(rs.issueInfo.purpose); - } - }); - }; - useEffect(() => { - callDetail(); - }, []); - - const onClickToOpenInfo = (infoSectionKey: InfoSectionKeys) => { - if(infoSectionKey === InfoSectionKeys.Amount){ - setShowAmountInfo(!showAmountInfo); - } - else if(infoSectionKey === InfoSectionKeys.Detail){ - setShowDetailInfo(!showDetailInfo); - } - }; - - const onClickToPurposeUpdate = () => { - setBottomSheetOn(true); - }; - - return ( - <> -
    -
    -
    -
    -
    - onClickToOpenInfo(infoSectionKey) } - purposeType={ purposeType } - canDownloadReceipt={ canDownloadReceipt } - > -
    - -
    - { !!detailInfo && - onClickToOpenInfo(infoSectionKey) } - > - } -
    -
    - { (issueInfo?.transactionType === CashReceiptTransactionType.APPROVAL) && - (issueInfo?.processResult === '발급완료') && -
    - -
    - } -
    -
    -
    - - - ); -}; \ No newline at end of file diff --git a/src/pages/transaction/escrow/detail-page.tsx b/src/pages/transaction/escrow/detail-page.tsx deleted file mode 100644 index 468fc8c..0000000 --- a/src/pages/transaction/escrow/detail-page.tsx +++ /dev/null @@ -1,209 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { useLocation } from 'react-router'; -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useEscrowDetailMutation } from '@/entities/transaction/api/use-escrow-detail-mutation'; -import { ImportantInfoSection } from '@/entities/transaction/ui/section/important-info-section'; -import { EscrowInfoSection } from '@/entities/transaction/ui/section/escrow-info-section'; -import { PaymentInfoSection } from '@/entities/transaction/ui/section/payment-info-section'; -import { TransactionInfoSection } from '@/entities/transaction/ui/section/transaction-info-section'; -import { SettlementInfoSection } from '@/entities/transaction/ui/section/settlement-info-section'; -import { HeaderType } from '@/entities/common/model/types'; -import { - TransactionCategory, - EscrowDetailParams, - DetailResponse, - ImportantInfo, - EscrowInfo, - PaymentInfo, - TransactionInfo, - SettlementInfo, - InfoSectionKeys, - MerchantInfo, - AmountInfo -} from '@/entities/transaction/model/types'; -import { - useSetOnBack, - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode -} from '@/widgets/sub-layout/use-sub-layout'; -import { EscrowMailResendBottomSheet } from '@/entities/transaction/ui/escrow-mail-resend-bottom-sheet'; -import { useEscrowMailResendMutation } from '@/entities/transaction/api/use-escrow-mail-resend-mutation'; -import { MerchantInfoSection } from '@/entities/transaction/ui/section/merchant-info-section'; -import { AmountInfoSection } from '@/entities/transaction/ui/section/amount-info-section'; -import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; - -export const EscrowDetailPage = () => { - const { navigate } = useNavigate(); - const { t } = useTranslation(); - const location = useLocation(); - const paramTid = location?.state.tid; - const serviceCode = location?.state.serviceCode; - - const [amountInfo, setAmountInfo] = useState(); - const [importantInfo, setImportantInfo] = useState(); - const [escrowInfo, setEscrowInfo] = useState(); - const [paymentInfo, setPaymentInfo] = useState(); - const [transactionInfo, setTransactionInfo] = useState(); - const [settlementInfo, setSettlementInfo] = useState(); - const [merchantInfo, setMerchantInfo] = useState(); - - const [showAmountInfo, setShowAmountInfo] = useState(false); - const [showImportantInfo, setShowImportantInfo] = useState(false); - const [showEscroInfo, setShowEscroInfo] = useState(false); - const [showPaymentInfo, setShowPaymentInfo] = useState(false); - const [showTransactionInfo, setShowTransactionInfo] = useState(false); - const [showSettlementInfo, setShowSettlementInfo] = useState(false); - const [showMerchantInfo, setShowMerchantInfo] = useState(false); - - const [bottomSheetOn, setBottomSheetOn] = useState(false); - - const [orderNumber, setOrderNumber] = useState(); - const [tid, setTid] = useState(paramTid); - - useSetHeaderTitle(t('escrow.detailTitle')); - useSetHeaderType(HeaderType.RightClose); - useSetOnBack(() => { - navigate(PATHS.transaction.escrow.list); - }); - useSetFooterMode(false); - - const { mutateAsync: escrowDetail } = useEscrowDetailMutation(); - const { mutateAsync: escrowMailResend } = useEscrowMailResendMutation() - - const callDetail = () => { - let escroDetailParams: EscrowDetailParams = { - tid: tid || paramTid, - }; - escrowDetail(escroDetailParams).then((rs: DetailResponse) => { - setAmountInfo(rs.paymentInfo || {}); - setImportantInfo(rs.importantInfo || {}); - setEscrowInfo(rs.escrowInfo || {}); - setPaymentInfo(rs.paymentInfo || {}); - setTransactionInfo(rs.transactionInfo || {}); - setSettlementInfo(rs.settlementInfo || {}); - setMerchantInfo(rs.merchantInfo || {}); - - setOrderNumber(rs.importantInfo?.orderNumber); - setTid(rs.importantInfo?.tid); - }); - }; - useEffect(() => { - callDetail(); - }, []); - - const onClickToShowMailResend = () => { - setBottomSheetOn(true); - }; - - const callMailResend = () => { - let params = { - orderNumber: orderNumber, - tid: tid, - }; - escrowMailResend(params).then((rs: any) => { - console.log(rs); - }); - }; - - const onClickToOpenInfo = (infoSectionKey: InfoSectionKeys) => { - if(infoSectionKey === InfoSectionKeys.Amount){ - setShowAmountInfo(!showAmountInfo); - } - else if(infoSectionKey === InfoSectionKeys.Important){ - setShowImportantInfo(!showImportantInfo); - } - else if(infoSectionKey === InfoSectionKeys.Escrow){ - setShowEscroInfo(!showEscroInfo); - } - else if(infoSectionKey === InfoSectionKeys.Payment){ - setShowPaymentInfo(!showPaymentInfo); - } - else if(infoSectionKey === InfoSectionKeys.Transaction){ - setShowTransactionInfo(!showTransactionInfo); - } - else if(infoSectionKey === InfoSectionKeys.Settlement){ - setShowSettlementInfo(!showSettlementInfo); - } - else if(infoSectionKey === InfoSectionKeys.Merchant){ - setShowMerchantInfo(!showMerchantInfo); - } - }; - - return ( - <> -
    -
    -
    -
    -
    - onClickToOpenInfo(infoSectionKey) } - > -
    - -
    - onClickToOpenInfo(infoSectionKey) } - > -
    - onClickToOpenInfo(infoSectionKey) } - > -
    - onClickToOpenInfo(infoSectionKey) } - > -
    - onClickToOpenInfo(infoSectionKey) } - > -
    - onClickToOpenInfo(infoSectionKey) } - > -
    -
    -
    - -
    -
    -
    -
    - - - ); -}; \ No newline at end of file diff --git a/src/shared/ui/assets/css/style-fix.css b/src/shared/ui/assets/css/style-fix.css index 21ab738..f962389 100644 --- a/src/shared/ui/assets/css/style-fix.css +++ b/src/shared/ui/assets/css/style-fix.css @@ -11,7 +11,7 @@ main { width: 100%; height: 100%; background: #fff; - z-index: 9999; + z-index: 999; display: unset; /* overflow-y: auto; */ overflow-y: scroll; diff --git a/src/widgets/show-alert/index.tsx b/src/widgets/show-alert/index.tsx index 25c03db..a2e0a2a 100644 --- a/src/widgets/show-alert/index.tsx +++ b/src/widgets/show-alert/index.tsx @@ -1,7 +1,15 @@ import { Dialog } from '@/shared/ui/dialogs/dialog'; import { overlay } from 'overlay-kit'; -export const showAlert = (msg: string) => { +export const showAlert = (msg: string, callback?: () => void) => { + + const onConfirmClick = () => { + if(!!callback && typeof(callback) === 'function'){ + setTimeout(() => { + callback(); + }, 10); + } + }; overlay.open(({ isOpen, close, @@ -14,6 +22,7 @@ export const showAlert = (msg: string) => { onClose={ close } message={ msg } buttonLabel={ ['확인'] } + onConfirmClick={ onConfirmClick } /> ); });