feat(water): 重构饮水模块并新增自定义提醒设置功能

- 新增饮水详情页面 `/water/detail` 展示每日饮水记录与统计
- 新增饮水设置页面 `/water/settings` 支持目标与快速添加配置
- 新增喝水提醒设置页面 `/water/reminder-settings` 支持自定义时间段与间隔
- 重构 `useWaterData` Hook,支持按日期查询与实时刷新
- 新增 `WaterNotificationHelpers.scheduleCustomWaterReminders` 实现个性化提醒
- 优化心情编辑页键盘体验,新增 `KeyboardAvoidingView` 与滚动逻辑
- 升级版本号至 1.0.14 并补充路由常量
- 补充用户偏好存储字段 `waterReminderEnabled/startTime/endTime/interval`
- 废弃后台定时任务中的旧版喝水提醒逻辑,改为用户手动管理
This commit is contained in:
richarjiang
2025-09-26 11:02:17 +08:00
parent badd68c039
commit a014998848
13 changed files with 1732 additions and 206 deletions

View File

@@ -1,4 +1,5 @@
import { deleteWaterIntakeFromHealthKit, getWaterIntakeFromHealthKit, saveWaterIntakeToHealthKit } from '@/utils/health';
import { logger } from '@/utils/logger';
import { Toast } from '@/utils/toast.utils';
import { getQuickWaterAmount, getWaterGoalFromStorage, setWaterGoalToStorage } from '@/utils/userPreferences';
import { refreshWidget, syncWaterDataToWidget } from '@/utils/widgetDataSync';
@@ -495,18 +496,25 @@ export const useWaterDataByDate = (targetDate?: string) => {
setError(null);
try {
logger.debug('🚰 开始获取饮水记录,日期:', date);
const options = createDateRange(date);
logger.debug('🚰 查询选项:', options);
const healthKitRecords = await getWaterIntakeFromHealthKit(options);
logger.debug('🚰 从HealthKit获取到的原始数据:', healthKitRecords);
// 转换数据格式并按时间排序
const convertedRecords = healthKitRecords
.map(convertHealthKitToWaterRecord)
.sort((a, b) => new Date(b.recordedAt).getTime() - new Date(a.recordedAt).getTime());
logger.debug('🚰 转换后的记录:', convertedRecords);
logger.debug('🚰 记录数量:', convertedRecords.length);
setWaterRecords(convertedRecords);
return convertedRecords;
} catch (error) {
console.error('获取饮水记录失败:', error);
console.error('🚰 获取饮水记录失败:', error);
setError('获取饮水记录失败');
Toast.error('获取饮水记录失败');
return [];
@@ -638,7 +646,11 @@ export const useWaterDataByDate = (targetDate?: string) => {
// 计算指定日期的统计数据
const waterStats = useMemo(() => {
logger.debug('🚰 计算waterStats - waterRecords:', waterRecords);
logger.debug('🚰 计算waterStats - dailyWaterGoal:', dailyWaterGoal);
if (!waterRecords || waterRecords.length === 0) {
logger.debug('🚰 没有饮水记录,返回默认值');
return {
totalAmount: 0,
completionRate: 0,
@@ -649,6 +661,10 @@ export const useWaterDataByDate = (targetDate?: string) => {
const totalAmount = waterRecords.reduce((total, record) => total + record.amount, 0);
const completionRate = dailyWaterGoal > 0 ? Math.min((totalAmount / dailyWaterGoal) * 100, 100) : 0;
logger.debug('🚰 计算结果 - totalAmount:', totalAmount);
logger.debug('🚰 计算结果 - completionRate:', completionRate);
logger.debug('🚰 计算结果 - recordCount:', waterRecords.length);
return {
totalAmount,
completionRate,