Skip to content
Snippets Groups Projects
schedule.reducer.ts 2.03 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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,
    
        interval: number,
    
        type: string
    };
    
    interface Schedule {
        task: Task,
    
        id: number,
        state: ScheduleState,
        intervalId: NodeJS.Timeout | undefined
    }
    
    export interface ScheduleReducerState {
    
    }
    
    const initialState: ScheduleReducerState = {
        schedules: []
    }
    
    const ScheduleSlice = createSlice({
        name: 'schedule',
        initialState,
        reducers: {
    
            registerTask: (state, action: PayloadAction<Task>) => {
    
                const newSchedule = {
    
                    id: state.schedules.length,
                    state: ScheduleState.INIT,
                    intervalId: undefined
                }
    
                state.schedules = [...state.schedules, newSchedule]
            },
    
            startSchedule: (state, action: PayloadAction<Schedule>) => {
    
                const schedule = action.payload;
    
                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))
    //     },
    // })