blob: 10e8efbb257ebf74ac7d818133295781f6dd9042 [file] [log] [blame]
22301009007da0e2025-04-15 21:24:46 +08001import React, { useState, useEffect } from 'react';
Krishyaf1d0ea82025-05-03 17:01:58 +08002import './Header.css';
223010095b28c672025-04-10 20:12:45 +08003import logo from '../assets/logo.png';
22301009df48f962025-06-05 13:40:44 +08004import { useUser } from '../context/UserContext';
223010095b28c672025-04-10 20:12:45 +08005
6const Header = () => {
22301009007da0e2025-04-15 21:24:46 +08007 const [currentPath, setCurrentPath] = useState(window.location.pathname);
22301009df48f962025-06-05 13:40:44 +08008 const { user } = useUser();
223010095b28c672025-04-10 20:12:45 +08009
22301009007da0e2025-04-15 21:24:46 +080010 const navLinks = [
11 { to: '/friend-moments', label: '好友动态' },
12 { to: '/forum', label: '论坛' },
13 { to: '/interest-groups', label: '兴趣小组' },
14 { to: '/seed-list', label: '种子列表' },
15 { to: '/publish-seed', label: '发布种子' },
16 ];
17
22301009007da0e2025-04-15 21:24:46 +080018 useEffect(() => {
19 const handleLocationChange = () => {
20 setCurrentPath(window.location.pathname);
21 };
22301009007da0e2025-04-15 21:24:46 +080022 window.addEventListener('popstate', handleLocationChange);
22301009007da0e2025-04-15 21:24:46 +080023 return () => {
24 window.removeEventListener('popstate', handleLocationChange);
25 };
26 }, []);
27
22301009007da0e2025-04-15 21:24:46 +080028 const isActive = (path) => currentPath.startsWith(path);
29
22301009007da0e2025-04-15 21:24:46 +080030 const handleLinkClick = (to) => {
31 window.history.pushState({}, '', to);
Krishyaf1d0ea82025-05-03 17:01:58 +080032 setCurrentPath(to);
22301009007da0e2025-04-15 21:24:46 +080033 };
223010095b28c672025-04-10 20:12:45 +080034
35 return (
36 <div className="main-page">
223010095b28c672025-04-10 20:12:45 +080037 <header className="header">
223010095b28c672025-04-10 20:12:45 +080038 <div className="logo-and-name">
39 <img src={logo} alt="网站 logo" className="logo" />
40 <span className="site-name">Echo</span>
41 </div>
223010095b28c672025-04-10 20:12:45 +080042 <div className="user-and-message">
22301009007da0e2025-04-15 21:24:46 +080043 <a href="/user/profile">
22301009df48f962025-06-05 13:40:44 +080044 <img
45 src={user?.avatarUrl}
46 alt="用户头像"
47 className="user-avatar"
48 />
22301009007da0e2025-04-15 21:24:46 +080049 </a>
22301009df48f962025-06-05 13:40:44 +080050 <span
51 className="message-center"
Krishyaf1d0ea82025-05-03 17:01:58 +080052 onClick={() => handleLinkClick('/messages')}
53 style={{ cursor: 'pointer' }}
54 >
55 消息
56 </span>
223010095b28c672025-04-10 20:12:45 +080057 </div>
58 </header>
22301009007da0e2025-04-15 21:24:46 +080059
223010095b28c672025-04-10 20:12:45 +080060 <nav className="nav">
22301009007da0e2025-04-15 21:24:46 +080061 {navLinks.map(({ to, label }) => (
22301009df48f962025-06-05 13:40:44 +080062 <a
63 key={to}
22301009007da0e2025-04-15 21:24:46 +080064 href={to}
65 onClick={(e) => {
Krishyaf1d0ea82025-05-03 17:01:58 +080066 e.preventDefault();
67 handleLinkClick(to);
22301009007da0e2025-04-15 21:24:46 +080068 }}
69 className={`nav-item ${isActive(to) ? 'active' : ''}`}
70 >
71 {label}
72 </a>
73 ))}
223010095b28c672025-04-10 20:12:45 +080074 </nav>
75 </div>
76 );
77};
78
79export default Header;