UNPKG

ayano-react

Version:
153 lines (131 loc) 14.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /** doc ``` javascirpt import { Reducer } from 'ayano-react'; var reducer = new Reducer(); reducer.use('INIT_GUOSHENCHENG', (state, payload) => {}) reducer.use('GUOSHENCHENG', (state, payload) => {}); var root = new Reducer(); root.use('guoshencehng', reducer); ``` */ var _ayanoUtils = require('ayano-utils'); var _redux = require('redux'); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function isVaildOldReducerChild(reducer) { if (reducer.reducers && (0, _ayanoUtils.is)(_ayanoUtils.TYPES.Object)(reducer.reducers)) { return true; } else { return false; } } var Reducer = function () { function Reducer() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, defaultState = _ref.defaultState, prefix = _ref.prefix; _classCallCheck(this, Reducer); this.defaultState = defaultState || {}; this.prefix = prefix || "@ayano-reducer", this.reducers = {}; // Reducer 的对象,需要递归的处理 this.handlers = {}; // 可直接处理数据的函数 this.originReducer = {}; // redux reducer的处理方法 } _createClass(Reducer, [{ key: 'useOriginReducer', value: function useOriginReducer(key, fn) { if ((0, _ayanoUtils.is)(_ayanoUtils.TYPES.Function)(fn)) { this.originReducer[key] = fn; } } }, { key: 'use', value: function use(key, fn) { if ((0, _ayanoUtils.is)(_ayanoUtils.TYPES.Function)(fn)) { this.handlers[key] = fn; } else if (fn instanceof Reducer) { this.reducers[key] = fn; } else { console.warn('reducer which key is ' + key + ' is not either a fuction or ayano-react/dist/reducer'); } } }, { key: 'toReducerAction', value: function toReducerAction(dispatch, prefix) { var _this = this; prefix = prefix || this.prefix; var actions = Object.keys(this.handlers).reduce(function (pre, cur) { pre[cur] = function (payload) { return dispatch({ type: prefix + '/' + cur, payload: payload }); }; return pre; }, {}); actions = Object.keys(this.reducers).reduce(function (pre, cur) { pre[cur] = _this.reducers[cur].toReducerAction(dispatch, prefix + '/' + cur); return pre; }, actions); return actions; } }, { key: 'toReduxReducers', value: function toReduxReducers(prefix) { var _this2 = this; prefix = prefix || this.prefix; var handlers = Object.keys(this.handlers).reduce(function (pre, cur) { pre[prefix + '/' + cur] = _this2.handlers[cur]; return pre; }, {}); return function (state, action) { var nextState = Object.assign({}, state || _this2.defaultState); if (handlers[action.type]) { nextState = handlers[action.type](state, action.payload); } Object.keys(_this2.originReducer).filter(function (key) { return !!_this2.originReducer[key]; }).forEach(function (key) { var reducer = _this2.originReducer[key]; nextState[key] = reducer(nextState[key], action); }); Object.keys(_this2.reducers).filter(function (key) { return !!_this2.reducers[key]; }).forEach(function (key) { var reducer = _this2.reducers[key]; nextState[key] = reducer.toReduxReducers(prefix + '/' + key)(nextState[key], action); }); return nextState; }; } }]); return Reducer; }(); exports.default = Reducer; Reducer.fromOldReducer = function (reducers, prefix) { if (isVaildOldReducerChild(reducers)) { // 传入的是一个最小Reducer的子节点 var defaultState = reducers.defaultState || {}; var current = new Reducer({ prefix: prefix, defaultState: defaultState }); Object.keys(reducers.reducers).forEach(function (key) { var reducer = reducers.reducers[key]; if ((0, _ayanoUtils.is)(_ayanoUtils.TYPES.Function)(reducer)) { current.use(key, reducer); } else { current.use(key, Reducer.fromOldReducer(reducer)); } }); return current; } else { // 递归寻找最小Reducer子节点 var _current = new Reducer({ prefix: prefix }); Object.keys(reducers).map(function (key) { var reducer = reducers[key]; _current.use(key, Reducer.fromOldReducer(reducer)); }); return _current; } };