1+ import { useState } from "react" ;
12import Header from "@/components/Header" ;
3+ import ActionConfirmModal from "@/components/modal/ActionConfirmModal" ;
4+ import useAuthStore from "@/store/useAuthStore" ;
5+ import { useNavigate } from "react-router-dom" ;
26
3- interface MenuItem {
4- label : string ;
5- onClick ?: ( ) => void ;
6- }
7+ type ModalType = "logout" | "withdraw" | "terms" | "privacy" | null ;
78
8- const menuItems : MenuItem [ ] = [
9- { label : "이용약관" , onClick : ( ) => console . log ( "이용약관 클릭" ) } ,
10- {
11- label : "개인정보처리방침" ,
12- onClick : ( ) => console . log ( "개인정보처리방침 클릭" )
9+ const alertConfig = {
10+ logout : {
11+ title : "로그아웃" ,
12+ message : [ "로그아웃 할까요?" ] ,
13+ cancelText : "취소" ,
14+ confirmText : "확인"
1315 } ,
14- { label : "로그아웃" , onClick : ( ) => console . log ( "로그아웃 클릭" ) } ,
15- { label : "회원탈퇴" , onClick : ( ) => console . log ( "회원탈퇴 클릭" ) }
16- ] ;
16+ withdraw : {
17+ title : "회원탈퇴" ,
18+ message : [ "정말 탈퇴하시겠습니까?" ] ,
19+ cancelText : "취소" ,
20+ confirmText : "확인"
21+ }
22+ } ;
1723
1824const MyInfo = ( ) => {
25+ const [ modalType , setModalType ] = useState < ModalType > ( null ) ;
26+ const { logout } = useAuthStore ( ) ;
27+ const navigate = useNavigate ( ) ;
28+
29+ const handleCancel = ( ) => {
30+ setModalType ( null ) ;
31+ } ;
32+
33+ const handleConfirm = ( ) => {
34+ if ( modalType === "logout" ) {
35+ logout ( ) ;
36+ navigate ( "/login" ) ;
37+ } else if ( modalType === "withdraw" ) {
38+ console . log ( "회원탈퇴 실행" ) ; //TODO: 회원탈퇴 기능 구현 시 추가 필요
39+ }
40+ setModalType ( null ) ;
41+ } ;
42+
43+ const menuItems = [
44+ { label : "이용약관" , onClick : ( ) => setModalType ( "terms" ) } , //TODO: 이용약관 팝업 구현 시 추가 필요
45+ { label : "개인정보처리방침" , onClick : ( ) => setModalType ( "privacy" ) } , //TODO: 개인정보처리방침 팝업 구현 시 추가 필요
46+ { label : "로그아웃" , onClick : ( ) => setModalType ( "logout" ) } ,
47+ { label : "회원탈퇴" , onClick : ( ) => setModalType ( "withdraw" ) }
48+ ] ;
49+
1950 return (
20- < div className = "flex w-[360px] flex-col bg-white md:w-[375px] lg:w-[500px]" >
51+ < div className = "relative flex w-[360px] flex-col bg-white md:w-[375px] lg:w-[500px]" >
2152 < Header title = "내 정보" showShareIcon = { false } />
2253
2354 < ul className = "mt-[10px] flex flex-col justify-between gap-[20px]" >
@@ -27,7 +58,7 @@ const MyInfo = () => {
2758 className = "flex h-[56px] cursor-pointer items-center justify-between px-5 py-4 hover:bg-gray-50"
2859 onClick = { item . onClick }
2960 >
30- < span className = "text-base text-[16px] leading-6 font-medium tracking-normal text-gray-900 " >
61+ < span className = "text-base font-medium text-gray-900" >
3162 { item . label }
3263 </ span >
3364 < img
@@ -38,6 +69,17 @@ const MyInfo = () => {
3869 </ li >
3970 ) ) }
4071 </ ul >
72+
73+ { modalType && ( modalType === "logout" || modalType === "withdraw" ) && (
74+ < ActionConfirmModal
75+ title = { alertConfig [ modalType ] . title }
76+ message = { alertConfig [ modalType ] . message }
77+ cancelText = { alertConfig [ modalType ] . cancelText }
78+ confirmText = { alertConfig [ modalType ] . confirmText }
79+ onCancel = { handleCancel }
80+ onConfirm = { handleConfirm }
81+ />
82+ ) }
4183 </ div >
4284 ) ;
4385} ;
0 commit comments