blob: 05198f9f0b35c861566627aeec7f3b5fb915aae5 [file] [log] [blame]
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;