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

@@ -27,7 +27,7 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
selectedDate
}) => {
const router = useRouter();
const { waterStats, dailyWaterGoal, waterRecords, addWaterRecord } = useWaterDataByDate(selectedDate);
const { waterStats, dailyWaterGoal, waterRecords, addWaterRecord, getWaterRecordsByDate } = useWaterDataByDate(selectedDate);
const [quickWaterAmount, setQuickWaterAmount] = useState(150); // 默认值,将从用户偏好中加载
// 计算当前饮水量和目标
@@ -76,21 +76,25 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
// 判断是否是今天
const isToday = selectedDate === dayjs().format('YYYY-MM-DD') || !selectedDate;
// 加载用户偏好的快速添加饮水默认值
// 页面聚焦时重新加载数据
useFocusEffect(
useCallback(() => {
const loadQuickWaterAmount = async () => {
const loadDataOnFocus = async () => {
try {
// 重新加载快速添加饮水默认值
const amount = await getQuickWaterAmount();
setQuickWaterAmount(amount);
// 重新获取水数据以刷新显示
const targetDate = selectedDate || dayjs().format('YYYY-MM-DD');
await getWaterRecordsByDate(targetDate);
} catch (error) {
console.error('加载快速添加饮水默认值失败:', error);
// 保持默认值 250ml
console.error('页面聚焦时加载数据失败:', error);
}
};
loadQuickWaterAmount();
}, [])
loadDataOnFocus();
}, [selectedDate, getWaterRecordsByDate])
);
// 触发柱体动画
@@ -135,16 +139,16 @@ const WaterIntakeCard: React.FC<WaterIntakeCardProps> = ({
await addWaterRecord(waterAmount, recordedAt);
};
// 处理卡片点击 - 跳转到饮水设置页面
// 处理卡片点击 - 跳转到饮水详情页面
const handleCardPress = async () => {
// 触发震动反馈
if (process.env.EXPO_OS === 'ios') {
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
}
// 跳转到饮水设置页面,传递选中的日期参数
// 跳转到饮水详情页面,传递选中的日期参数
router.push({
pathname: '/water-settings',
pathname: '/water/detail',
params: selectedDate ? { selectedDate } : undefined
});
};