Skip to content

Commit a574f17

Browse files
authored
Merge pull request #135 from Team-Waggle/feat/responsive-web
refactor: 회원 탈퇴 기능 추가
2 parents 0e5d25c + 666c3ae commit a574f17

4 files changed

Lines changed: 55 additions & 44 deletions

File tree

src/api/user.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,16 @@ export async function updateUserMe(
3131
return data;
3232
}
3333

34-
export async function deleteUserMe(): Promise<UserMeResponse> {
35-
const { data } = await axiosInstance.delete<UserMeResponse>(USER_ME_URL);
36-
return data;
34+
type BasicSuccessResponse = { success: boolean };
35+
36+
export async function deleteUserMe(): Promise<BasicSuccessResponse | UserMeResponse> {
37+
const res = await axiosInstance.delete(USER_ME_URL);
38+
39+
if (res.status === 204) {
40+
return { success: true };
41+
}
42+
43+
return res.data as UserMeResponse;
3744
}
3845

3946
export async function uploadUserProfileImage(

src/components/Modal/CancelModal.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import InputCheckbox from '../common/Checkbox/InputCheckbox';
1111
const CancelModal = ({
1212
// size = 'large', // 기본 크기는 large로 설정
1313
isOpen,
14+
handleDone,
1415
onClose,
1516
// CharacterComponent, // SVG 컴포넌트로 캐릭터 이미지 받기
1617
}: BaseModalProps) => {
@@ -62,7 +63,13 @@ const CancelModal = ({
6263
<BaseButton onClick={onClose} size="xl" color="line">
6364
취소
6465
</BaseButton>
65-
<BaseButton size="xl" color="primary">
66+
<BaseButton
67+
size="xl"
68+
color="primary"
69+
onClick={() => {
70+
handleDone?.();
71+
}}
72+
>
6673
확인
6774
</BaseButton>
6875
</div>

src/hooks/useUser.ts

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,27 @@ export function useUser() {
4141
[setUser],
4242
);
4343

44-
// 서버 오류, 500 에러 발생
45-
// 백엔드에 이야기 해두고 주석 해제 하도록 하겠습니다.
46-
// const deleteUser = useCallback(async () => {
47-
// try {
48-
// const res = await deleteUserMe();
49-
// if (res.success) {
50-
// clearUser();
51-
// clearAccessToken();
52-
// clearRefreshToken();
53-
// return true;
54-
// } else {
55-
// clearUser();
56-
// clearAccessToken();
57-
// clearRefreshToken();
58-
// throw new Error('탈퇴 처리 실패 (서버 응답)');
59-
// }
60-
// } catch (err) {
61-
// clearUser();
62-
// clearAccessToken();
63-
// clearRefreshToken();
64-
// throw err;
65-
// }
66-
// }, [clearUser, clearAccessToken, clearRefreshToken]);
44+
const deleteUser = useCallback(async () => {
45+
try {
46+
const res = await deleteUserMe();
47+
if (res.success) {
48+
clearUser();
49+
clearAccessToken();
50+
clearRefreshToken();
51+
return true;
52+
} else {
53+
clearUser();
54+
clearAccessToken();
55+
clearRefreshToken();
56+
throw new Error('탈퇴 처리 실패 (서버 응답)');
57+
}
58+
} catch (err) {
59+
clearUser();
60+
clearAccessToken();
61+
clearRefreshToken();
62+
throw err;
63+
}
64+
}, [clearUser, clearAccessToken, clearRefreshToken]);
6765

6866
const uploadProfileImage = useCallback(
6967
async (file: File) => {
@@ -82,6 +80,7 @@ export function useUser() {
8280
user,
8381
fetchUser,
8482
updateUser,
83+
deleteUser,
8584
uploadProfileImage,
8685
};
8786
}

src/pages/ProfileForm.tsx

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@ interface LinkRow {
3030
}
3131

3232
const ProfileForm = () => {
33-
// delete User 오류 해결 후 주석 해제
34-
// const { user, fetchUser, updateUser, deleteUser } = useUser();
35-
const { user, fetchUser, updateUser, uploadProfileImage } = useUser();
33+
const { user, fetchUser, updateUser, deleteUser, uploadProfileImage } = useUser();
3634
const [loading, setLoading] = useState(true);
3735

3836
const { id } = useParams();
@@ -193,19 +191,19 @@ const ProfileForm = () => {
193191
}
194192
};
195193

196-
// const handleDelete = async () => {
197-
// if (!confirm('정말 탈퇴하시겠습니까? 이 작업은 되돌릴 수 없습니다.'))
198-
// return;
199-
200-
// try {
201-
// await deleteUser();
202-
// alert('계정이 탈퇴되었습니다.');
203-
// navigate('/'); // 홈 또는 로그인 화면으로 리다이렉트
204-
// } catch (err) {
205-
// console.error('탈퇴 중 오류:', err);
206-
// alert('탈퇴 중 오류가 발생했습니다. 다시 시도해주세요.');
207-
// }
208-
// };
194+
const handleDelete = async () => {
195+
if (!confirm('정말 탈퇴하시겠습니까? 이 작업은 되돌릴 수 없습니다.'))
196+
return;
197+
198+
try {
199+
await deleteUser();
200+
alert('계정이 탈퇴되었습니다.');
201+
navigate('/');
202+
} catch (err) {
203+
console.error('탈퇴 중 오류:', err);
204+
alert('탈퇴 중 오류가 발생했습니다. 다시 시도해주세요.');
205+
}
206+
};
209207

210208
if (loading) return <div>로딩 중 ...</div>;
211209

@@ -371,7 +369,7 @@ const ProfileForm = () => {
371369
onClose={() => setOpenDeleteConfirm(false)}
372370
handleDone={() => {
373371
setOpenDeleteConfirm(false);
374-
// handleDelete();
372+
handleDelete();
375373
}}
376374
title="정말 탈퇴하시겠어요?"
377375
content="탈퇴 시 데이터가 삭제될 수 있으며 되돌릴 수 없습니다."

0 commit comments

Comments
 (0)