| import React, { useEffect, useState } from 'react'; | |
| import { useNavigate, useLocation } from 'react-router-dom'; | |
| import { notificationApi } from '../../api/notification'; | |
| import './personalSubpage.css'; | |
| const Notice = ({ onLogout }) => { | |
| const navigate = useNavigate(); | |
| const location = useLocation(); | |
| const [notices, setNotices] = useState([]); | |
| const [loading, setLoading] = useState(true); | |
| const [error, setError] = useState(null); | |
| // 获取当前用户ID(根据你的实际应用获取方式) | |
| const userId = localStorage.getItem('username') || 'default-user-id'; | |
| // 获取通知列表 | |
| const fetchNotifications = async () => { | |
| try { | |
| setLoading(true); | |
| const response = await notificationApi.getNotifications(userId); | |
| setNotices(response.data.notifications || []); | |
| } catch (err) { | |
| setError('获取通知失败,请稍后重试'); | |
| console.error(err); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| useEffect(() => { | |
| fetchNotifications(); | |
| }, [userId]); | |
| const handleBack = () => { | |
| navigate('/personal', { | |
| state: { | |
| fromSubpage: true, | |
| dashboardTab: location.state?.dashboardTab | |
| }, | |
| replace: true | |
| }); | |
| }; | |
| // 标记为已读处理 | |
| const handleMarkAsRead = async (id) => { | |
| try { | |
| const result = await notificationApi.markNotificationAsRead(id); | |
| if (result.success) { | |
| // 使用后端返回的更新后通知替换本地状态 | |
| setNotices(prevNotices => | |
| prevNotices.map(notice => | |
| notice.id === id ? result.notification : notice | |
| ) | |
| ); | |
| } else { | |
| setError(result.message || '标记为已读失败'); | |
| } | |
| } catch (err) { | |
| console.error('标记为已读失败:', err); | |
| setError('标记为已读失败,请稍后重试'); | |
| } | |
| }; | |
| const handleItemClick = (notice) => { | |
| if (!notice.isRead) { | |
| handleMarkAsRead(notice.id); | |
| } | |
| // 这里可以添加其他点击逻辑,比如展开详情等 | |
| }; | |
| return ( | |
| <div className="subpage-container"> | |
| <button className="back-button" onClick={handleBack}> | |
| 返回个人中心 | |
| </button> | |
| <h2 className="page-title">消息通知</h2> | |
| {loading && <div className="loading-message">加载中...</div>} | |
| {error && <div className="error-message">{error}</div>} | |
| <div className="notice-list"> | |
| {notices.length === 0 && !loading ? ( | |
| <div className="empty-notice">暂无通知</div> | |
| ) : ( | |
| notices.map(notice => ( | |
| <div | |
| key={notice.id} | |
| className={`list-item ${!notice.isRead ? 'unread' : ''}`} | |
| onClick={() => handleItemClick(notice)} | |
| > | |
| <div className="notice-header"> | |
| <h3>{notice.title}</h3> | |
| <span className="notice-date"> | |
| {new Date(notice.date).toLocaleDateString()} | |
| {!notice.isRead && <span className="unread-badge">未读</span>} | |
| </span> | |
| </div> | |
| <p className="notice-content">{notice.content}</p> | |
| </div> | |
| )) | |
| )} | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default Notice; |