Skip to content

Commit 4ae470d

Browse files
committed
improve user profile dropdown UI in header
1 parent 63f6b5d commit 4ae470d

3 files changed

Lines changed: 34 additions & 12 deletions

File tree

frontend/src/App.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import ProductDetail from './components/ProductDetail'
66
import { ALL_PRODUCTS } from './data/products'
77
import { motion, AnimatePresence } from 'framer-motion'
88
import { X, ShoppingBag, Heart, User, Trash2 } from 'lucide-react'
9-
import { GoogleLogin } from '@react-oauth/google'
10-
import { jwtDecode } from 'jwt-decode'
9+
import { GoogleLogin, googleLogout } from '@react-oauth/google'
1110

1211
function App() {
1312
const [selectedCategories, setSelectedCategories] = useState([]);
@@ -281,7 +280,8 @@ const Overlay = ({ type, onClose, cartItems, wishlistItems, onRemoveFromCart, on
281280
<div className="google-btn-wrap">
282281
<GoogleLogin
283282
onSuccess={(credentialResponse) => {
284-
const decoded = jwtDecode(credentialResponse.credential);
283+
const base64 = credentialResponse.credential.split('.')[1];
284+
const decoded = JSON.parse(atob(base64));
285285
onLoginSuccess(decoded);
286286
onClose();
287287
}}

frontend/src/components/Header.jsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Search, ShoppingCart, Heart, User, Menu, X } from 'lucide-react';
44
const Header = ({ onOpenOverlay, onNavigate, cartCount, wishlistCount, activeNav, loggedInUser, onLogout }) => {
55
const [isSearchFocused, setIsSearchFocused] = useState(false);
66
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
7+
const [showUserMenu, setShowUserMenu] = useState(false);
78

89
return (
910
<header className="sticky-header glass">
@@ -52,10 +53,25 @@ const Header = ({ onOpenOverlay, onNavigate, cartCount, wishlistCount, activeNav
5253

5354
<div className="user-actions">
5455
{loggedInUser ? (
55-
<div className="user-profile-btn">
56-
<img src={loggedInUser.picture} alt={loggedInUser.name} className="user-avatar" />
57-
<span className="user-name">{loggedInUser.name.split(' ')[0]}</span>
58-
<button className="logout-btn" onClick={onLogout}>Logout</button>
56+
<div className="user-profile-wrap">
57+
<button className="user-avatar-btn" onClick={() => setShowUserMenu(!showUserMenu)}>
58+
<img src={loggedInUser.picture} alt={loggedInUser.name} className="user-avatar" />
59+
</button>
60+
{showUserMenu && (
61+
<div className="user-dropdown">
62+
<div className="user-dropdown-info">
63+
<img src={loggedInUser.picture} alt={loggedInUser.name} className="user-avatar-lg" />
64+
<div>
65+
<p className="user-dropdown-name">{loggedInUser.name}</p>
66+
<p className="user-dropdown-email">{loggedInUser.email}</p>
67+
</div>
68+
</div>
69+
<hr className="dropdown-divider" />
70+
<button className="dropdown-logout" onClick={() => { onLogout(); setShowUserMenu(false); }}>
71+
Logout
72+
</button>
73+
</div>
74+
)}
5975
</div>
6076
) : (
6177
<button className="action-btn" title="Profile" onClick={() => onOpenOverlay('login')}>

frontend/src/index.css

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,8 +1006,14 @@ ul {
10061006
.google-btn-wrap > div { width: 100% !important; }
10071007

10081008
/* User Profile in Header */
1009-
.user-profile-btn { display: flex; align-items: center; gap: 8px; }
1010-
.user-avatar { width: 32px; height: 32px; border-radius: 50%; object-fit: cover; }
1011-
.user-name { font-size: 13px; font-weight: 600; }
1012-
.logout-btn { font-size: 12px; background: none; border: 1px solid #ddd; border-radius: 6px; padding: 4px 10px; cursor: pointer; color: #666; }
1013-
.logout-btn:hover { border-color: #e85d04; color: #e85d04; }
1009+
.user-profile-wrap { position: relative; }
1010+
.user-avatar-btn { background: none; border: none; cursor: pointer; padding: 0; border-radius: 50%; }
1011+
.user-avatar { width: 36px; height: 36px; border-radius: 50%; object-fit: cover; border: 2px solid #e85d04; }
1012+
.user-avatar-lg { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; }
1013+
.user-dropdown { position: absolute; right: 0; top: calc(100% + 10px); background: #fff; border-radius: 14px; box-shadow: 0 8px 30px rgba(0,0,0,0.12); padding: 16px; min-width: 220px; z-index: 999; }
1014+
.user-dropdown-info { display: flex; align-items: center; gap: 12px; }
1015+
.user-dropdown-name { font-weight: 700; font-size: 14px; margin: 0; }
1016+
.user-dropdown-email { font-size: 12px; color: #888; margin: 2px 0 0; }
1017+
.dropdown-divider { border: none; border-top: 1px solid #f0f0f0; margin: 12px 0; }
1018+
.dropdown-logout { width: 100%; background: #fff0e6; color: #e85d04; border: none; border-radius: 8px; padding: 9px; font-weight: 600; font-size: 13px; cursor: pointer; }
1019+
.dropdown-logout:hover { background: #e85d04; color: #fff; }

0 commit comments

Comments
 (0)