UNPKG

mutants-appfx

Version:

appfx module

243 lines (195 loc) 10.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _regenerator = require("babel-runtime/regenerator"); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require("babel-runtime/helpers/createClass"); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn"); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require("babel-runtime/helpers/inherits"); var _inherits3 = _interopRequireDefault(_inherits2); exports.default = injectViewModel; var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _hoistNonReactStatics = require("hoist-non-react-statics"); var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics); var _react = require("react"); var _Action = require("./Action"); var _Action2 = _interopRequireDefault(_Action); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function createViewModelInjector(grabViewModelFn, component, viewModelNames) { var _class, _temp2; var injectNames = viewModelNames.join("-"); var wrappedComponentName = component.displayName || component.name || component.constructor && component.constructor.name || "Unknown"; var displayName = "inject-" + wrappedComponentName; if (injectNames) displayName += "-with-" + injectNames; var Injector = (_temp2 = _class = function (_Component) { (0, _inherits3.default)(Injector, _Component); function Injector() { var _ref, _this2 = this; var _temp, _this, _ret; (0, _classCallCheck3.default)(this, Injector); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Injector.__proto__ || (0, _getPrototypeOf2.default)(Injector)).call.apply(_ref, [this].concat(args))), _this), _this.controllerEvent = function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(methodName, methodArgs) { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _this.context.onEvent({ 'controllerEvent': _Action2.default.fromJS(_this.context.viewModel, methodName) }, 'controllerEvent', methodArgs); case 2: case "end": return _context.stop(); } } }, _callee, _this2); })); return function (_x, _x2) { return _ref2.apply(this, arguments); }; }(), _this.iRef = function (instance) { _this.wrappedInstance = instance; }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret); } (0, _createClass3.default)(Injector, [{ key: "getChildContext", value: function getChildContext() { return { controllerEvent: this.controllerEvent }; } }, { key: "render", value: function render() { var _this3 = this; console.log("wrappedComponentName ========== render " + wrappedComponentName); var newProps = {}; for (var key in this.props) { if (this.props.hasOwnProperty(key)) { newProps[key] = this.props[key]; } } var additionalProps = grabViewModelFn(this.context.viewModel.items || {}, newProps) || {}; for (var _key2 in additionalProps) { var viewModelProp = additionalProps[_key2]; //增加viewmodel调用controller的事件 if ('viewModel' === _key2 && this.context.onEvent) { if (!viewModelProp.controllerEvent) { viewModelProp.controllerEvent = function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(methodName, methodArgs) { return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _this3.context.onEvent({ 'controllerEvent': _Action2.default.fromJS(_this3.context.viewModel, methodName) }, 'controllerEvent', methodArgs); case 2: case "end": return _context2.stop(); } } }, _callee2, _this3); })); return function (_x3, _x4) { return _ref3.apply(this, arguments); }; }(); } } newProps[_key2] = viewModelProp; } //增加controller的调用事件 if (this.context.onEvent) { newProps.controllerEvent = function () { var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(methodName, methodArgs) { return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return _this3.context.onEvent({ 'controllerEvent': _Action2.default.fromJS(_this3.context.viewModel, methodName) }, 'controllerEvent', methodArgs); case 2: case "end": return _context3.stop(); } } }, _callee3, _this3); })); return function (_x5, _x6) { return _ref4.apply(this, arguments); }; }(); } if (component.prototype && component.prototype.render) { newProps.ref = this.iRef; } return (0, _react.createElement)(component, newProps); } }]); return Injector; }(_react.Component), _class.displayName = displayName, _class.wrappedComponentName = wrappedComponentName, _class.contextTypes = { viewModel: _propTypes2.default.object, onEvent: _propTypes2.default.func }, _class.childContextTypes = { controllerEvent: _propTypes2.default.func }, _temp2); (0, _hoistNonReactStatics2.default)(Injector, component); Injector.viewModelNames = viewModelNames; Injector.wrappedComponent = component; return Injector; } function grabViewModelsByName(viewModelNames) { return function (viewModels, nextProps) { var viewModelArray = []; viewModelNames.forEach(function (viewModelName) { if (viewModelName in nextProps) { throw new Error("viewModelName is same with component's prop [" + viewModelName + "] please rename one"); } var viewModel = grabViewModel(viewModels, viewModelName); if (!viewModel) { throw new Error("viewModel injector: ViewModel '" + viewModelName + "' is not available! Make sure it is provided by some Provider"); } viewModelArray.push(viewModel); }); var viewModelProp = {}; if (viewModelArray.length == 1) { viewModelProp = viewModelArray[0]; } else { viewModelNames.forEach(function (viewModelName, index) { viewModelProp[viewModelName] = viewModelArray[index]; }); } nextProps['viewModel'] = viewModelProp; return nextProps; }; } function grabViewModel(viewModels, viewModelName) { return viewModels.find(function (it) { return it.type === viewModelName; }); } function injectViewModel() { var viewModelNames = []; for (var i = 0; i < arguments.length; i++) { viewModelNames[i] = arguments[i]; }if (viewModelNames.length == 0) { throw new Error("inject viewModelNames is empty! please fill the args (...viewNames)"); } var grabViewModelFn = grabViewModelsByName(viewModelNames); return function (componentClass) { return createViewModelInjector(grabViewModelFn, componentClass, viewModelNames); }; } //# sourceMappingURL=injectViewModel.js.map