feat(vip): 实现VIP服务权限控制和食物识别功能限制

- 添加VIP服务权限检查hook,支持免费使用次数限制
- 为食物识别功能添加登录验证和VIP权限检查
- 优化RevenueCat用户标识同步逻辑
- 修复会员购买状态检查的类型安全问题
- 为营养成分分析添加登录验证
This commit is contained in:
richarjiang
2025-10-29 09:44:30 +08:00
parent eaa7f7275c
commit fcf1be211f
5 changed files with 196 additions and 15 deletions

View File

@@ -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);