Newer
Older
import { PayloadAction, createSlice } from '@reduxjs/toolkit';
import { startListening } from '../middleware/listener.middleware';
export enum ScheduleState { INIT, RUNNING, STOPPED }
export type Task = {
job: (options: object) => void,
type: string
};
interface Schedule {
task: Task,
id: number,
state: ScheduleState,
intervalId: NodeJS.Timeout | undefined
}
export interface ScheduleReducerState {
schedules: Schedule[]
}
const initialState: ScheduleReducerState = {
schedules: []
}
const ScheduleSlice = createSlice({
name: 'schedule',
initialState,
reducers: {
registerTask: (state, action: PayloadAction<Task>) => {
task: action.payload.task,
id: state.schedules.length,
state: ScheduleState.INIT,
intervalId: undefined
}
state.schedules = [...state.schedules, newSchedule]
},
startSchedule: (state, action: PayloadAction<Schedule>) => {
schedule.intervalId = setInterval(schedule.task.job, schedule.task.interval);
schedule.state = ScheduleState.RUNNING;
state.schedules[schedule.id] = schedule;
},
},
})
export const { registerTask } = ScheduleSlice.actions
export const { startSchedule } = ScheduleSlice.actions
export default ScheduleSlice.reducer
// startListening({
// actionCreator: addSchedule,
// effect: (action, listenerApi) => {
// const newState = listenerApi.getState() as ScheduleReducerState;
// const originalState = listenerApi.getOriginalState() as ScheduleReducerState;
// // get the added schedule
// const schedule = newState.schedules.filter(s => !originalState.schedules.includes(s)).at(0);
// if (!schedule) {
// throw new Error("Added schedule not found in store");
// }
// listenerApi.dispatch(startSchedule(schedule))
// },
// })