98 lines
2.7 KiB
JavaScript
98 lines
2.7 KiB
JavaScript
/**
|
|
* 通知中心页 U25
|
|
*/
|
|
const api = require('../../utils/api');
|
|
|
|
Page({
|
|
data: {
|
|
notifications: [],
|
|
unreadCount: 0,
|
|
loading: true,
|
|
page: 1,
|
|
hasMore: true
|
|
},
|
|
|
|
onLoad() {
|
|
this.loadNotifications();
|
|
},
|
|
|
|
onShow() {
|
|
this.loadUnreadCount();
|
|
},
|
|
|
|
async loadNotifications() {
|
|
this.setData({ loading: true });
|
|
try {
|
|
const token = wx.getStorageSync('accessToken');
|
|
const res = await api.get(
|
|
`/notifications?page=${this.data.page}&pageSize=20`,
|
|
{},
|
|
{ Authorization: `Bearer ${token}` }
|
|
);
|
|
if (res) {
|
|
const isNewPage = this.data.page === 1;
|
|
this.setData({
|
|
notifications: isNewPage ? res.notifications : [...this.data.notifications, ...res.notifications],
|
|
unreadCount: res.unreadCount,
|
|
hasMore: res.notifications.length >= 20,
|
|
loading: false
|
|
});
|
|
}
|
|
} catch (err) {
|
|
this.setData({ loading: false });
|
|
}
|
|
},
|
|
|
|
async loadUnreadCount() {
|
|
try {
|
|
const token = wx.getStorageSync('accessToken');
|
|
const res = await api.get('/notifications/unread-count', {}, { Authorization: `Bearer ${token}` });
|
|
this.setData({ unreadCount: res?.unreadCount || 0 });
|
|
} catch (e) { /* ignore */ }
|
|
},
|
|
|
|
async onMarkRead(e) {
|
|
const notificationId = e.currentTarget.dataset.id;
|
|
try {
|
|
const token = wx.getStorageSync('accessToken');
|
|
await api.put(`/notifications/${notificationId}/read`, {}, { Authorization: `Bearer ${token}` });
|
|
this.setData({
|
|
notifications: this.data.notifications.map(n =>
|
|
n.notificationId === notificationId ? { ...n, read: true } : n
|
|
),
|
|
unreadCount: Math.max(0, this.data.unreadCount - 1)
|
|
});
|
|
} catch (err) { /* ignore */ }
|
|
},
|
|
|
|
async onMarkAllRead() {
|
|
try {
|
|
const token = wx.getStorageSync('accessToken');
|
|
await api.put('/notifications/read-all', {}, { Authorization: `Bearer ${token}` });
|
|
this.setData({ unreadCount: 0 });
|
|
} catch (err) { /* ignore */ }
|
|
},
|
|
|
|
async onReachBottom() {
|
|
if (this.data.hasMore && !this.data.loading) {
|
|
this.setData({ page: this.data.page + 1 });
|
|
this.loadNotifications();
|
|
}
|
|
},
|
|
|
|
onPullDownRefresh() {
|
|
this.setData({ page: 1 });
|
|
this.loadNotifications().then(() => wx.stopPullDownRefresh());
|
|
},
|
|
|
|
formatTime(ts) {
|
|
if (!ts) return '';
|
|
const d = new Date(ts);
|
|
const now = new Date();
|
|
if (d.toDateString() === now.toDateString()) {
|
|
return d.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });
|
|
}
|
|
return `${d.getMonth() + 1}/${d.getDate()} ${d.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' })}`;
|
|
}
|
|
});
|