mutants-appfx
Version:
appfx module
243 lines (195 loc) • 10.3 kB
JavaScript
;
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