Skip to content

Commit 87417b7

Browse files
committed
refactor: useMoreOptions 로직 분리
1 parent 80750f1 commit 87417b7

File tree

7 files changed

+163
-154
lines changed

7 files changed

+163
-154
lines changed

src/hooks/useMoreOptions.ts

Lines changed: 0 additions & 140 deletions
This file was deleted.

src/layouts/header/Header.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,21 @@ import MoreOptionsSelect from '@/components/MoreOptionsSelect';
44
import HedaerLayout from '@/layouts/header/HedaerLayout';
55

66
import logo from '@assets/icons/logo.svg';
7-
import { useMoreOptions } from '@/hooks/useMoreOptions';
87
interface HeaderProps {
9-
showMoreOptions?: boolean; // 더보기 메뉴를 표시할지 여부
8+
moreOptionsItems?: { label: string; onClick?: () => void }[]; // 더보기 메뉴에 실행할 함수
109
}
1110

12-
function Header({ showMoreOptions = false }: HeaderProps) {
13-
const moreOptionsItems = useMoreOptions();
11+
function Header({ moreOptionsItems }: HeaderProps) {
1412
return (
1513
<HedaerLayout>
1614
<div className="w-full flex items-center justify-between">
17-
<Link to="/">
15+
<Link to="/home">
1816
<img className="w-[103px] h-[22px]" src={logo} alt="logo" />
1917
</Link>
2018

2119
<div className="flex gap-1">
2220
{/* 더보기 메뉴 */}
23-
{showMoreOptions && <MoreOptionsSelect items={moreOptionsItems} />}
21+
{moreOptionsItems && <MoreOptionsSelect items={moreOptionsItems} />}
2422
</div>
2523
</div>
2624
</HedaerLayout>

src/layouts/header/HeaderWithBack.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
import MoreOptionsSelect from '@/components/MoreOptionsSelect';
2-
import { useMoreOptions } from '@/hooks/useMoreOptions';
32
import HedaerLayout from '@/layouts/header/HedaerLayout';
43
import backIcon from '@assets/icons/back-icon.svg';
54
import { useNavigate } from 'react-router';
65

76
interface HeaderWithBackProps {
8-
showMoreOptions?: boolean; // 더보기 메뉴를 표시할지 여부
97
text?: string; // 헤더 텍스트
8+
moreOptionsItems?: { label: string; onClick?: () => void }[]; // 더보기 메뉴에 실행할 함수
109
}
1110

1211
// 뒤로 가기 있는 헤더
13-
function HeaderWithBack({ showMoreOptions = false, text }: HeaderWithBackProps) {
12+
function HeaderWithBack({ text, moreOptionsItems }: HeaderWithBackProps) {
1413
const navigate = useNavigate();
15-
const moreOptionsItems = useMoreOptions();
1614
return (
1715
<HedaerLayout>
1816
<div className="flex items-center justify-between w-full">
@@ -31,7 +29,7 @@ function HeaderWithBack({ showMoreOptions = false, text }: HeaderWithBackProps)
3129
</div>
3230

3331
{/* 더보기 메뉴 */}
34-
{showMoreOptions && <MoreOptionsSelect items={moreOptionsItems} />}
32+
{moreOptionsItems && <MoreOptionsSelect items={moreOptionsItems} />}
3533
</div>
3634
</HedaerLayout>
3735
);

src/layouts/header/HeaderWrapper.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import Header from '@/layouts/header/Header';
22
import HeaderChat from '@/layouts/header/HeaderChat';
33
import HeaderWithBack from '@/layouts/header/HeaderWithBack';
4+
import MypageEditHeader from '@/layouts/header/MypageEditHeader';
5+
import MypageHeader from '@/layouts/header/MypageHeader';
6+
import UserPageHeader from '@/layouts/header/UserPageHeader';
47
import { useLocation } from 'react-router';
58

69
const HeaderWrapper = () => {
710
const { pathname } = useLocation();
811

912
if (pathname.startsWith('/user')) {
10-
return <HeaderWithBack showMoreOptions />;
13+
return <UserPageHeader />;
1114
}
1215

1316
if (pathname.startsWith('/chatroom')) {
@@ -19,7 +22,7 @@ const HeaderWrapper = () => {
1922
}
2023

2124
if (pathname === '/mypage') {
22-
return <Header showMoreOptions />;
25+
return <MypageHeader />;
2326
}
2427

2528
if (pathname === '/post') {
@@ -35,7 +38,7 @@ const HeaderWrapper = () => {
3538
}
3639

3740
if (pathname === '/mypage/edit') {
38-
return <HeaderWithBack text="내 정보 수정" showMoreOptions />;
41+
return <MypageEditHeader />;
3942
}
4043

4144
return <Header />;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { deleteAccount, getUserInfo } from '@/apis/user';
2+
import HeaderWithBack from '@/layouts/header/HeaderWithBack';
3+
import { useAuthStore } from '@/store/authStore';
4+
import { useModalStore } from '@/store/modalStore';
5+
import { useNavigate } from 'react-router';
6+
7+
const MypageEditHeader = () => {
8+
const navigate = useNavigate();
9+
const { logout } = useAuthStore();
10+
const { openModal, closeModal } = useModalStore();
11+
const handleDeleteAccount = async () => {
12+
try {
13+
const { code, data } = await getUserInfo();
14+
if (code === 200) {
15+
openModal({
16+
title: [
17+
{ text: data.nickName, className: 'text-primary-normal' },
18+
{ text: '님 떠나시는 건가요?' },
19+
],
20+
message: '탈퇴 버튼 선택 시, 모든 활동 정보가 삭제됩니다',
21+
confirmText: '탈퇴',
22+
onConfirm: async () => {
23+
try {
24+
const { code } = await deleteAccount();
25+
if (code === 200) {
26+
logout();
27+
useAuthStore.persist.clearStorage(); // 로컬스토리지에서 persist 데이터 삭제
28+
closeModal();
29+
navigate('/');
30+
}
31+
} catch (error) {
32+
console.log(error);
33+
}
34+
},
35+
onCancel: () => {
36+
closeModal();
37+
},
38+
});
39+
} else {
40+
throw new Error('정보를 불러오는 중 오류가 생겼습니다.');
41+
}
42+
} catch (error) {
43+
console.error(error);
44+
}
45+
};
46+
47+
const moreOptionsItems = [{ label: '탈퇴하기', onClick: handleDeleteAccount }];
48+
return <HeaderWithBack text="내 정보 수정" moreOptionsItems={moreOptionsItems} />;
49+
};
50+
51+
export default MypageEditHeader;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { postLogout } from '@/apis/auth';
2+
import Header from '@/layouts/header/Header';
3+
import { useAuthStore } from '@/store/authStore';
4+
import { useQueryClient } from '@tanstack/react-query';
5+
import { useNavigate } from 'react-router';
6+
7+
const MypageHeader = () => {
8+
const navigate = useNavigate();
9+
const queryClient = useQueryClient();
10+
const { logout } = useAuthStore();
11+
12+
const handleEditProfile = () => navigate('/mypage/edit');
13+
const handleBlockList = () => navigate('/mypage/blocklist');
14+
const handleLogout = async () => {
15+
try {
16+
const { code } = await postLogout();
17+
// 200이외에 code에서는 에러 처리
18+
if (code !== 200) {
19+
throw new Error('로그아웃 에러가 발생했습니다.');
20+
}
21+
} catch (error) {
22+
console.error(error);
23+
} finally {
24+
logout(); // 토큰 초기화
25+
useAuthStore.persist.clearStorage(); // 로컬스토리지에서 persist 데이터 삭제
26+
queryClient.removeQueries({ queryKey: ['myProfile'] }); // 프로필 정보 캐시 초기화
27+
queryClient.removeQueries({ queryKey: ['userPosts', 'me'] }); // 포스트 정보 캐시 초기화
28+
navigate('/');
29+
}
30+
};
31+
32+
const moreOptionsItems = [
33+
{ label: '프로필 수정', onClick: handleEditProfile },
34+
{ label: '차단 목록', onClick: handleBlockList },
35+
{ label: '로그아웃', onClick: handleLogout },
36+
];
37+
38+
return <Header moreOptionsItems={moreOptionsItems} />;
39+
};
40+
41+
export default MypageHeader;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { addBlockList } from '@/apis/blockList';
2+
import HeaderWithBack from '@/layouts/header/HeaderWithBack';
3+
import { useModalStore } from '@/store/modalStore';
4+
import { useUserStore } from '@/store/userStore';
5+
import { useNavigate, useParams } from 'react-router';
6+
7+
const UserPageHeader = () => {
8+
const navigate = useNavigate();
9+
const param = useParams();
10+
const { userData } = useUserStore(); // 차단할 유저 정보
11+
const { openModal, closeModal } = useModalStore();
12+
13+
const handleBlockUser = async () => {
14+
if (!param.userId) {
15+
console.log('차단 실패');
16+
return;
17+
}
18+
19+
openModal({
20+
title: [
21+
{ text: `${userData?.nickname}`, className: 'text-primary-normal' },
22+
{ text: ' 님을 차단할까요?' },
23+
],
24+
message: '차단된 사용자는 더이상 피드에 나타나지 않습니다',
25+
onConfirm: async () => {
26+
if (param.userId) {
27+
try {
28+
const data = await addBlockList(param.userId);
29+
console.log(data);
30+
//이미 차단 한 유저일 경우
31+
if (data.code === 400) {
32+
closeModal();
33+
openModal({
34+
title: `이미 차단한 유저입니다`,
35+
onConfirm: () => {
36+
closeModal();
37+
},
38+
});
39+
} else {
40+
//차단 후 홈으로 이동
41+
navigate('/home');
42+
closeModal();
43+
}
44+
} catch (error) {
45+
console.log(error);
46+
}
47+
}
48+
},
49+
onCancel: () => {
50+
closeModal();
51+
},
52+
});
53+
};
54+
const moreOptionsItems = [{ label: '차단', onClick: handleBlockUser }];
55+
return <HeaderWithBack moreOptionsItems={moreOptionsItems} />;
56+
};
57+
58+
export default UserPageHeader;

0 commit comments

Comments
 (0)