UNPKG

regular-redux-undo

Version:

the plugin of regular-redux to archieve undo and redo

43 lines (36 loc) 1.08 kB
import {set, get} from '../util/immuable'; import track from './track'; import changed from './changed'; /** * the creator of reducer * bind the track modifier to undo redo * bind the changed modier to get the changed function * @param {Store} the instance of Store */ export function createReducer(store) { let reducer = function(state, action) { if (!state || !action) return state; let match = store.reducers[action.type]; if (match) { let {path, handler} = match; let moduleState = path.length ? get(state, path.join('.')) : state; let newState = handler(moduleState, action.payload); if (newState !== moduleState && newState) { if (path.length) { return set(state, path.join('.'), newState); } else { return newState; } } } return state; } store.modifiers.slice().forEach(modifier => { reducer = modifier(reducer); }) if (store.undoable) { return changed(track(store.name, reducer), true); } else { return changed(reducer, false); } }