- 在训练计划中新增训练项目的添加、更新和删除功能,支持用户灵活管理训练内容 - 优化训练计划排课界面,提升用户体验 - 更新打卡功能,支持按日期加载和展示打卡记录 - 删除不再使用的打卡相关页面,简化代码结构 - 新增今日训练页面,集成今日训练计划和动作展示 - 更新样式以适应新功能的展示和交互
56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
import { configureStore, createListenerMiddleware } from '@reduxjs/toolkit';
|
||
import challengeReducer from './challengeSlice';
|
||
import checkinReducer, { addExercise, autoSyncCheckin, removeExercise, replaceExercises, setNote, toggleExerciseCompleted } from './checkinSlice';
|
||
import exerciseLibraryReducer from './exerciseLibrarySlice';
|
||
import scheduleExerciseReducer from './scheduleExerciseSlice';
|
||
import trainingPlanReducer from './trainingPlanSlice';
|
||
import userReducer from './userSlice';
|
||
import workoutReducer from './workoutSlice';
|
||
|
||
// 创建监听器中间件来处理自动同步
|
||
const listenerMiddleware = createListenerMiddleware();
|
||
|
||
// 监听所有数据变动的 actions,触发自动同步
|
||
const syncActions = [addExercise, removeExercise, replaceExercises, toggleExerciseCompleted, setNote];
|
||
syncActions.forEach(action => {
|
||
listenerMiddleware.startListening({
|
||
actionCreator: action,
|
||
effect: async (action, listenerApi) => {
|
||
const state = listenerApi.getState() as any;
|
||
const date = action.payload?.date;
|
||
|
||
if (!date) return;
|
||
|
||
// 延迟一下,避免在同一事件循环中重复触发
|
||
await new Promise(resolve => setTimeout(resolve, 100));
|
||
|
||
// 检查是否还有待同步的日期
|
||
const currentState = listenerApi.getState() as any;
|
||
const pendingSyncDates = currentState?.checkin?.pendingSyncDates || [];
|
||
|
||
if (pendingSyncDates.includes(date)) {
|
||
listenerApi.dispatch(autoSyncCheckin({ date }));
|
||
}
|
||
},
|
||
});
|
||
});
|
||
|
||
export const store = configureStore({
|
||
reducer: {
|
||
user: userReducer,
|
||
challenge: challengeReducer,
|
||
checkin: checkinReducer,
|
||
trainingPlan: trainingPlanReducer,
|
||
scheduleExercise: scheduleExerciseReducer,
|
||
exerciseLibrary: exerciseLibraryReducer,
|
||
workout: workoutReducer,
|
||
},
|
||
middleware: (getDefaultMiddleware) =>
|
||
getDefaultMiddleware().prepend(listenerMiddleware.middleware),
|
||
});
|
||
|
||
export type RootState = ReturnType<typeof store.getState>;
|
||
export type AppDispatch = typeof store.dispatch;
|
||
|
||
|