blob: e0a849579621880659ca9bb313ce4f02f51f1fda [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';
223010093d8132e2025-06-07 11:34:38 +08005import { BookOpen } from '@icon-park/react'; // 导入图标组件
223010095b28c672025-04-10 20:12:45 +08006
7const Header = () => {
22301009007da0e2025-04-15 21:24:46 +08008 const [currentPath, setCurrentPath] = useState(window.location.pathname);
22301009df48f962025-06-05 13:40:44 +08009 const { user } = useUser();
223010095b28c672025-04-10 20:12:45 +080010
22301009007da0e2025-04-15 21:24:46 +080011 const navLinks = [
12 { to: '/friend-moments', label: '好友动态' },
13 { to: '/forum', label: '论坛' },
14 { to: '/interest-groups', label: '兴趣小组' },
15 { to: '/seed-list', label: '种子列表' },
16 { to: '/publish-seed', label: '发布种子' },
17 ];
18
22301009007da0e2025-04-15 21:24:46 +080019 useEffect(() => {
20 const handleLocationChange = () => {
21 setCurrentPath(window.location.pathname);
22 };
22301009007da0e2025-04-15 21:24:46 +080023 window.addEventListener('popstate', handleLocationChange);
22301009007da0e2025-04-15 21:24:46 +080024 return () => {
25 window.removeEventListener('popstate', handleLocationChange);
26 };
27 }, []);
28
22301009007da0e2025-04-15 21:24:46 +080029 const isActive = (path) => currentPath.startsWith(path);
30
22301009007da0e2025-04-15 21:24:46 +080031 const handleLinkClick = (to) => {
32 window.history.pushState({}, '', to);
Krishyaf1d0ea82025-05-03 17:01:58 +080033 setCurrentPath(to);
22301009007da0e2025-04-15 21:24:46 +080034 };
223010095b28c672025-04-10 20:12:45 +080035
36 return (
37 <div className="main-page">
223010095b28c672025-04-10 20:12:45 +080038 <header className="header">
223010095b28c672025-04-10 20:12:45 +080039 <div className="logo-and-name">
40 <img src={logo} alt="网站 logo" className="logo" />
41 <span className="site-name">Echo</span>
42 </div>
223010093d8132e2025-06-07 11:34:38 +080043 <div className="user-and-message" style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
44 {/* 新手指南图标,放在头像左边 */}
45 <button
46 className="guide-button"
47 onClick={() => handleLinkClick('/new-user-guide')}
48 title="新手指南"
49 >
50 <BookOpen theme="outline" size="20" fill="#fff" />
51 <span style={{ marginLeft: '6px' }}>新手指南</span>
52 </button>
53
54
22301009007da0e2025-04-15 21:24:46 +080055 <a href="/user/profile">
22301009df48f962025-06-05 13:40:44 +080056 <img
57 src={user?.avatarUrl}
58 alt="用户头像"
59 className="user-avatar"
60 />
22301009007da0e2025-04-15 21:24:46 +080061 </a>
22301009df48f962025-06-05 13:40:44 +080062 <span
63 className="message-center"
Krishyaf1d0ea82025-05-03 17:01:58 +080064 onClick={() => handleLinkClick('/messages')}
65 style={{ cursor: 'pointer' }}
66 >
67 消息
68 </span>
223010095b28c672025-04-10 20:12:45 +080069 </div>
70 </header>
22301009007da0e2025-04-15 21:24:46 +080071
223010095b28c672025-04-10 20:12:45 +080072 <nav className="nav">
22301009007da0e2025-04-15 21:24:46 +080073 {navLinks.map(({ to, label }) => (
22301009df48f962025-06-05 13:40:44 +080074 <a
75 key={to}
22301009007da0e2025-04-15 21:24:46 +080076 href={to}
77 onClick={(e) => {
Krishyaf1d0ea82025-05-03 17:01:58 +080078 e.preventDefault();
79 handleLinkClick(to);
22301009007da0e2025-04-15 21:24:46 +080080 }}
81 className={`nav-item ${isActive(to) ? 'active' : ''}`}
82 >
83 {label}
84 </a>
85 ))}
223010095b28c672025-04-10 20:12:45 +080086 </nav>
87 </div>
88 );
89};
90
91export default Header;