2026-03-31 18:09:37 +08:00

300 lines
7.3 KiB
JavaScript

const { API } = require('../../utils/constants');
const { request } = require('../../utils/http');
const { formatDateTime, eventStatusText, eventFormatText } = require('../../utils/format');
Page({
data: {
sectionTab: 'list',
loggedIn: false,
banners: [],
rows: [],
loading: false,
loadingText: '加载中...',
pageNo: 1,
pageSize: 10,
hasMore: true,
status: 1,
keyword: '',
refresherTriggered: false
},
onLoad() {
this.fetchBanners();
this.loadEvents(true);
},
onShow() {
const loggedIn = !!(wx.getStorageSync('accessToken') || '');
this.setData({ loggedIn });
if (this.data.sectionTab === 'registered' && loggedIn) {
this.loadMyEvents(true);
}
},
/** 页面 disableScroll 后,下拉刷新由 scroll-view 的 refresher 承担 */
onRefresherRefresh() {
this.setData({ refresherTriggered: true });
this.fetchBanners();
const p =
this.data.sectionTab === 'list'
? this.loadEvents(true)
: this.loadMyEvents(true);
p.finally(() => {
this.setData({ refresherTriggered: false });
});
},
onPullDownRefresh() {
this.fetchBanners();
const p =
this.data.sectionTab === 'list'
? this.loadEvents(true)
: this.loadMyEvents(true);
p.finally(() => {
wx.stopPullDownRefresh();
});
},
fetchBanners() {
request({
path: API.banners,
method: 'GET',
needAuth: false
})
.then((data) => {
this.setData({
banners: Array.isArray(data) ? data : []
});
})
.catch(() => {
this.setData({ banners: [] });
});
},
onSectionTab(e) {
const tab = e.currentTarget.dataset.tab;
if (!tab || tab === this.data.sectionTab) return;
this.setData({
sectionTab: tab,
pageNo: 1,
rows: [],
hasMore: true
});
if (tab === 'list') {
this.loadEvents(true);
} else {
this.loadMyEvents(true);
}
},
onStatusTap(e) {
const status = Number(e.currentTarget.dataset.status);
this.setData({
status,
pageNo: 1,
rows: [],
hasMore: true
});
this.loadEvents(true);
},
onKeywordInput(e) {
this.setData({ keyword: e.detail.value || '' });
},
onSearch() {
if (this.data.sectionTab !== 'list') {
this.setData({ sectionTab: 'list', pageNo: 1, rows: [], hasMore: true });
}
this.setData({
pageNo: 1,
rows: [],
hasMore: true
});
this.loadEvents(true);
},
onScrollToLower() {
if (this.data.loading || !this.data.hasMore) return;
if (this.data.sectionTab === 'list') {
const next = this.data.pageNo + 1;
this.setData({ pageNo: next });
this.loadEvents(false);
} else {
if (!this.data.loggedIn) return;
const next = this.data.pageNo + 1;
this.setData({ pageNo: next });
this.loadMyEvents(false);
}
},
goLogin() {
wx.navigateTo({ url: '/subpackages/mine/login/login' });
},
onBannerTap(e) {
const linkType = e.currentTarget.dataset.linktype;
const eventId = e.currentTarget.dataset.eventid;
const linkUrl = e.currentTarget.dataset.linkurl;
if (linkType === 'Event' && eventId) {
wx.navigateTo({ url: `/pages/detail/detail?id=${eventId}` });
return;
}
if (linkUrl) {
wx.showToast({ title: '该轮播链接为外部链接/其他跳转,请在后台配置', icon: 'none' });
}
},
onEventTap(e) {
const id = Number(e.currentTarget.dataset.id);
if (!id) return;
wx.navigateTo({ url: `/pages/detail/detail?id=${id}` });
},
loadEvents(reset) {
if (this.data.loading) return Promise.resolve();
if (reset) {
this.setData({
rows: [],
pageNo: 1,
hasMore: true
});
}
this.setData({ loading: true });
const pageNo = reset ? 1 : this.data.pageNo;
const pageSize = this.data.pageSize;
const status = this.data.status;
const keyword = this.data.keyword;
return request({
path: API.eventList,
method: 'GET',
needAuth: false,
data: {
page: pageNo,
pagesize: pageSize,
PageNo: pageNo,
PageSize: pageSize,
status,
Status: status,
keyword,
Keyword: keyword
}
})
.then((res) => {
const rows = (res && Array.isArray(res.rows) ? res.rows : []).map((item) => {
const id = item.id;
return {
...item,
rowKey: `e-${id}`,
registrationStartText: formatDateTime(item.registrationStartTime),
registrationEndText: formatDateTime(item.registrationEndTime),
matchStartText: formatDateTime(item.matchStartTime),
matchEndText: formatDateTime(item.matchEndTime),
eventStatusText: eventStatusText(item.eventStatus),
eventFormatText: eventFormatText(item.eventType || item.eventFormat)
};
});
const nextRows = reset ? rows : this.data.rows.concat(rows);
const pages = res && typeof res.pages === 'number' ? res.pages : 1;
const hasMore = pageNo < pages && rows.length > 0;
this.setData({
rows: nextRows,
hasMore,
loading: false,
loadingText: hasMore ? '加载中...' : '没有更多了'
});
})
.catch((err) => {
this.setData({
loading: false,
hasMore: false,
rows: reset ? [] : this.data.rows,
loadingText: err && err.message ? err.message : '加载失败'
});
});
},
loadMyEvents(reset) {
if (!this.data.loggedIn) {
this.setData({ rows: [], loading: false });
return Promise.resolve();
}
if (this.data.loading) return Promise.resolve();
if (reset) {
this.setData({
rows: [],
pageNo: 1,
hasMore: true
});
}
this.setData({ loading: true });
const pageNo = reset ? 1 : this.data.pageNo;
const pageSize = this.data.pageSize;
return request({
path: API.eventMyList,
method: 'GET',
needAuth: true,
data: {
page: pageNo,
pagesize: pageSize,
PageNo: pageNo,
PageSize: pageSize
}
})
.then((res) => {
const rows = (res && Array.isArray(res.rows) ? res.rows : []).map((item) => {
const eid = item.eventId;
const rid = item.registrationId;
return {
id: eid,
rowKey: `m-${rid}`,
eventName: item.eventName,
coverImage: item.coverImage,
address: '',
eventStatusText: '已报名',
registrationTimeText: formatDateTime(item.registrationTime),
projectCount: item.projectCount,
eventFormatText: ''
};
});
const nextRows = reset ? rows : this.data.rows.concat(rows);
const pages = res && typeof res.pages === 'number' ? res.pages : 1;
const hasMore = pageNo < pages && rows.length > 0;
this.setData({
rows: nextRows,
hasMore,
loading: false,
loadingText: hasMore ? '加载中...' : '没有更多了'
});
})
.catch(() => {
this.setData({
loading: false,
hasMore: false,
rows: reset ? [] : this.data.rows,
loadingText: '加载失败'
});
});
}
});