import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { EActionPriorityType } from '../../../action/enum/EActionPriorityType'; import { EActionStatus } from '../../../action/enum/EActionStatus'; import { EActionType } from '../../../action/enum/EActionType'; const initialState = { action: new Array()}; export const action : any = createSlice({ name: 'action', initialState, reducers: { setAction: (state :any, action: PayloadAction) => { let actionIntance = action.payload.action ? action.payload.action : null; if(actionIntance){ //Keepout old region change actions if(actionIntance.type == EActionType.REGION_CHANGE){ state.action = keepOutActions(state.action, EActionType.REGION_CHANGE); } //organice action by priority switch (actionIntance.priority) { case EActionPriorityType.FIFO: state.action.push(actionIntance); state.action = state.action.sort(orderDate); break; case EActionPriorityType.SUPER_FIFO: state.action.push(actionIntance); state.action = state.action.sort(orderDate); break; case EActionPriorityType.LIFO: state.action = state.action.sort(orderDate); state.action.unshift(actionIntance); break; case EActionPriorityType.SUPER_LIFO: state.action = state.action.sort(orderDate); state.action.unshift(actionIntance); break; } } }, clearAction: (state:any) => { state.action = state.action.filter((action:any)=> action.id!=action.id); }, deleteActionById: (state:any, params: PayloadAction) => { state.action = state.action.filter((action:any)=> action.id!=params.payload.id); }, increaseIntent: (state:any, params: PayloadAction) => { state.action.map((action:any)=> { if(action.id==params.payload.id){ action.intent = action.intent+1; } }); } }, }) function keepOutActions(actions: Array, type: EActionType) : Array{ for (let index = 0; index < actions.length; index++) { if(actions[index].type == type){ actions[index].status = EActionStatus.KEEPOUT; } } return actions; } function orderDate( actionA :any , actionB: any ) { if ( actionA.datetime < actionB.datetime){ return -1; } if ( actionA.datetime > actionB.datetime){ return 1; } return 0; } // Action creators are generated for each case reducer function export const { setAction, clearAction, editAction, deleteActionById, increaseIntent } = action.actions; export default action.reducer;