feat(membership): 实现会员系统和购买流程

- 创建 MembershipModalContext 统一管理会员弹窗
- 优化 MembershipModal 产品套餐展示和购买流程
- 集成 RevenueCat SDK 并初始化内购功能
- 在个人中心添加会员 Banner,引导非会员用户订阅
- 修复日志工具的循环引用问题,确保错误信息正确记录
- 版本更新至 1.0.20

新增了完整的会员购买流程,包括套餐选择、购买确认、购买恢复等功能。会员 Banner 仅对非会员用户展示,已是会员的用户不会看到。同时优化了错误日志记录,避免循环引用导致的序列化失败。
This commit is contained in:
richarjiang
2025-10-24 09:16:04 +08:00
parent b75a8991ac
commit 2e11f694f8
9 changed files with 437 additions and 186 deletions

63
utils/logger-test.ts Normal file
View File

@@ -0,0 +1,63 @@
// 简单的日志记录器测试文件
// 用于验证修复后的日志记录器是否能正确处理循环引用
import { log } from './logger';
// 测试循环引用对象
const createCircularObject = () => {
const obj: any = { name: 'test' };
obj.self = obj; // 创建循环引用
return obj;
};
// 测试 Error 对象
const createErrorObject = () => {
const error = new Error('Test error message');
error.name = 'TestError';
return error;
};
// 测试 RevenueCat 类型的错误对象
const createRevenueCatError = () => {
return {
code: 'PRODUCT_NOT_FOUND',
message: 'There is an issue with your configuration. Check the underlying error for more details. There are no products registered in the RevenueCat dashboard for your offerings.',
underlyingErrorMessage: 'No products found',
name: 'RevenueCatError'
};
};
// 运行测试
export const testLogger = async () => {
console.log('开始测试日志记录器...');
try {
// 测试1: 循环引用对象
console.log('测试1: 循环引用对象');
const circularObj = createCircularObject();
await log.info('测试循环引用对象', { data: circularObj });
// 测试2: Error 对象
console.log('测试2: Error 对象');
const errorObj = createErrorObject();
await log.error('测试 Error 对象', { error: errorObj });
// 测试3: RevenueCat 错误对象
console.log('测试3: RevenueCat 错误对象');
const revenueCatError = createRevenueCatError();
await log.error('测试 RevenueCat 错误', { error: revenueCatError });
// 测试4: 直接传递 Error 对象
console.log('测试4: 直接传递 Error 对象');
await log.error('测试直接传递 Error', createErrorObject());
console.log('所有测试完成!');
} catch (error) {
console.error('测试过程中出现错误:', error);
}
};
// 如果直接运行此文件,执行测试
if (require.main === module) {
testLogger();
}