/** * @file Container组件的Reducer * @author dongtiancheng */ import {Reducer} from 'redux'; import { ASYNC_LOAD_DATA_FAIL, ASYNC_LOAD_DATA_PROGRESS, ASYNC_LOAD_DATA_SUCCESS, RESET_STORE, DATA_CUSTOMER_PASS, IContainerAction, SET_DATA, SET_DATA_LIST, SET_MULTI_DATA, SYNC_LOAD_DATA_FAIL, SYNC_LOAD_DATA_SUCCESS, CLEAR_DATA, DELETE_DATA } from './action'; import {update, clone, each} from 'lodash'; export type IState = Object; export const initialState: IState = {}; export const reducer: Reducer = (state: IState = initialState, actions: IContainerAction): IState => { switch (actions.type) { case SET_DATA: { let name = actions.payload.name; let newValue = actions.payload.value; let model = actions.model; if (!(model in state)) { state[model] = {}; } let nameGroup = name.split('.'); state = clone(state); state[model] = clone(state[model]); update(state[model], nameGroup, () => newValue); return state; } case SET_DATA_LIST: { let payloadList = actions.payload; let model = actions.model; if (!(model in state)) { state[model] = {}; return state; } state = clone(state); state[model] = clone(state[model]); payloadList.forEach(load => { let nameGroup = load.name.split('.'); update(state[model], nameGroup, () => load.value); }); return state; } case SET_MULTI_DATA: { let payload = actions.payload; let model = actions.model; if (!(model in state)) { state[model] = {}; return state; } state = clone(state); state[model] = clone(state[model]); payload.forEach(item => { let name = item.name; let value = item.value; update(state[model], name, () => value); }); return state; } case ASYNC_LOAD_DATA_PROGRESS: { let payload = actions.payload; let model = payload.model; if (!(model in state)) { state[model] = { $loading: true }; return state; } state = clone(state); state[model] = clone(state[model]); state[model].$loading = true; return state; } case ASYNC_LOAD_DATA_SUCCESS: { let payload = actions.payload; let model = payload.model; let data = payload.data; if (!(model in state)) { state[model] = {}; } state = clone(state); state[model] = clone(state[model]); state[model].$loading = false; Object.assign(state[model], data); return state; } case ASYNC_LOAD_DATA_FAIL: { let payload = actions.payload; let model = payload.model; let error = payload.error; if (!(model in state)) { state[model] = {}; } state = clone(state); state[model] = clone(state[model]); state[model].$loading = false; state[model].$error = error; return state; } case SYNC_LOAD_DATA_SUCCESS: { let payload = actions.payload; let model = payload.model; let data = payload.data; if (!(model in state)) { state[model] = {}; } state = clone(state); state[model] = clone(state[model]); Object.assign(state[model], data); return state; } case SYNC_LOAD_DATA_FAIL: { let payload = actions.payload; let model = payload.model; let error = payload.error; if (!(model in state)) { state[model] = {}; } state = clone(state); state[model] = clone(state[model]); Object.assign(state[model], { $error: error }); return state; } case DATA_CUSTOMER_PASS: { let payload = actions.payload; let model = payload.model; let data = payload.data; if (!(model in state)) { console.error(`DataCustomer: ${model} is not exist`); return state; } state = clone(state); state[model] = clone(state[model]); each(data, (val, key) => { update(state[model], key, () => val); }); return state; } case CLEAR_DATA: let delKey = actions.payload.model; state = clone(state); delete state[delKey]; return state; case RESET_STORE: state = {}; return state; case DELETE_DATA: { let payload = actions.payload; let name = payload.name; let model = actions.model; if (!(model in state)) { return state; } delete state[model][name]; return state; } default: return state; } };