import {Reducer} from 'redux'; import { IFormActions, INIT_FORM, SET_FORM, SET_FORM_ITEM, SET_FORM_ITEMS, DELETE_FORM_ITEM, DELETE_FORM } from './actions'; import {every} from 'lodash'; export type IState = Object; export const initialState: IState = {}; function setFormItem(state: IState, payload: any, formName: string, formItemName: string) { if (!(formName in state)) { state[formName] = {}; } if (!state[formName].control) { state[formName].control = {}; } if (!(formItemName in state[formName].control)) { state[formName].control[formItemName] = payload; } else { Object.assign(state[formName].control[formItemName], payload); } state[formName].valid = every(state[formName].control, i => i.valid); } export const reducer: Reducer = (state: IState = initialState, actions: IFormActions): IState => { switch (actions.type) { case INIT_FORM: { let name = actions.payload.name; if (name in state) { console.error('检查到Form的name存在冲突'); return state; } state[name] = actions.payload.data; return state; } case SET_FORM: { let name = actions.payload.name; let key = actions.payload.key; state[name][key] = actions.payload.value; return state; } case SET_FORM_ITEM: { let payload = actions.payload; let formName = payload.formName; let formItemName = payload.formItemName; if (!(formName in state)) { console.log('找不到对应的Form', formName); return state; } setFormItem(state, payload, formName, formItemName); return state; } case DELETE_FORM_ITEM: { let payload = actions.payload; let formName = payload.formName; let formItemName = payload.formItemName; if (!state[formName]) { return state; } delete state[formName].control[formItemName]; return state; } case SET_FORM_ITEMS: { let payload = actions.payload; payload.forEach(pay => { let formName = pay.formName; if (!(formName in state)) { console.log('找不到对应的Form', formName); return; } let formItemName = pay.formItemName; setFormItem(state, pay, formName, formItemName); }); return state; } case DELETE_FORM: { let payload = actions.payload; let name = payload.name; delete state[name]; console.log(state); return state; } default: return state; } };