feat(vip): 实现VIP服务权限控制和食物识别功能限制
- 添加VIP服务权限检查hook,支持免费使用次数限制 - 为食物识别功能添加登录验证和VIP权限检查 - 优化RevenueCat用户标识同步逻辑 - 修复会员购买状态检查的类型安全问题 - 为营养成分分析添加登录验证
This commit is contained in:
@@ -2,6 +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 { selectUserProfile } from '@/store/userSlice';
|
||||
import { logger } from '@/utils/logger';
|
||||
|
||||
type MembershipModalOptions = {
|
||||
@@ -20,6 +22,9 @@ export function MembershipModalProvider({ children }: { children: React.ReactNod
|
||||
const [pendingSuccessCallback, setPendingSuccessCallback] = useState<(() => void) | undefined>();
|
||||
const [isInitialized, setIsInitialized] = useState(false);
|
||||
|
||||
// 获取用户信息,用于RevenueCat用户标识
|
||||
const userProfile = useAppSelector(selectUserProfile);
|
||||
|
||||
useEffect(() => {
|
||||
// 直接使用生产环境的 API Key,避免环境变量问题
|
||||
const iosApiKey = 'appl_lmVvuLWFlXlrEsnvxMzTnKapqcc';
|
||||
@@ -28,18 +33,51 @@ export function MembershipModalProvider({ children }: { children: React.ReactNod
|
||||
try {
|
||||
// 检查是否已经配置过,避免重复配置
|
||||
if (!isInitialized) {
|
||||
await Purchases.configure({ apiKey: iosApiKey });
|
||||
// 如果有用户ID,在配置时传入用户标识
|
||||
const configOptions: any = { apiKey: iosApiKey };
|
||||
|
||||
if (userProfile?.id) {
|
||||
configOptions.appUserID = userProfile.id;
|
||||
logger.info('[MembershipModalProvider] RevenueCat SDK 初始化,使用用户ID:', userProfile.id);
|
||||
} else {
|
||||
logger.info('[MembershipModalProvider] RevenueCat SDK 初始化,未设置用户ID');
|
||||
}
|
||||
|
||||
await Purchases.configure(configOptions);
|
||||
setIsInitialized(true);
|
||||
console.log('[MembershipModalProvider] RevenueCat SDK 初始化成功');
|
||||
logger.info('[MembershipModalProvider] RevenueCat SDK 初始化成功');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[MembershipModalProvider] RevenueCat SDK 初始化失败:', error);
|
||||
logger.error('[MembershipModalProvider] RevenueCat SDK 初始化失败:', error);
|
||||
// 初始化失败时不阻止应用正常运行
|
||||
}
|
||||
};
|
||||
|
||||
initializeRevenueCat();
|
||||
}, [isInitialized]);
|
||||
}, [isInitialized, userProfile?.id]);
|
||||
|
||||
// 监听用户登录状态变化,在用户登录后更新RevenueCat的用户标识
|
||||
useEffect(() => {
|
||||
const updateRevenueCatUser = async () => {
|
||||
if (isInitialized && userProfile?.id) {
|
||||
try {
|
||||
// 检查当前RevenueCat的用户标识
|
||||
const customerInfo = await Purchases.getCustomerInfo();
|
||||
const currentAppUserID = customerInfo.originalAppUserId;
|
||||
|
||||
// 如果当前用户ID与RevenueCat中的用户ID不同,则更新
|
||||
if (currentAppUserID !== userProfile.id) {
|
||||
console.log('[MembershipModalProvider] 更新RevenueCat用户标识:', userProfile.id);
|
||||
await Purchases.logIn(userProfile.id);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[MembershipModalProvider] 更新RevenueCat用户标识失败:', error);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
updateRevenueCatUser();
|
||||
}, [userProfile?.id, isInitialized]);
|
||||
|
||||
const openMembershipModal = useCallback((options?: MembershipModalOptions) => {
|
||||
setPendingSuccessCallback(() => options?.onPurchaseSuccess);
|
||||
|
||||
Reference in New Issue
Block a user