feat(membership): 重构会员系统架构并优化VIP卡片显示

- 创建独立的会员服务模块 services/membership.ts,统一管理会员计划元数据和工具函数
- 新增 membershipSlice Redux状态管理,集中处理会员数据和状态
- 重构个人中心VIP会员卡片,支持动态显示会员计划和有效期
- 优化会员购买弹窗,使用统一的会员计划配置
- 改进会员数据获取流程,确保状态同步和一致性
This commit is contained in:
richarjiang
2025-10-29 16:08:58 +08:00
parent fcf1be211f
commit 7cd290d341
7 changed files with 569 additions and 114 deletions

View File

@@ -2,7 +2,8 @@ import React, { createContext, useCallback, useContext, useEffect, useMemo, useS
import Purchases from 'react-native-purchases';
import { MembershipModal } from '@/components/model/MembershipModal';
import { useAppSelector } from '@/hooks/redux';
import { useAppDispatch, useAppSelector } from '@/hooks/redux';
import { fetchMembershipData } from '@/store/membershipSlice';
import { selectUserProfile } from '@/store/userSlice';
import { logger } from '@/utils/logger';
@@ -18,6 +19,7 @@ interface MembershipModalContextValue {
const MembershipModalContext = createContext<MembershipModalContextValue | null>(null);
export function MembershipModalProvider({ children }: { children: React.ReactNode }) {
const dispatch = useAppDispatch();
const [visible, setVisible] = useState(false);
const [pendingSuccessCallback, setPendingSuccessCallback] = useState<(() => void) | undefined>();
const [isInitialized, setIsInitialized] = useState(false);
@@ -46,6 +48,7 @@ export function MembershipModalProvider({ children }: { children: React.ReactNod
await Purchases.configure(configOptions);
setIsInitialized(true);
logger.info('[MembershipModalProvider] RevenueCat SDK 初始化成功');
dispatch(fetchMembershipData());
}
} catch (error) {
logger.error('[MembershipModalProvider] RevenueCat SDK 初始化失败:', error);
@@ -54,7 +57,7 @@ export function MembershipModalProvider({ children }: { children: React.ReactNod
};
initializeRevenueCat();
}, [isInitialized, userProfile?.id]);
}, [dispatch, isInitialized, userProfile?.id]);
// 监听用户登录状态变化在用户登录后更新RevenueCat的用户标识
useEffect(() => {
@@ -70,14 +73,17 @@ export function MembershipModalProvider({ children }: { children: React.ReactNod
console.log('[MembershipModalProvider] 更新RevenueCat用户标识:', userProfile.id);
await Purchases.logIn(userProfile.id);
}
dispatch(fetchMembershipData());
} catch (error) {
console.error('[MembershipModalProvider] 更新RevenueCat用户标识失败:', error);
}
} else if (isInitialized && !userProfile?.id) {
dispatch(fetchMembershipData());
}
};
updateRevenueCatUser();
}, [userProfile?.id, isInitialized]);
}, [dispatch, userProfile?.id, isInitialized]);
const openMembershipModal = useCallback((options?: MembershipModalOptions) => {
setPendingSuccessCallback(() => options?.onPurchaseSuccess);