From 0f0c8131551812ae060f3d6ac926891b3e085b14 Mon Sep 17 00:00:00 2001 From: kiyeong Date: Tue, 3 Dec 2024 00:45:30 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=82=AC=EC=9D=B4=EB=93=9C=EB=B0=94=20?= =?UTF-8?q?=EB=82=B4=EC=A0=95=EB=B3=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/LoginPage/LoginPage.tsx | 2 +- src/pages/MainPage/Sidebar/Sidebar.tsx | 136 ++++++++++++++++++++----- 2 files changed, 109 insertions(+), 29 deletions(-) diff --git a/src/pages/LoginPage/LoginPage.tsx b/src/pages/LoginPage/LoginPage.tsx index cf7de22..a752268 100644 --- a/src/pages/LoginPage/LoginPage.tsx +++ b/src/pages/LoginPage/LoginPage.tsx @@ -59,7 +59,7 @@ const LoginPage: React.FC = () => { if (response.status === 200) { const data = await response.json(); - localStorage.setItem("accessToken", data.accessToken); + localStorage.setItem("accessToken", data.token); toast({ title: "로그인 성공!", status: "success", diff --git a/src/pages/MainPage/Sidebar/Sidebar.tsx b/src/pages/MainPage/Sidebar/Sidebar.tsx index 82c5a34..fd62f6c 100644 --- a/src/pages/MainPage/Sidebar/Sidebar.tsx +++ b/src/pages/MainPage/Sidebar/Sidebar.tsx @@ -24,6 +24,11 @@ export const Sidebar: React.FC = ({ isOpen, toggleSidebar }) => { const [selectedTab, setSelectedTab] = useState<"history" | "myInfo" | null>( null ); + const [userInfo, setUserInfo] = useState<{ + nickname: string; + joinedAt: string; + } | null>(null); + const [error, setError] = useState(null); useEffect(() => { const token = localStorage.getItem("accessToken"); @@ -35,8 +40,55 @@ export const Sidebar: React.FC = ({ isOpen, toggleSidebar }) => { } }, []); + useEffect(() => { + const fetchUserInfo = async () => { + const baseURL = import.meta.env.VITE_BASE_URL; // 환경변수에서 baseURL 가져오기 + const token = localStorage.getItem("accessToken"); // 로컬스토리지에서 토큰 가져오기 + + if (!token) { + setError("토큰이 없습니다."); + return; + } + + try { + const response = await fetch(`${baseURL}/api/member/info`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, // 토큰을 헤더에 추가 + }, + }); + + if (response.ok) { + const data = await response.json(); + setUserInfo(data); // API 응답 데이터를 상태에 저장 + } else if (response.status === 400) { + console.log("토큰 오류: 400"); + setError("토큰 오류: 400"); + } else if (response.status === 404) { + console.log("잘못된 사용자: 404"); + setError("잘못된 사용자: 404"); + } else { + console.log("알 수 없는 오류:", response.status); + setError(`알 수 없는 오류: ${response.status}`); + } + } catch (err) { + console.log("API 호출 에러:", err); + setError("API 호출 중 오류가 발생했습니다."); + } + }; + + fetchUserInfo(); + }, []); + const handleLogin = () => navigate("/login"); + // 로그아웃 핸들러 + const handleLogout = () => { + localStorage.removeItem("accessToken"); // accessToken 제거 + window.location.reload(); // 페이지 새로고침으로 GuestPage 렌더링 + }; + return ( = ({ isOpen, toggleSidebar }) => { {!hasAccessToken ? ( @@ -153,7 +209,6 @@ export const Sidebar: React.FC = ({ isOpen, toggleSidebar }) => { justifyContent="center" // Flex를 가로 방향으로 중앙 정렬 alignItems="center" // Flex를 세로 방향으로 중앙 정렬 mt={4} - width="100%" // 사이드바 너비를 가득 채움 > = ({ isOpen, toggleSidebar }) => { fontSize={{ base: "22px", md: "27px" }} fontWeight={100} letterSpacing={"0.2em"} - background="#B8433A" + background="#DD938D" borderRadius="10px" boxShadow="0 4px 6px rgba(0, 0, 0, 0.1)" overflow="hidden" // 버튼이 박스 바깥으로 나오지 않도록 설정 @@ -171,21 +226,17 @@ export const Sidebar: React.FC = ({ isOpen, toggleSidebar }) => { + )} {/* 학부 정보 */}