feat: 新增基础代谢详情页面并优化HRV数据获取逻辑

- 新增基础代谢详情页面,包含图表展示、数据缓存和防抖机制
- 优化HRV数据获取逻辑,支持实时、近期和历史数据的智能获取
- 移除WaterIntakeCard和WaterSettings中的登录验证逻辑
- 更新饮水数据管理hook,直接使用HealthKit数据
- 添加饮水目标存储和获取功能
- 更新依赖包版本
This commit is contained in:
richarjiang
2025-09-25 14:15:42 +08:00
parent 83e534c4a7
commit 79ab354f31
12 changed files with 1563 additions and 702 deletions

View File

@@ -3,6 +3,7 @@ import AsyncStorage from '@/utils/kvStore';
// 用户偏好设置的存储键
const PREFERENCES_KEYS = {
QUICK_WATER_AMOUNT: 'user_preference_quick_water_amount',
WATER_GOAL: 'user_preference_water_goal',
NOTIFICATION_ENABLED: 'user_preference_notification_enabled',
FITNESS_EXERCISE_MINUTES_INFO_DISMISSED: 'user_preference_fitness_exercise_minutes_info_dismissed',
FITNESS_ACTIVE_HOURS_INFO_DISMISSED: 'user_preference_fitness_active_hours_info_dismissed',
@@ -11,6 +12,7 @@ const PREFERENCES_KEYS = {
// 用户偏好设置接口
export interface UserPreferences {
quickWaterAmount: number;
waterGoal: number;
notificationEnabled: boolean;
fitnessExerciseMinutesInfoDismissed: boolean;
fitnessActiveHoursInfoDismissed: boolean;
@@ -19,6 +21,7 @@ export interface UserPreferences {
// 默认的用户偏好设置
const DEFAULT_PREFERENCES: UserPreferences = {
quickWaterAmount: 150, // 默认快速添加饮水量为 150ml
waterGoal: 2000, // 默认每日饮水目标为 2000ml
notificationEnabled: true, // 默认开启消息推送
fitnessExerciseMinutesInfoDismissed: false, // 默认显示锻炼分钟说明
fitnessActiveHoursInfoDismissed: false, // 默认显示活动小时说明
@@ -30,12 +33,14 @@ const DEFAULT_PREFERENCES: UserPreferences = {
export const getUserPreferences = async (): Promise<UserPreferences> => {
try {
const quickWaterAmount = await AsyncStorage.getItem(PREFERENCES_KEYS.QUICK_WATER_AMOUNT);
const waterGoal = await AsyncStorage.getItem(PREFERENCES_KEYS.WATER_GOAL);
const notificationEnabled = await AsyncStorage.getItem(PREFERENCES_KEYS.NOTIFICATION_ENABLED);
const fitnessExerciseMinutesInfoDismissed = await AsyncStorage.getItem(PREFERENCES_KEYS.FITNESS_EXERCISE_MINUTES_INFO_DISMISSED);
const fitnessActiveHoursInfoDismissed = await AsyncStorage.getItem(PREFERENCES_KEYS.FITNESS_ACTIVE_HOURS_INFO_DISMISSED);
return {
quickWaterAmount: quickWaterAmount ? parseInt(quickWaterAmount, 10) : DEFAULT_PREFERENCES.quickWaterAmount,
waterGoal: waterGoal ? parseInt(waterGoal, 10) : DEFAULT_PREFERENCES.waterGoal,
notificationEnabled: notificationEnabled !== null ? notificationEnabled === 'true' : DEFAULT_PREFERENCES.notificationEnabled,
fitnessExerciseMinutesInfoDismissed: fitnessExerciseMinutesInfoDismissed !== null ? fitnessExerciseMinutesInfoDismissed === 'true' : DEFAULT_PREFERENCES.fitnessExerciseMinutesInfoDismissed,
fitnessActiveHoursInfoDismissed: fitnessActiveHoursInfoDismissed !== null ? fitnessActiveHoursInfoDismissed === 'true' : DEFAULT_PREFERENCES.fitnessActiveHoursInfoDismissed,
@@ -74,6 +79,34 @@ export const getQuickWaterAmount = async (): Promise<number> => {
}
};
/**
* 设置每日饮水目标
* @param goal 饮水目标(毫升)
*/
export const setWaterGoalToStorage = async (goal: number): Promise<void> => {
try {
// 确保值在合理范围内500ml - 5000ml
const validGoal = Math.max(500, Math.min(5000, goal));
await AsyncStorage.setItem(PREFERENCES_KEYS.WATER_GOAL, validGoal.toString());
} catch (error) {
console.error('设置每日饮水目标失败:', error);
throw error;
}
};
/**
* 获取每日饮水目标
*/
export const getWaterGoalFromStorage = async (): Promise<number> => {
try {
const goal = await AsyncStorage.getItem(PREFERENCES_KEYS.WATER_GOAL);
return goal ? parseInt(goal, 10) : DEFAULT_PREFERENCES.waterGoal;
} catch (error) {
console.error('获取每日饮水目标失败:', error);
return DEFAULT_PREFERENCES.waterGoal;
}
};
/**
* 设置消息推送开关
* @param enabled 是否开启消息推送