Files
2026-02-14 15:38:48 +08:00

82 lines
2.3 KiB
JavaScript

import request from '../../../../utils/request';
Page({
data: {
dimensions: [],
achievedMap: {},
isLoading: true,
selectedBadge: null,
showDetail: false,
activeTab: 0
},
onLoad() {
this.fetchData();
},
switchTab(e) {
const index = e.currentTarget.dataset.index;
if (index !== undefined) {
this.setData({ activeTab: index });
}
},
async fetchData() {
this.setData({ isLoading: true });
wx.showLoading({ title: '加载中...' });
try {
// Parallel Fetch: Config Tree & User Badges
const [treeRes, userBadgesRes] = await Promise.all([
request.get('/config/badge/tree'),
request.get('/profile/badge')
]);
const list = Array.isArray(treeRes) ? treeRes : (treeRes.data || []);
// Extract user badge list from response structure { list: [...] }
let userBadgeList = [];
if (Array.isArray(userBadgesRes)) {
userBadgeList = userBadgesRes;
} else if (userBadgesRes && Array.isArray(userBadgesRes.list)) {
userBadgeList = userBadgesRes.list;
} else if (userBadgesRes && userBadgesRes.data) {
userBadgeList = userBadgesRes.data || [];
}
// Populate Achieved Map using Badge ID (not Record ID)
let achievedMap = {};
userBadgeList.forEach(b => {
const badgeId = b.badgeId || (b.badge ? b.badge.id : null);
if (badgeId) {
achievedMap[badgeId] = b;
}
});
this.setData({
dimensions: list,
achievedMap
});
} catch (e) {
console.error('Fetch badge data failed', e);
wx.showToast({ title: '加载失败', icon: 'none' });
} finally {
this.setData({ isLoading: false });
wx.hideLoading();
}
},
onBadgeTap(e) {
const badge = e.currentTarget.dataset.badge;
this.setData({
selectedBadge: badge,
showDetail: true
});
},
closeDetail() {
this.setData({ showDetail: false });
},
noop() { }
});