82 lines
2.3 KiB
JavaScript
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() { }
|
|
});
|