103 lines
3.1 KiB
JavaScript
103 lines
3.1 KiB
JavaScript
const api = require('../../utils/api');
|
|
|
|
Page({
|
|
data: {
|
|
statusBarHeight: 20,
|
|
navBarHeight: 44,
|
|
totalNavHeight: 64,
|
|
role: '',
|
|
level: '',
|
|
currentPackage: null,
|
|
loading: true
|
|
},
|
|
|
|
onLoad(options) {
|
|
const { role, level } = options;
|
|
const systemInfo = wx.getSystemInfoSync();
|
|
const statusBarHeight = systemInfo.statusBarHeight || 20;
|
|
const menuButton = wx.getMenuButtonBoundingClientRect();
|
|
const navBarHeight = menuButton.height + (menuButton.top - statusBarHeight) * 2;
|
|
|
|
this.setData({
|
|
statusBarHeight,
|
|
navBarHeight,
|
|
totalNavHeight: statusBarHeight + navBarHeight,
|
|
role: role || '',
|
|
level: level || ''
|
|
});
|
|
|
|
this.loadBenefits();
|
|
},
|
|
|
|
async loadBenefits() {
|
|
try {
|
|
const res = await api.payment.getPackages();
|
|
const body = res.data || {};
|
|
const list = Array.isArray(body) ? body : body?.data || [];
|
|
|
|
if (!list.length) {
|
|
this.setData({ loading: false });
|
|
return;
|
|
}
|
|
|
|
// 映射逻辑与 recharge.js 保持一致
|
|
const allPackages = list.map((p) => {
|
|
const attrs = p.attributes || {};
|
|
const benefits = p.benefits || attrs.benefits || [];
|
|
const gradientStart = p.gradientStart || attrs.gradient_start || '#60A5FA';
|
|
const gradientEnd = p.gradientEnd || attrs.gradient_end || '#2563EB';
|
|
const tagColor = p.tagColor || attrs.tag_color || '#1E3A8A';
|
|
|
|
let vipType = attrs.type || p.vipType || '';
|
|
if (vipType === 'monthly') vipType = 'month';
|
|
if (vipType === 'yearly') vipType = 'year';
|
|
if (vipType === 'lifetime') vipType = 'svip';
|
|
|
|
return {
|
|
id: p.id,
|
|
title: p.title,
|
|
subtitle: p.subtitle || attrs.subtitle || (benefits[0] || ''),
|
|
benefits,
|
|
vipType,
|
|
gradient: `background: linear-gradient(180deg, ${gradientStart}, ${gradientEnd});`,
|
|
iconGradient: `background: linear-gradient(180deg, ${gradientStart}, ${gradientEnd});`,
|
|
checkColor: tagColor || gradientEnd
|
|
};
|
|
});
|
|
|
|
// 根据 role 或 level 寻找匹配的套餐
|
|
let currentPackage = null;
|
|
|
|
if (this.data.role) {
|
|
// 优先根据 role 匹配 (soulmate, guardian, companion, listener)
|
|
currentPackage = allPackages.find(p => p.vipType === this.data.role);
|
|
}
|
|
|
|
if (!currentPackage && this.data.level) {
|
|
// 如果 role 没匹配到,尝试根据 levelText 匹配 (SVIP, VIP)
|
|
if (this.data.level === 'SVIP') {
|
|
currentPackage = allPackages.find(p => p.vipType === 'svip');
|
|
} else if (this.data.level === 'VIP') {
|
|
currentPackage = allPackages.find(p => p.vipType === 'month' || p.vipType === 'year');
|
|
}
|
|
}
|
|
|
|
// 如果还是没找到,默认取第一个(兜底)
|
|
if (!currentPackage && allPackages.length > 0) {
|
|
currentPackage = allPackages[0];
|
|
}
|
|
|
|
this.setData({
|
|
currentPackage,
|
|
loading: false
|
|
});
|
|
} catch (err) {
|
|
console.error('Failed to load benefits:', err);
|
|
this.setData({ loading: false });
|
|
}
|
|
},
|
|
|
|
onBack() {
|
|
wx.navigateBack({ delta: 1 });
|
|
}
|
|
}); |