From 841a9d8542490b63f3bb474301aa03afc17b478c Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Tue, 21 Oct 2025 16:21:57 +0900 Subject: [PATCH] =?UTF-8?q?=ED=98=84=EA=B8=88=EC=98=81=EC=88=98=EC=A6=9D?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/ico_input_del.svg | 4 + public/images/ico_sign.png | Bin 0 -> 3856 bytes public/images/receip_logo.png | Bin 0 -> 1933 bytes src/entities/account/model/types.ts | 2 +- .../account/ui/user-account-auth-wrap.tsx | 72 ++-- src/entities/alarm/model/types.ts | 7 +- src/entities/alarm/ui/alarm-item.tsx | 27 +- src/entities/alarm/ui/alarm-list.tsx | 126 +++++-- src/entities/common/model/constant.ts | 88 ++--- src/entities/home/ui/favorite-wrapper.tsx | 21 +- src/entities/menu/model/types.ts | 9 +- src/entities/menu/ui/menu-category.tsx | 46 ++- src/entities/settlement/model/types.ts | 8 +- src/entities/settlement/ui/calandar-wrap.tsx | 18 +- src/entities/settlement/ui/list-wrap.tsx | 189 ++++++---- ...-cash-receipt-receipt-download-mutation.ts | 29 ++ .../api/use-cash-receipt-summary-mutation.ts | 29 ++ src/entities/transaction/model/contant.ts | 14 +- src/entities/transaction/model/types.ts | 123 ++++--- .../transaction/ui/all-transaction-list.tsx | 47 +-- src/entities/transaction/ui/billing-list.tsx | 38 ++- .../transaction/ui/cash-receipt-list.tsx | 52 ++- src/entities/transaction/ui/escrow-list.tsx | 40 ++- .../ui/filter/cash-receipt-filter.tsx | 34 +- .../transaction/ui/list-date-group.tsx | 2 - src/entities/transaction/ui/list-item.tsx | 6 +- .../ui/section/issue-info-section.tsx | 4 +- .../user/api/use-shortcut-detault-mutation.ts | 29 ++ .../user/api/use-shortcut-save-mutation.ts | 29 ++ .../user/api/use-shortcut-user-mutation.ts | 29 ++ src/entities/user/model/types.ts | 45 ++- .../transaction/all-transaction/list-page.tsx | 29 +- src/pages/transaction/billing/list-page.tsx | 44 +-- .../transaction/cash-receipt/list-page.tsx | 107 +++--- src/pages/transaction/escrow/list-page.tsx | 34 +- src/shared/api/api-url-transaction.ts | 8 + src/shared/api/api-url-user.ts | 100 +++--- src/shared/constants/paths.ts | 2 + src/shared/ui/assets/css/style.css | 323 +++++++----------- src/shared/ui/assets/images/ico_input_del.svg | 4 + src/shared/ui/assets/images/ico_sign.png | Bin 0 -> 3856 bytes src/shared/ui/assets/images/receip_logo.png | Bin 0 -> 1933 bytes src/shared/ui/menu/index.tsx | 66 +++- src/widgets/sub-layout/index.tsx | 41 ++- 44 files changed, 1208 insertions(+), 717 deletions(-) create mode 100644 public/images/ico_input_del.svg create mode 100644 public/images/ico_sign.png create mode 100644 public/images/receip_logo.png create mode 100644 src/entities/transaction/api/use-cash-receipt-receipt-download-mutation.ts create mode 100644 src/entities/transaction/api/use-cash-receipt-summary-mutation.ts create mode 100644 src/entities/user/api/use-shortcut-detault-mutation.ts create mode 100644 src/entities/user/api/use-shortcut-save-mutation.ts create mode 100644 src/entities/user/api/use-shortcut-user-mutation.ts create mode 100644 src/shared/ui/assets/images/ico_input_del.svg create mode 100644 src/shared/ui/assets/images/ico_sign.png create mode 100644 src/shared/ui/assets/images/receip_logo.png diff --git a/public/images/ico_input_del.svg b/public/images/ico_input_del.svg new file mode 100644 index 0000000..1bafa16 --- /dev/null +++ b/public/images/ico_input_del.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/ico_sign.png b/public/images/ico_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..0cd88af0c86c234920f99eaa2d7f73ac3ee22dc7 GIT binary patch literal 3856 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 SE$ONN0000#CK~#7F?O1t? zQ$-m6z1Q=#+wGn#t_lWG1X(qx+;WJ3U<`+d2)YuMs2nN?CMqCG0*QbG6iw7X5YT{E z1citR;aCJk!VwMyqPxqrz@F`H+t+jaX1d#LYu_u!M)||9nY8m}-t;%$@%z3RiILz2 z78y6V{15PY<(dJ;d+zmkak_VnS_6>?L-~a&ut)^Aw`+@VI0Azqem@MA)h_t`0kkj7 zr@n*;{ab|Q8x4l&8q}{iUlr@8l3Uv5h<9~%kXp`GR@2^Yrq+S2{ce|dMxYa zb)~Q=mIN(kw=ICH)=m45YQW=DQCshcjpsNsFnz%?Yv8bwX zK{n`Ut{I2!D2qUmWq2GpxM$!Ll>N2_p)faLYS(S>sBkxWV|~SH#s~8z#rkvKd>@5* zS(rXyXzW=i6o%2L?E-0n#ES*5O+f!a51{Q!U?nz{ybxPKg+xdj5K-|ocGQ|EA7 zj}ioeA=nAn>HVv95onrNk|kL4ogxDy?1)Uw&AoHyDp=JKRXk?3#HhK8N`K))Lbqv+#YI;KKO`IeDv)lvxY(eR8-c(N9OEua}H#a88({&#bJY; zT2_XF%nTdyb2D*Mel`m7oWe?Z)H=2=NJxwElG4N+b6!@apq1RL3=|Tb1j&bZu2lm8 z3WgwjWKI#aULQqn)bG}BF2&i3iiYjeO3 z8rK4+36Q_Q&BYt{Bd+6AYjD-aKlZ8tY~E6enG+vFYl$w+GzSOQ(z;Eh`1QzXqK6=g z?rewRk^QL}&P^zn7=4V!Xm;V5#~%#pEzhetn9W9_FG(}MYXS_1qu@ULd>f{h%%w!@ z<=i7wxgiq5oT(O!eYqGLm(PrC#HLtbZK5SkMV;=Qi1TME2?=+Bf0}>=>oI0>3BFo6 zTMLFZKm#%V#;toX{h3*iGTUP1>V+86_a2xGMjSZyCrVy?7hkSekH*>tY+3u3@LM}o zJr<>fHNNz8R$Bz|hFj?FbWWxsD4_!%h4ro4mNVx+Tl)kLG&Yd(KozSN9IC8@x zcJM@*=&$)^2OBwcactfl{iiTn;iD{_kOefyQW~BI#I`+0z-lgI=G@6mfx_a(CDGr$ zX)$%`Fm3L~;>0Q+yOajgXFp2#7ngEuazf7YF3i7j3o?4r;gvH#l1g9k@<=S}h zDR#(??u0TiW3Z4HeFhJ~o=r=jCz=3d9ksW@|?T4a)BE%KWOuEol#dck9PRH;}fJ7m*YI01B6#l{sgwf-h; zJ*a8?;RCyYd(cN;Y!l#;HOXCa@1c_@Y|{}>OK-0vUCy%YSWBnF6O)b>4)X$ z)9ncqbsdkA*%L5kSWn?++xH#AqWPa7;;zO^@613)x?JM(om3pSr~rr;KLy&*Neji1 zG+BIZ55|ukfEjwZTMK!(=|X7N{^QKpW)NwLE`UH6Kg(rNT#JRuyeDDwaa`?0;xr#cq!=T

; }; diff --git a/src/entities/account/ui/user-account-auth-wrap.tsx b/src/entities/account/ui/user-account-auth-wrap.tsx index 56cf332..ab037a2 100644 --- a/src/entities/account/ui/user-account-auth-wrap.tsx +++ b/src/entities/account/ui/user-account-auth-wrap.tsx @@ -48,64 +48,64 @@ export const UserAccountAuthWrap = ({ }, [currentStatus, currentIdCL, status, idCL]); let menuItems = [ - {menuId: '30', parent: '30', menuName: '거래조회', subMenu: + {menuId: 30, parent: 30, menuName: '거래조회', subMenu: [ - {menuId: '31', parent: '30', menuName: '거래내역조회'}, - {menuId: '32', parent: '30', menuName: '현금영수증발행'}, - {menuId: '33', parent: '30', menuName: '에스크로'}, - {menuId: '34', parent: '30', menuName: '빌링'} + {menuId: 31, parent: 30, menuName: '거래내역조회'}, + {menuId: 32, parent: 30, menuName: '현금영수증발행'}, + {menuId: 33, parent: 30, menuName: '에스크로'}, + {menuId: 34, parent: 30, menuName: '빌링'} ] }, - {menuId: '35', parent: '35', menuName: '정산조회', subMenu: + {menuId: 35, parent: 35, menuName: '정산조회', subMenu: [ - {menuId: '36', parent: '35', menuName: '정산달력'}, - {menuId: '37', parent: '35', menuName: '정산내역'}, + {menuId: 36, parent: 35, menuName: '정산달력'}, + {menuId: 37, parent: 35, menuName: '정산내역'}, ] }, - {menuId: '38', parent: '38', menuName: '가맹점관리', subMenu: + {menuId: 38, parent: 38, menuName: '가맹점관리', subMenu: [ - {menuId: '39', parent: '38', menuName: '가맹점정보'}, - {menuId: '40', parent: '38', menuName: '등록현황'}, + {menuId: 39, parent: 38, menuName: '가맹점정보'}, + {menuId: 40, parent: 38, menuName: '등록현황'}, ] }, - {menuId: '41', parent: '41', menuName: '결제관리', subMenu: + {menuId: 41, parent: 41, menuName: '결제관리', subMenu: [ - {menuId: '42', parent: '41', menuName: '결제정보'}, - {menuId: '43', parent: '41', menuName: '결제데이터통보'}, + {menuId: 42, parent: 41, menuName: '결제정보'}, + {menuId: 43, parent: 41, menuName: '결제데이터통보'}, ] }, - {menuId: '44', parent: '44', menuName: '계정관리', subMenu: + {menuId: 44, parent: 44, menuName: '계정관리', subMenu: [ - {menuId: '45', parent: '44', menuName: '사용자관리'}, - {menuId: '46', parent: '44', menuName: '비밀번호관리'}, + {menuId: 45, parent: 44, menuName: '사용자관리'}, + {menuId: 46, parent: 44, menuName: '비밀번호관리'}, ] }, - {menuId: '47', parent: '47', menuName: '부가세신고자료', subMenu: + {menuId: 47, parent: 47, menuName: '부가세신고자료', subMenu: [ - {menuId: '48', parent: '47', menuName: '세금계산서'}, - {menuId: '49', parent: '47', menuName: '부가세참고'}, + {menuId: 48, parent: 47, menuName: '세금계산서'}, + {menuId: 49, parent: 47, menuName: '부가세참고'}, ] }, - {menuId: '50', parent: '50', menuName: '부가서비스', subMenu: + {menuId: 50, parent: 50, menuName: '부가서비스', subMenu: [ - {menuId: '51', parent: '50', menuName: '부가서비스소개'}, - {menuId: '52', parent: '50', menuName: '신용카드ARS카드결제'}, - {menuId: '53', parent: '50', menuName: '지급대행'}, - {menuId: '54', parent: '50', menuName: '링크결제'}, - {menuId: '55', parent: '50', menuName: '자금이체'}, - {menuId: '56', parent: '50', menuName: 'KEY-IN결제'}, - {menuId: '57', parent: '50', menuName: 'SMS결제통보'}, - {menuId: '58', parent: '50', menuName: '알림톡결제통보'}, - {menuId: '59', parent: '50', menuName: '계좌점유인증'}, - {menuId: '60', parent: '50', menuName: '계좌성명조회'}, - {menuId: '65', parent: '50', menuName: '안면인증'}, + {menuId: 51, parent: 50, menuName: '부가서비스소개'}, + {menuId: 52, parent: 50, menuName: '신용카드ARS카드결제'}, + {menuId: 53, parent: 50, menuName: '지급대행'}, + {menuId: 54, parent: 50, menuName: '링크결제'}, + {menuId: 55, parent: 50, menuName: '자금이체'}, + {menuId: 56, parent: 50, menuName: 'KEY-IN결제'}, + {menuId: 57, parent: 50, menuName: 'SMS결제통보'}, + {menuId: 58, parent: 50, menuName: '알림톡결제통보'}, + {menuId: 59, parent: 50, menuName: '계좌점유인증'}, + {menuId: 60, parent: 50, menuName: '계좌성명조회'}, + {menuId: 65, parent: 50, menuName: '안면인증'}, ] }, - {menuId: '61', parent: '61', menuName: '고객지원', subMenu: + {menuId: 61, parent: 61, menuName: '고객지원', subMenu: [ - {menuId: '62', parent: '61', menuName: '공지사항'}, - {menuId: '63', parent: '61', menuName: '자주묻는질문'}, - {menuId: '64', parent: '61', menuName: '1:1문의'}, + {menuId: 62, parent: 61, menuName: '공지사항'}, + {menuId: 63, parent: 61, menuName: '자주묻는질문'}, + {menuId: 64, parent: 61, menuName: '1:1문의'}, ] }, ] diff --git a/src/entities/alarm/model/types.ts b/src/entities/alarm/model/types.ts index a12f8f4..60e7416 100644 --- a/src/entities/alarm/model/types.ts +++ b/src/entities/alarm/model/types.ts @@ -1,11 +1,6 @@ import { DefaulResponsePagination, DefaultRequestPagination } from '@/entities/common/model/types'; -export interface AlarmItemProps { - title?: string; - name?: string; - category?: string; - date?: string; -}; + export interface AppAlarmMarkParams { appNotificationSequence: number; diff --git a/src/entities/alarm/ui/alarm-item.tsx b/src/entities/alarm/ui/alarm-item.tsx index f81abf1..1618c27 100644 --- a/src/entities/alarm/ui/alarm-item.tsx +++ b/src/entities/alarm/ui/alarm-item.tsx @@ -1,13 +1,22 @@ import { PATHS } from '@/shared/constants/paths'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { AlarmItemProps } from '../model/types'; +import moment from 'moment'; + +export interface AlarmItemProps { + appNotificationCategory?: string; + notificationReceivedDate?: string; + appNotificationTitle?: string; + appNotificationContent?: string; + appNotificationLink?: string; +}; export const AlarmItem = ({ - title, - name, - category, - date + appNotificationCategory, + notificationReceivedDate, + appNotificationTitle, + appNotificationContent, + appNotificationLink }: AlarmItemProps) => { const { navigate } = useNavigate(); const onClickToNavigate = (alarmId: number) => { @@ -18,10 +27,10 @@ export const AlarmItem = ({ return (

-
{ title }
+
{ appNotificationTitle }
- { name } - { date } + { appNotificationCategory } + { moment(notificationReceivedDate).format('YYYY.MM.DD HH:mm:ss') }
{
diff --git a/src/entities/alarm/ui/alarm-list.tsx b/src/entities/alarm/ui/alarm-list.tsx index d3658c0..19dff14 100644 --- a/src/entities/alarm/ui/alarm-list.tsx +++ b/src/entities/alarm/ui/alarm-list.tsx @@ -1,6 +1,13 @@ import { IMAGE_ROOT } from '@/shared/constants/common'; import { AlarmItem } from './alarm-item'; -import { AlarmItemProps } from '../model/types'; +import { AlarmListContent, AppAlarmListParams, AppAlarmListResponse, MERCHANT_ADMIN_APP } from '../model/types'; +import { useEffect, useState } from 'react'; +import { useAppAlarmListMutation } from '../api/use-app-alarm-list-mutation'; +import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; +import { useTranslation } from 'react-i18next'; +import { useNavigate } from '@/shared/lib/hooks'; +import useIntersectionObserver from '@/widgets/intersection-observer'; +import { useStore } from '@/shared/model/store'; export interface AlarmListProps { category: string; @@ -9,35 +16,106 @@ export interface AlarmListProps { export const AlarmList = ({ category }: AlarmListProps) => { + const { navigate } = useNavigate(); + const { t } = useTranslation(); + const userInfo = useStore.getState().UserStore.userInfo; + + const [onActionIntersect, setOnActionIntersect] = useState(false); + const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); + const [nextCursor, setNextCursor] = useState(null); + const [appCl, setAppCl] = useState(MERCHANT_ADMIN_APP.MERCHANT_ADMIN_APP) + const [appNotificationCategory, setAppNotificationCategory] = useState(''); + const [resultList, setResultList] = useState>([]); + const [selectedCategory, setSelectedCategory] = useState(''); + + const { mutateAsync: appAlarmList } = useAppAlarmListMutation(); - const alarmItems: Array = [ - {title: '시스템 안정화를 위한 정기 점검이 예정되어 있습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '가맹점 관리 메뉴에 거래내역 엑셀 다운로드 기능이 추가 되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '신규 가맹점을 대상으로 거래수수료 인하 혜택을 12월까지 제공합니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '앱의 안정성과 사용성을 개선한 버전 2.3.1이 출시되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '점검 시간 동안 일부 서비스 이용이 제한될 수 있으니 미리 확인해주세요.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '가맹점 관리 메뉴에 거래내역 엑셀 다운로드 기능이 추가 되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '신규 가맹점을 대상으로 거래수수료 인하 혜택을 12월까지 제공합니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '앱의 안정성과 사용성을 개선한 버전 2.3.1이 출시되었습니다.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - {title: '점검 시간 동안 일부 서비스 이용이 제한될 수 있으니 미리 확인해주세요.', name: '공지사항', category: 'notice', date: '2025.06.01 10:00:00'}, - ]; const getAlarmItems = () => { let rs = []; - for(let i=0;i - ) - } - + for(let i=0;i + ) } return rs; }; + + const onIntersect: IntersectionObserverCallback = (entries: Array) => { + entries.forEach((entry: IntersectionObserverEntry) => { + if(entry.isIntersecting){ + console.log('Element is now intersecting with the root. [' + onActionIntersect + ']'); + if(onActionIntersect && !!nextCursor){ + callList('page'); + } + } + else{ + console.log('Element is no longer intersecting with the root.'); + } + }); + }; + + const { setTarget } = useIntersectionObserver({ + threshold: 1, + onIntersect + }); + + const callList = (type?: string) => { + if(userInfo.usrid){ + let params: AppAlarmListParams = { + usrid: userInfo.usrid, + appCl: appCl, + appNotificationCategory: appNotificationCategory, + ...{ + page: pageParam + } + } + + if(type === 'page'){ + if(params.page){ + params.page.cursor = nextCursor; + } + } + else{ + setNextCursor(null); + if(params.page){ + params.page.cursor = null; + } + } + + appAlarmList(params).then((rs: AppAlarmListResponse) => { + if(rs){ + if(type === 'page'){ + setResultList([ + ...resultList, + ...rs.content + ]); + } + else{ + setResultList(rs.content); + } + if(rs.hasNext){ + setNextCursor(rs.nextCursor); + setOnActionIntersect(true); + } + else{ + setNextCursor(null); + } + } + }); + } + + }; + + useEffect(() => { + callList(); + }, [selectedCategory]); + return ( <>
diff --git a/src/entities/common/model/constant.ts b/src/entities/common/model/constant.ts index e24348c..1061840 100644 --- a/src/entities/common/model/constant.ts +++ b/src/entities/common/model/constant.ts @@ -38,95 +38,95 @@ export const BottomSheetMotionDuration = { export const MenuItems = [ { - menuId: '30', - parent: '30', + menuId: 30, + parent: 30, menuName: '거래조회', menuIcon: 'transaction-icon', subMenu: [ - {menuId: '31', parent: '30', menuName: '거래내역조회', path: PATHS.transaction.allTransaction.list}, - {menuId: '32', parent: '30', menuName: '현금영수증발행', path: PATHS.transaction.cashReceipt.list}, - {menuId: '33', parent: '30', menuName: '에스크로', path: PATHS.transaction.escrow.list}, - {menuId: '34', parent: '30', menuName: '빌링', path: PATHS.transaction.billing.list} + {menuId: 31, parent: 30, menuName: '거래내역조회', menuNameEng: '', programPath: PATHS.transaction.allTransaction.list}, + {menuId: 32, parent: 30, menuName: '현금영수증발행', menuNameEng: '', programPath: PATHS.transaction.cashReceipt.list}, + {menuId: 33, parent: 30, menuName: '에스크로', menuNameEng: '', programPath: PATHS.transaction.escrow.list}, + {menuId: 34, parent: 30, menuName: '빌링', menuNameEng: '', programPath: PATHS.transaction.billing.list} ] }, { - menuId: '35', - parent: '35', + menuId: 35, + parent: 35, menuName: '정산조회', menuIcon: 'settlement-icon', subMenu: [ - {menuId: '36', parent: '35', menuName: '정산달력', path: PATHS.settlement.calendar}, - {menuId: '37', parent: '35', menuName: '정산내역', path: PATHS.settlement.list} + {menuId: 36, parent: 35, menuName: '정산달력', menuNameEng: '', programPath: PATHS.settlement.calendar}, + {menuId: 37, parent: 35, menuName: '정산내역', menuNameEng: '', programPath: PATHS.settlement.list} ] }, { - menuId: '38', - parent: '38', + menuId: 38, + parent: 38, menuName: '가맹점관리', menuIcon: 'merchant-icon', subMenu: [ - {menuId: '39', parent: '38', menuName: '가맹점정보', path: PATHS.merchant.info}, - {menuId: '40', parent: '38', menuName: '등록현황', path: PATHS.merchant.registrationStatus} + {menuId: 39, parent: 38, menuName: '가맹점정보', menuNameEng: '', programPath: PATHS.merchant.info}, + {menuId: 40, parent: 38, menuName: '등록현황', menuNameEng: '', programPath: PATHS.merchant.registrationStatus} ] }, { - menuId: '41', - parent: '41', + menuId: 41, + parent: 41, menuName: '결제관리', menuIcon: 'payment-icon', subMenu: [ - {menuId: '42', parent: '41', menuName: '결제정보', path: PATHS.payment.info}, - {menuId: '43', parent: '41', menuName: '결제데이터통보', path: PATHS.payment.notificationData}, + {menuId: 42, parent: 41, menuName: '결제정보', menuNameEng: '', programPath: PATHS.payment.info}, + {menuId: 43, parent: 41, menuName: '결제데이터통보', menuNameEng: '', programPath: PATHS.payment.notificationData}, ] }, { - menuId: '44', - parent: '44', + menuId: 44, + parent: 44, menuName: '계정관리', menuIcon: 'account-icon', subMenu: [ - {menuId: '45', parent: '44', menuName: '사용자관리', path: PATHS.account.user.manage}, - {menuId: '46', parent: '44', menuName: '비밀번호관리', path: PATHS.account.password.manage}, + {menuId: 45, parent: 44, menuName: '사용자관리', menuNameEng: '', programPath: PATHS.account.user.manage}, + {menuId: 46, parent: 44, menuName: '비밀번호관리', menuNameEng: '', programPath: PATHS.account.password.manage}, ] }, { - menuId: '47', - parent: '47', + menuId: 47, + parent: 47, menuName: '부가세신고자료', menuIcon: 'vat-icon', subMenu: [ - {menuId: '48', parent: '47', menuName: '세금계산서', path: PATHS.vatReturn.list}, - {menuId: '49', parent: '47', menuName: '부가세참고', path: PATHS.vatReturn.reference}, + {menuId: 48, parent: 47, menuName: '세금계산서', menuNameEng: '', programPath: PATHS.vatReturn.list}, + {menuId: 49, parent: 47, menuName: '부가세참고', menuNameEng: '', programPath: PATHS.vatReturn.reference}, ] }, { - menuId: '50', - parent: '50', + menuId: 50, + parent: 50, menuName: '부가서비스', menuIcon: 'service-icon', subMenu: [ - {menuId: '51', parent: '50', menuName: '부가서비스소개', path: PATHS.additionalService.list}, - {menuId: '52', parent: '50', menuName: '신용카드ARS카드결제', path: PATHS.additionalService.ars.list}, - {menuId: '53', parent: '50', menuName: '지급대행', path: PATHS.additionalService.payout.list}, - {menuId: '54', parent: '50', menuName: '링크결제', path: PATHS.additionalService.linkPayment.shippingHistory}, - {menuId: '55', parent: '50', menuName: '자금이체', path: PATHS.additionalService.fundAccount.transferList}, - {menuId: '56', parent: '50', menuName: 'KEY-IN결제', path: PATHS.additionalService.keyInPayment.list}, - {menuId: '57', parent: '50', menuName: 'SMS결제통보', path: PATHS.additionalService.smsPaymentNotification}, - {menuId: '58', parent: '50', menuName: '알림톡결제통보', path: PATHS.additionalService.alimtalk.list}, - {menuId: '59', parent: '50', menuName: '계좌점유인증', path: PATHS.additionalService.accountHolderAuth.list}, - {menuId: '60', parent: '50', menuName: '계좌성명조회', path: PATHS.additionalService.accountHolderSearch.list}, - {menuId: '65', parent: '50', menuName: '안면인증', path: PATHS.additionalService.faceAuth.list}, + {menuId: 51, parent: 50, menuName: '부가서비스소개', menuNameEng: '', programPath: PATHS.additionalService.list}, + {menuId: 52, parent: 50, menuName: '신용카드ARS카드결제', menuNameEng: '', programPath: PATHS.additionalService.ars.list}, + {menuId: 53, parent: 50, menuName: '지급대행', menuNameEng: '', programPath: PATHS.additionalService.payout.list}, + {menuId: 54, parent: 50, menuName: '링크결제', menuNameEng: '', programPath: PATHS.additionalService.linkPayment.shippingHistory}, + {menuId: 55, parent: 50, menuName: '자금이체', menuNameEng: '', programPath: PATHS.additionalService.fundAccount.transferList}, + {menuId: 56, parent: 50, menuName: 'KEY-IN결제', menuNameEng: '', programPath: PATHS.additionalService.keyInPayment.list}, + {menuId: 57, parent: 50, menuName: 'SMS결제통보', menuNameEng: '', programPath: PATHS.additionalService.smsPaymentNotification}, + {menuId: 58, parent: 50, menuName: '알림톡결제통보', menuNameEng: '', programPath: PATHS.additionalService.alimtalk.list}, + {menuId: 59, parent: 50, menuName: '계좌점유인증', menuNameEng: '', programPath: PATHS.additionalService.accountHolderAuth.list}, + {menuId: 60, parent: 50, menuName: '계좌성명조회', menuNameEng: '', programPath: PATHS.additionalService.accountHolderSearch.list}, + {menuId: 65, parent: 50, menuName: '안면인증', menuNameEng: '', programPath: PATHS.additionalService.faceAuth.list}, ] }, { - menuId: '61', - parent: '61', + menuId: 61, + parent: 61, menuName: '고객지원', menuIcon: 'support-icon', subMenu: [ - {menuId: '62', parent: '61', menuName: '공지사항', path: PATHS.support.notice.list}, - {menuId: '63', parent: '61', menuName: '자주묻는질문', path: PATHS.support.faq.list}, - {menuId: '64', parent: '61', menuName: '1:1문의', path: PATHS.support.qna.list}, + {menuId: 62, parent: 61, menuName: '공지사항', menuNameEng: '', programPath: PATHS.support.notice.list}, + {menuId: 63, parent: 61, menuName: '자주묻는질문', menuNameEng: '', programPath: PATHS.support.faq.list}, + {menuId: 64, parent: 61, menuName: '1:1문의', menuNameEng: '', programPath: PATHS.support.qna.list}, ] }, ]; \ No newline at end of file diff --git a/src/entities/home/ui/favorite-wrapper.tsx b/src/entities/home/ui/favorite-wrapper.tsx index 68a3e50..d392e08 100644 --- a/src/entities/home/ui/favorite-wrapper.tsx +++ b/src/entities/home/ui/favorite-wrapper.tsx @@ -36,8 +36,11 @@ export const FavoriteWrapper = ({ const [favoriteItems, setFavoriteItems] = useState>([]); const itemAdd: UserFavorite = { - img: IMAGE_ROOT + '/ico_menu_plus.svg', - title: '편집하기' + menuId: 0, + menuName: '편집하기', + menuNameEng: 'edit', + iconFilePath: IMAGE_ROOT + '/ico_menu_plus.svg', + programPath: '', }; const onClickToFavoriteEdit = () => { @@ -67,15 +70,15 @@ export const FavoriteWrapper = ({
onClickToNavigate(favoriteItems[i]?.path) } + onClick={ () => onClickToNavigate(favoriteItems[i]?.programPath) } >
{
- { favoriteItems[i]?.title } + { favoriteItems[i]?.menuName }
); @@ -93,11 +96,11 @@ export const FavoriteWrapper = ({ >
{
- { itemAdd.title } + { itemAdd.menuName }
); diff --git a/src/entities/menu/model/types.ts b/src/entities/menu/model/types.ts index 7461e70..c2053d6 100644 --- a/src/entities/menu/model/types.ts +++ b/src/entities/menu/model/types.ts @@ -1,11 +1,12 @@ import { RefObject } from "react"; export interface MenuItem { - menuId?: string; - parent?: string; + menuId?: number; + parent?: number; menuName: string; - menuIcon?: string; - path?: string; + menuNameEng?: string; + iconFilePath?: string; + programPath?: string; subMenu?: Array }; diff --git a/src/entities/menu/ui/menu-category.tsx b/src/entities/menu/ui/menu-category.tsx index 0ed5c91..53d7335 100644 --- a/src/entities/menu/ui/menu-category.tsx +++ b/src/entities/menu/ui/menu-category.tsx @@ -8,13 +8,13 @@ import { PATHS } from '@/shared/constants/paths'; import { MenuItem } from '../model/types'; export interface MenuCategoryProps { - menuId?: string; + menuId?: number; menuIcon?: string; menuName?: string; subMenu?: Array; setMenuOn?: (menuOn: boolean) => void; editMode?: boolean; - setChangeMenuId: (menuId?: string) => void; + setChangeMenuId: (menuIdChecked?: string) => void; buttonRefs: RefObject>; itemIndex: number; }; @@ -34,7 +34,7 @@ export const MenuCategory = ({ const location = useLocation(); const [favoriteItems, setFavoriteItems] = useState>([]); - const [menuIds, setMenuIds] = useState>([]); + const [menuIds, setMenuIds] = useState>([]); const onClickToNavigate = (path?: string) => { if(!!path && !!setMenuOn && !editMode){ @@ -45,9 +45,11 @@ export const MenuCategory = ({ const favoriteSetting = ( checked: boolean, - title?: string, - path?: string, - menuId?: string + menuId?: number, + menuName?: string, + menuNameEng?: string, + iconFilePath?: string, + programPath?: string, ) => { let userFavorite = useStore.getState().UserStore.userFavorite; let randomNum = Math.floor(Math.random() * 3) + 1; @@ -55,10 +57,11 @@ export const MenuCategory = ({ userFavorite = [ ...userFavorite, { - title: title, - img: `${IMAGE_ROOT}/ico_menu_0${randomNum}.svg`, - path: path, - menuId: menuId + menuId: menuId, + menuName: menuName, + menuNameEng: menuNameEng, + iconFilePath: `${IMAGE_ROOT}/ico_menu_0${randomNum}.svg`, + programPath: programPath } ]; } @@ -78,7 +81,7 @@ export const MenuCategory = ({ const callFavoiteItems = () => { let userFavorite = useStore.getState().UserStore.userFavorite; setFavoriteItems(userFavorite); - let newArr: Array = userFavorite.map((value, index) => { + let newArr: Array = userFavorite.map((value, index) => { return value.menuId; }); setMenuIds(newArr); @@ -88,15 +91,22 @@ export const MenuCategory = ({ callFavoiteItems(); }, []); + useEffect(() => { + if(menuIds.length > 0) { + // callShortcutSave(); + } + + }, [menuIds]); + const getMenuItems = () => { let rs = []; if(subMenu){ for(let i=0;i onClickToNavigate(subMenu[i]?.path) } + onClick={ () => onClickToNavigate(subMenu[i]?.programPath) } > { subMenu[i]?.menuName }
@@ -107,9 +117,11 @@ export const MenuCategory = ({ checked={ menuIds.includes(subMenu[i]?.menuId)? true: false } onChange={ (e) => favoriteSetting( e.target.checked, - subMenu[i]?.menuName, - subMenu[i]?.path, - subMenu[i]?.menuId + subMenu[i]?.menuId, + subMenu[i]?.menuName, + subMenu[i]?.menuNameEng, + subMenu[i]?.iconFilePath, + subMenu[i]?.programPath, )} />