feat(fasting): 重构断食通知系统并增强可靠性
- 新增 useFastingNotifications hook 统一管理通知状态和同步逻辑 - 实现四阶段通知提醒:开始前30分钟、开始时、结束前30分钟、结束时 - 添加通知验证机制,确保通知正确设置和避免重复 - 新增 NotificationErrorAlert 组件显示通知错误并提供重试选项 - 实现断食计划持久化存储,应用重启后自动恢复 - 添加开发者测试面板用于验证通知系统可靠性 - 优化通知同步策略,支持选择性更新减少不必要的操作 - 修复个人页面编辑按钮样式问题 - 更新应用版本号至 1.0.18
This commit is contained in:
@@ -7,7 +7,13 @@ import foodLibraryReducer from './foodLibrarySlice';
|
||||
import foodRecognitionReducer from './foodRecognitionSlice';
|
||||
import goalsReducer from './goalsSlice';
|
||||
import healthReducer from './healthSlice';
|
||||
import fastingReducer from './fastingSlice';
|
||||
import fastingReducer, {
|
||||
clearActiveSchedule,
|
||||
completeActiveSchedule,
|
||||
rescheduleActivePlan,
|
||||
scheduleFastingPlan,
|
||||
setRecommendedSchedule,
|
||||
} from './fastingSlice';
|
||||
import moodReducer from './moodSlice';
|
||||
import nutritionReducer from './nutritionSlice';
|
||||
import scheduleExerciseReducer from './scheduleExerciseSlice';
|
||||
@@ -16,6 +22,7 @@ import trainingPlanReducer from './trainingPlanSlice';
|
||||
import userReducer from './userSlice';
|
||||
import waterReducer from './waterSlice';
|
||||
import workoutReducer from './workoutSlice';
|
||||
import { persistActiveFastingSchedule } from '@/utils/fasting';
|
||||
|
||||
// 创建监听器中间件来处理自动同步
|
||||
const listenerMiddleware = createListenerMiddleware();
|
||||
@@ -45,6 +52,46 @@ syncActions.forEach(action => {
|
||||
});
|
||||
});
|
||||
|
||||
const persistFastingState = async (listenerApi: any) => {
|
||||
const state = listenerApi.getState() as { fasting?: { activeSchedule?: any } };
|
||||
await persistActiveFastingSchedule(state?.fasting?.activeSchedule ?? null);
|
||||
};
|
||||
|
||||
listenerMiddleware.startListening({
|
||||
actionCreator: scheduleFastingPlan,
|
||||
effect: async (_, listenerApi) => {
|
||||
await persistFastingState(listenerApi);
|
||||
},
|
||||
});
|
||||
|
||||
listenerMiddleware.startListening({
|
||||
actionCreator: rescheduleActivePlan,
|
||||
effect: async (_, listenerApi) => {
|
||||
await persistFastingState(listenerApi);
|
||||
},
|
||||
});
|
||||
|
||||
listenerMiddleware.startListening({
|
||||
actionCreator: completeActiveSchedule,
|
||||
effect: async (_, listenerApi) => {
|
||||
await persistFastingState(listenerApi);
|
||||
},
|
||||
});
|
||||
|
||||
listenerMiddleware.startListening({
|
||||
actionCreator: setRecommendedSchedule,
|
||||
effect: async (_, listenerApi) => {
|
||||
await persistFastingState(listenerApi);
|
||||
},
|
||||
});
|
||||
|
||||
listenerMiddleware.startListening({
|
||||
actionCreator: clearActiveSchedule,
|
||||
effect: async () => {
|
||||
await persistActiveFastingSchedule(null);
|
||||
},
|
||||
});
|
||||
|
||||
export const store = configureStore({
|
||||
reducer: {
|
||||
user: userReducer,
|
||||
|
||||
Reference in New Issue
Block a user