From e5e0bea9a30cba0ab2530c8d5fd1af7651c157ac Mon Sep 17 00:00:00 2001 From: Lee JaeJun Date: Thu, 1 Feb 2024 23:51:49 +0900 Subject: [PATCH] =?UTF-8?q?Add:=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/layout/header/index.tsx | 81 +++++++++---------------- src/components/signIn/utils/getToken.ts | 5 ++ src/components/signIn/utils/logout.ts | 10 +++ 3 files changed, 43 insertions(+), 53 deletions(-) create mode 100644 src/components/signIn/utils/logout.ts diff --git a/src/components/layout/header/index.tsx b/src/components/layout/header/index.tsx index ae319a98..9040bc19 100644 --- a/src/components/layout/header/index.tsx +++ b/src/components/layout/header/index.tsx @@ -2,17 +2,18 @@ import { Link, useNavigate } from 'react-router-dom'; import styles from './index.module.scss'; import classNames from 'classnames/bind'; import { useEffect, useRef, useState } from 'react'; -import { instance } from '@/api/client'; -import { AxiosError } from 'axios'; -import { userState } from '@/store/store'; import { useRecoilState } from 'recoil'; +import { authState } from '@/recoil/authState'; +import { MENU_ITEMS } from '@/constants/menus'; +import toast from 'react-hot-toast'; +import { signOut } from '@/components/signIn/utils/logout'; type MenuType = 'community' | 'study' | 'project' | 'portfolio'; const Header = () => { const [selectedMenu, setSelectedMenu] = useState(null); const [isMenuOpen, setIsMenuOpen] = useState(false); - const [user, setUser] = useRecoilState(userState); + const [user, setUser] = useRecoilState(authState); const navigate = useNavigate(); const cx = classNames.bind(styles); @@ -54,17 +55,12 @@ const Header = () => { }; const handleLogout = async () => { - try { - const response = await instance.get('api/v1/logout'); - if (response.status === 200) { - setUser({ ...user, isLogin: false }); - navigate('/signin'); - } - } catch (error) { - if (error instanceof AxiosError) { - throw error; - } - } + setUser({ memberId: null, email: null, nickname: null, image: null, loggedIn: false }); + toast.promise(signOut(), { + loading: '잠시만 기다려주세요', + success: '로그아웃 되었습니다.', + error: '로그아웃에 실패했습니다', + }); }; return ( @@ -78,7 +74,7 @@ const Header = () => {
{ className={cx(['user-modal'], { open: isMenuOpen })} onClick={() => setIsMenuOpen(false)} > - {user.isLogin ? ( + {user.loggedIn ? ( <> -
+
{/* TODO: settings로 주소 바꾸기 */} 계정
-
+
{/* 로그아웃이 완료 되면서 게시글 페이지로 이동 */} 로그아웃
{user.nickname}
@@ -100,10 +96,10 @@ const Header = () => { ) : ( <> -
+
로그인
-
+
회원가입
@@ -113,38 +109,17 @@ const Header = () => {
    -
  • - 소근소근 -
  • -
  • - 스터디 -
  • -
  • - 프로젝트 -
  • -
  • - 포트폴리오 -
  • + {MENU_ITEMS.map((menu) => ( +
  • + {menu.name} +
  • + ))}
diff --git a/src/components/signIn/utils/getToken.ts b/src/components/signIn/utils/getToken.ts index 92f6f37c..0988427f 100644 --- a/src/components/signIn/utils/getToken.ts +++ b/src/components/signIn/utils/getToken.ts @@ -8,3 +8,8 @@ export const setTokenToLocalStorage = (accessToken: string, refreshToken: string localStorage.setItem('access_token', accessToken); localStorage.setItem('refresh_token', refreshToken); }; + +export const removeTokens = () => { + localStorage.removeItem('access_token'); + localStorage.removeItem('refresh_token'); +}; diff --git a/src/components/signIn/utils/logout.ts b/src/components/signIn/utils/logout.ts new file mode 100644 index 00000000..8e18f862 --- /dev/null +++ b/src/components/signIn/utils/logout.ts @@ -0,0 +1,10 @@ +import { removeTokens } from './getToken'; + +export const signOut = () => { + return new Promise((res) => { + setTimeout(() => { + removeTokens(); + res(true); + }, 1000); + }); +};