Skip to content

Commit bb639cd

Browse files
committed
로그인/회원가입 UI 개선
1 parent 10589f4 commit bb639cd

File tree

6 files changed

+222
-157
lines changed

6 files changed

+222
-157
lines changed

src/App.js

Lines changed: 40 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { HashRouter, Route, Routes } from "react-router-dom";
2-
import { useState, useEffect } from "react";
1+
import { HashRouter, Routes, Route, useLocation } from "react-router-dom";
2+
import { useEffect, useState } from "react";
33

44
import Header from "./components/header/Header";
55
import Footer from "./components/footer/Footer";
@@ -19,65 +19,30 @@ import MyCommunity from "./components/mypage/MyCommunity";
1919
import ScrollToTop from "./components/common/ScrollToTop";
2020
import CommunityWrite from "./components/community/CommunityWrite";
2121

22-
23-
function App() {
22+
function AppContent() {
23+
const location = useLocation();
2424
const [isDark, setIsDark] = useState(false);
25-
26-
// 로그인 상태 관리 추가
2725
const [isLoggedIn, setIsLoggedIn] = useState(false);
2826
const [nickname, setNickname] = useState('');
27+
const [isLoginModalOpen, setIsLoginModalOpen] = useState(false);
28+
29+
const isSignupPage = location.pathname === "/signup";
2930

30-
// 로그인 상태 확인
3131
useEffect(() => {
3232
const token = localStorage.getItem('token');
3333
const storedUsername = localStorage.getItem('username');
34-
35-
console.log('🔍 App.js 로그인 상태 확인:', { token: !!token, username: storedUsername });
36-
3734
if (token && storedUsername) {
3835
setIsLoggedIn(true);
3936
setNickname(storedUsername);
40-
console.log('✅ App.js에서 로그인 상태로 설정됨');
4137
} else {
4238
setIsLoggedIn(false);
4339
setNickname('');
44-
console.log('❌ App.js에서 비로그인 상태로 설정됨');
4540
}
4641
}, []);
4742

48-
// 로그인 상태 변경을 감지하기 위한 이벤트 리스너 (선택사항)
49-
useEffect(() => {
50-
const handleStorageChange = () => {
51-
const token = localStorage.getItem('token');
52-
const storedUsername = localStorage.getItem('username');
53-
54-
if (token && storedUsername) {
55-
setIsLoggedIn(true);
56-
setNickname(storedUsername);
57-
} else {
58-
setIsLoggedIn(false);
59-
setNickname('');
60-
}
61-
};
62-
63-
// storage 이벤트 리스너 추가
64-
window.addEventListener('storage', handleStorageChange);
65-
66-
// 클린업
67-
return () => {
68-
window.removeEventListener('storage', handleStorageChange);
69-
};
70-
}, []);
71-
72-
useEffect(() => {
73-
document.body.classList.toggle("dark-mode", isDark);
74-
}, [isDark]);
75-
7643
useEffect(() => {
7744
const savedTheme = localStorage.getItem("theme");
78-
if (savedTheme === "dark") {
79-
setIsDark(true);
80-
}
45+
if (savedTheme === "dark") setIsDark(true);
8146
}, []);
8247

8348
useEffect(() => {
@@ -86,29 +51,29 @@ function App() {
8651
}, [isDark]);
8752

8853
return (
89-
<HashRouter>
90-
<Header
91-
isDark={isDark}
92-
setIsDark={setIsDark}
93-
isLoggedIn={isLoggedIn}
94-
nickname={nickname}
95-
/>
54+
<>
55+
{!isSignupPage && (
56+
<Header
57+
isDark={isDark}
58+
setIsDark={setIsDark}
59+
isLoggedIn={isLoggedIn}
60+
nickname={nickname}
61+
onLoginModalOpen={() => setIsLoginModalOpen(true)}
62+
/>
63+
)}
64+
9665
<ScrollToTop />
66+
9767
<Routes>
9868
<Route path="/" element={<Main />} />
99-
<Route path="/login" element={<Login />} />
10069
<Route path="/signup" element={<SignUp />} />
101-
10270
<Route path="/ide" element={<IDE />} />
10371
<Route path="/ide/:param" element={<IDE />} />
10472
<Route path="/ide/:language/:filename" element={<IDE />} />
105-
10673
<Route path="/community" element={<Community />} />
107-
<Route path="/community/write" element={<CommunityWrite />} /> {/* ✅ 추가 */}
108-
74+
<Route path="/community/write" element={<CommunityWrite />} />
10975
<Route path="/broadcast" element={<Codecast />} />
11076
<Route path="/startbroadcast" element={<StartCodecast />} />
111-
11277
<Route path="/mypage" element={<MyPageLayout nickname={nickname} />}>
11378
<Route index element={<Mypage nickname={nickname} />} />
11479
<Route path="project" element={<MyProject />} />
@@ -118,9 +83,25 @@ function App() {
11883
</Route>
11984
</Routes>
12085

121-
<Footer />
122-
</HashRouter>
86+
{!isSignupPage && <Footer />}
87+
88+
{isLoginModalOpen && (
89+
<Login
90+
onClose={() => setIsLoginModalOpen(false)}
91+
onLoginSuccess={() => {
92+
setIsLoggedIn(true);
93+
setNickname(localStorage.getItem('username') || '');
94+
}}
95+
/>
96+
)}
97+
</>
12398
);
12499
}
125100

126-
export default App;
101+
export default function App() {
102+
return (
103+
<HashRouter>
104+
<AppContent />
105+
</HashRouter>
106+
);
107+
}

src/components/header/Header.css

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -73,34 +73,43 @@
7373
}
7474

7575
/* 로그인/회원가입 버튼 */
76+
/* 공통 버튼 스타일 */
7677
.btn {
77-
padding: 6px 12px;
78-
font-size: 14px;
79-
border-radius: 4px;
78+
display: inline-block;
79+
padding: 0.5rem 1.2rem;
80+
font-size: 1rem;
81+
font-weight: 500;
82+
border-radius: 6px;
8083
text-decoration: none;
8184
transition: all 0.2s ease;
85+
cursor: pointer;
8286
}
8387

88+
/* 테두리형 (로그인) */
8489
.btn-outline {
85-
border: 1px solid #6a0dad;
86-
color: #6a0dad;
90+
color: #6a1b9a;
91+
border: 1px solid #6a1b9a;
8792
background-color: transparent;
8893
}
8994

9095
.btn-outline:hover {
91-
background-color: #f5f0ff;
96+
background-color: #f3e5f5;
9297
}
9398

99+
/* 채움형 (회원가입) */
94100
.btn-filled {
95-
background-color: #6a0dad;
101+
background-color: #6a1b9a;
96102
color: white;
97-
border: none;
103+
border: 1px solid #6a1b9a;
98104
}
99105

100106
.btn-filled:hover {
101-
background-color: #5a0099;
107+
background-color: #8e24aa;
108+
border-color: #8e24aa;
102109
}
103110

111+
112+
104113
.user-menu-container {
105114
position: relative; /* 드롭다운 위치 기준 */
106115
}
@@ -194,48 +203,45 @@
194203

195204
.user-dropdown {
196205
position: absolute;
197-
right: 30px;
206+
right: 0;
198207
top: 100%;
208+
margin-top: 8px;
199209
background-color: white;
200-
border: 1px solid #ddd;
201-
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
210+
border: 1px solid #ccc;
202211
border-radius: 6px;
203-
z-index: 1001;
204-
min-width: 100px;
205-
width: 120px; /* ✅ 자동 너비로 조정 */
206-
padding: 4px 0;
212+
min-width: 120px; /* ✅ 너비 고정 */
213+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
214+
z-index: 100;
215+
display: flex;
216+
flex-direction: column;
217+
align-items: center; /* 버튼 너비가 줄었을 때 가운데 정렬 효과 보강 */
207218
}
208219

209220
.user-dropdown button {
210-
padding: 9px 1px;
221+
padding: 0.5rem 0.75rem;
222+
text-align: center;
211223
background: none;
212224
border: none;
213-
font-size: 14px;
214-
color: #333;
225+
font-size: 1rem;
215226
cursor: pointer;
216-
text-align: center;
217-
width: 100%; /* ✅ 여기 유지해도 드롭다운 너비만 좁히면 괜찮음 */
218-
white-space: nowrap; /* ✅ 줄바꿈 방지 */
219-
font-weight: 600;
227+
transition: background-color 0.2s ease;
220228
}
221229

222-
230+
/* ✅ Hover 효과 추가 */
223231
.user-dropdown button:hover {
224-
background-color: #f5f0ff;
232+
background-color: #f5f5f5;
225233
}
226234

227-
228-
235+
/* 🌙 다크모드 대응 */
229236
.dark-mode .user-dropdown {
230237
background-color: #2a2a2a;
231238
border-color: #444;
232239
}
233240

234241
.dark-mode .user-dropdown button {
235-
color: #ccc;
236-
font-weight: 600;
242+
color: #f0f0f0;
237243
}
238244

239245
.dark-mode .user-dropdown button:hover {
240-
background-color: #333;
241-
}
246+
background-color: #3a3a3a;
247+
}

src/components/header/Header.jsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { NavLink, Link, useNavigate, useLocation } from "react-router-dom";
33
import { FaMoon, FaSun, FaUserCircle } from "react-icons/fa";
44
import "./Header.css";
55

6-
const Header = ({ isDark, setIsDark, isLoggedIn, nickname }) => {
6+
const Header = ({ isDark, setIsDark, isLoggedIn, nickname, onLoginModalOpen }) => {
77
const [isMenuOpen, setIsMenuOpen] = useState(false);
88
const navigate = useNavigate();
99
const location = useLocation(); // ✅ 현재 경로 확인
@@ -20,7 +20,6 @@ const Header = ({ isDark, setIsDark, isLoggedIn, nickname }) => {
2020
window.location.reload(); // 상태 강제 반영
2121
};
2222

23-
2423
const toggleMenu = () => {
2524
setIsMenuOpen(!isMenuOpen);
2625
};
@@ -67,13 +66,9 @@ const Header = ({ isDark, setIsDark, isLoggedIn, nickname }) => {
6766
</div>
6867
) : (
6968
<>
70-
<Link
71-
to="/login"
72-
state={{ from: location.pathname }} // ✅ 현재 경로 전달
73-
className="btn btn-outline"
74-
>
69+
<button onClick={onLoginModalOpen} className="btn btn-outline">
7570
로그인
76-
</Link>
71+
</button>
7772
<Link to="/signup" className="btn btn-filled">
7873
회원가입
7974
</Link>

0 commit comments

Comments
 (0)