feat(membership): 重构会员系统架构并优化VIP卡片显示
- 创建独立的会员服务模块 services/membership.ts,统一管理会员计划元数据和工具函数 - 新增 membershipSlice Redux状态管理,集中处理会员数据和状态 - 重构个人中心VIP会员卡片,支持动态显示会员计划和有效期 - 优化会员购买弹窗,使用统一的会员计划配置 - 改进会员数据获取流程,确保状态同步和一致性
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user