- 新增基础代谢详情页面,包含图表展示、数据缓存和防抖机制 - 优化HRV数据获取逻辑,支持实时、近期和历史数据的智能获取 - 移除WaterIntakeCard和WaterSettings中的登录验证逻辑 - 更新饮水数据管理hook,直接使用HealthKit数据 - 添加饮水目标存储和获取功能 - 更新依赖包版本
201 lines
7.6 KiB
TypeScript
201 lines
7.6 KiB
TypeScript
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',
|
||
} as const;
|
||
|
||
// 用户偏好设置接口
|
||
export interface UserPreferences {
|
||
quickWaterAmount: number;
|
||
waterGoal: number;
|
||
notificationEnabled: boolean;
|
||
fitnessExerciseMinutesInfoDismissed: boolean;
|
||
fitnessActiveHoursInfoDismissed: boolean;
|
||
}
|
||
|
||
// 默认的用户偏好设置
|
||
const DEFAULT_PREFERENCES: UserPreferences = {
|
||
quickWaterAmount: 150, // 默认快速添加饮水量为 150ml
|
||
waterGoal: 2000, // 默认每日饮水目标为 2000ml
|
||
notificationEnabled: true, // 默认开启消息推送
|
||
fitnessExerciseMinutesInfoDismissed: false, // 默认显示锻炼分钟说明
|
||
fitnessActiveHoursInfoDismissed: false, // 默认显示活动小时说明
|
||
};
|
||
|
||
/**
|
||
* 获取用户偏好设置
|
||
*/
|
||
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,
|
||
};
|
||
} catch (error) {
|
||
console.error('获取用户偏好设置失败:', error);
|
||
return DEFAULT_PREFERENCES;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 设置快速添加饮水的默认值
|
||
* @param amount 饮水量(毫升)
|
||
*/
|
||
export const setQuickWaterAmount = async (amount: number): Promise<void> => {
|
||
try {
|
||
// 确保值在合理范围内(50ml - 1000ml)
|
||
const validAmount = Math.max(50, Math.min(1000, amount));
|
||
await AsyncStorage.setItem(PREFERENCES_KEYS.QUICK_WATER_AMOUNT, validAmount.toString());
|
||
} catch (error) {
|
||
console.error('设置快速添加饮水默认值失败:', error);
|
||
throw error;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 获取快速添加饮水的默认值
|
||
*/
|
||
export const getQuickWaterAmount = async (): Promise<number> => {
|
||
try {
|
||
const amount = await AsyncStorage.getItem(PREFERENCES_KEYS.QUICK_WATER_AMOUNT);
|
||
return amount ? parseInt(amount, 10) : DEFAULT_PREFERENCES.quickWaterAmount;
|
||
} catch (error) {
|
||
console.error('获取快速添加饮水默认值失败:', error);
|
||
return DEFAULT_PREFERENCES.quickWaterAmount;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 设置每日饮水目标
|
||
* @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 是否开启消息推送
|
||
*/
|
||
export const setNotificationEnabled = async (enabled: boolean): Promise<void> => {
|
||
try {
|
||
await AsyncStorage.setItem(PREFERENCES_KEYS.NOTIFICATION_ENABLED, enabled.toString());
|
||
} catch (error) {
|
||
console.error('设置消息推送开关失败:', error);
|
||
throw error;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 获取消息推送开关状态
|
||
*/
|
||
export const getNotificationEnabled = async (): Promise<boolean> => {
|
||
try {
|
||
const enabled = await AsyncStorage.getItem(PREFERENCES_KEYS.NOTIFICATION_ENABLED);
|
||
return enabled !== null ? enabled === 'true' : DEFAULT_PREFERENCES.notificationEnabled;
|
||
} catch (error) {
|
||
console.error('获取消息推送开关状态失败:', error);
|
||
return DEFAULT_PREFERENCES.notificationEnabled;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 设置健身锻炼分钟说明已阅读状态
|
||
* @param dismissed 是否已阅读
|
||
*/
|
||
export const setFitnessExerciseMinutesInfoDismissed = async (dismissed: boolean): Promise<void> => {
|
||
try {
|
||
await AsyncStorage.setItem(PREFERENCES_KEYS.FITNESS_EXERCISE_MINUTES_INFO_DISMISSED, dismissed.toString());
|
||
} catch (error) {
|
||
console.error('设置健身锻炼分钟说明已阅读状态失败:', error);
|
||
throw error;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 获取健身锻炼分钟说明已阅读状态
|
||
*/
|
||
export const getFitnessExerciseMinutesInfoDismissed = async (): Promise<boolean> => {
|
||
try {
|
||
const dismissed = await AsyncStorage.getItem(PREFERENCES_KEYS.FITNESS_EXERCISE_MINUTES_INFO_DISMISSED);
|
||
return dismissed !== null ? dismissed === 'true' : DEFAULT_PREFERENCES.fitnessExerciseMinutesInfoDismissed;
|
||
} catch (error) {
|
||
console.error('获取健身锻炼分钟说明已阅读状态失败:', error);
|
||
return DEFAULT_PREFERENCES.fitnessExerciseMinutesInfoDismissed;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 设置健身活动小时说明已阅读状态
|
||
* @param dismissed 是否已阅读
|
||
*/
|
||
export const setFitnessActiveHoursInfoDismissed = async (dismissed: boolean): Promise<void> => {
|
||
try {
|
||
await AsyncStorage.setItem(PREFERENCES_KEYS.FITNESS_ACTIVE_HOURS_INFO_DISMISSED, dismissed.toString());
|
||
} catch (error) {
|
||
console.error('设置健身活动小时说明已阅读状态失败:', error);
|
||
throw error;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 获取健身活动小时说明已阅读状态
|
||
*/
|
||
export const getFitnessActiveHoursInfoDismissed = async (): Promise<boolean> => {
|
||
try {
|
||
const dismissed = await AsyncStorage.getItem(PREFERENCES_KEYS.FITNESS_ACTIVE_HOURS_INFO_DISMISSED);
|
||
return dismissed !== null ? dismissed === 'true' : DEFAULT_PREFERENCES.fitnessActiveHoursInfoDismissed;
|
||
} catch (error) {
|
||
console.error('获取健身活动小时说明已阅读状态失败:', error);
|
||
return DEFAULT_PREFERENCES.fitnessActiveHoursInfoDismissed;
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 重置所有用户偏好设置为默认值
|
||
*/
|
||
export const resetUserPreferences = async (): Promise<void> => {
|
||
try {
|
||
await AsyncStorage.removeItem(PREFERENCES_KEYS.QUICK_WATER_AMOUNT);
|
||
await AsyncStorage.removeItem(PREFERENCES_KEYS.NOTIFICATION_ENABLED);
|
||
await AsyncStorage.removeItem(PREFERENCES_KEYS.FITNESS_EXERCISE_MINUTES_INFO_DISMISSED);
|
||
await AsyncStorage.removeItem(PREFERENCES_KEYS.FITNESS_ACTIVE_HOURS_INFO_DISMISSED);
|
||
} catch (error) {
|
||
console.error('重置用户偏好设置失败:', error);
|
||
throw error;
|
||
}
|
||
}; |