awv3
Version:
⚡ AWV3 embedded CAD
349 lines (277 loc) • 12.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Component = undefined;
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends4 = require('babel-runtime/helpers/extends');
var _extends5 = _interopRequireDefault(_extends4);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _entries = require('babel-runtime/core-js/object/entries');
var _entries2 = _interopRequireDefault(_entries);
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);
var _values = require('babel-runtime/core-js/object/values');
var _values2 = _interopRequireDefault(_values);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
exports.render = render;
exports.destroy = destroy;
exports.connect = connect;
exports.buildStack = buildStack;
exports.prepare = prepare;
var _omit = require('lodash/omit');
var _omit2 = _interopRequireDefault(_omit);
var _flatten = require('lodash/flatten');
var _flatten2 = _interopRequireDefault(_flatten);
var _element = require('./element');
var _element2 = _interopRequireDefault(_element);
var _objects = require('shallow-equal/objects');
var _objects2 = _interopRequireDefault(_objects);
var _stringHash = require('string-hash');
var _stringHash2 = _interopRequireDefault(_stringHash);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var queue = _promise2.default.resolve(),
currentId = void 0,
frames = window.f = {};
function render(plugin, cb) {
requestAnimationFrame(function () {
queue = queue.then(function () {
currentId = plugin.id;
frames[currentId] && destroy(currentId);
frames[currentId] = {
stack: {},
stateStack: [],
order: 0,
plugin: plugin
};
plugin.addElement(renderNodes(plugin, prepare(cb())));
});
});
}
function destroy(id) {
var frame = frames[id];
if (frame) {
(0, _values2.default)(frame.stack).forEach(function (node) {
node.unsubscribes && node.unsubscribes.forEach(function (unsub) {
return unsub();
});
node.component && node.component.componentWillUnmount && node.component.componentWillUnmount();
node.component = undefined;
node.element.destroy();
node.element = undefined;
node.children = undefined;
});
delete frames[id];
frame.plugin.destroyElements();
}
}
function connect(selector) {
return function (DecoratedComponent) {
return function (_Component) {
(0, _inherits3.default)(_class2, _Component);
function _class2() {
var _ref;
var _temp, _this, _ret;
(0, _classCallCheck3.default)(this, _class2);
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 = _class2.__proto__ || (0, _getPrototypeOf2.default)(_class2)).call.apply(_ref, [this].concat(args))), _this), _this.state = {}, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
}
(0, _createClass3.default)(_class2, [{
key: 'componentWillMount',
value: function componentWillMount() {
var _this2 = this;
var oldState = {};
var store = this.plugin.store;
this.unsubscribe = store.subscribe(function () {
var selectedState = selector(store.getState(), _this2.props);
var changedKeys = void 0;
(0, _entries2.default)(selectedState).map(function (_ref2) {
var _ref3 = (0, _slicedToArray3.default)(_ref2, 2),
key = _ref3[0],
value = _ref3[1];
if (oldState[key] !== value) {
changedKeys = (0, _extends5.default)({}, changedKeys, (0, _defineProperty3.default)({}, key, value));
oldState[key] = value;
}
});
changedKeys && _this2.setState(changedKeys);
});
this.state = (0, _extends5.default)({}, this.state, selector(store.getState(), this.props));
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.unsubscribe();
}
}, {
key: 'render',
value: function render() {
var props = (0, _extends5.default)({}, this.props, this.state);
return React.createElement(DecoratedComponent, props);
}
}]);
return _class2;
}(Component);
};
}
function buildStack(tree, target) {
(Array.isArray(tree) ? tree : [tree]).forEach(function (child) {
child.el && !(child.el.prototype instanceof _element2.default) && target.push(child);
child.children && buildStack(child.children, target);
});
}
var Component = exports.Component = function () {
function Component(props) {
(0, _classCallCheck3.default)(this, Component);
this.id = currentId;
this.plugin = frames[this.id].plugin;
this.node;
this.props = props || {};
this.refs = {};
}
(0, _createClass3.default)(Component, [{
key: 'dispatch',
value: function dispatch(action) {
this.plugin.store.dispatch(action);
}
}, {
key: 'setState',
value: function setState(props) {
var frame = frames[this.id];
var newState = (0, _extends5.default)({}, this.state, props);
if (!(0, _objects2.default)(newState, this.state)) {
this.state = newState;
// Build component stack & construct virtual dom
currentId = this.id;
frame.order = this.node.order;
buildStack(this.node.children, frame.stateStack);
frame.stateStack = frame.stateStack.sort(function (a, b) {
return a.order - b.order;
});
this.node.children = prepare(this.render(this.node.props, this.state, this.setState.bind(this)), this.node.depth);
frame.stateStack = [];
renderNodes(this.plugin, this.node.children, this.node.parent, true);
}
}
}]);
return Component;
}();
function prepare(tree) {
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0];
if (Array.isArray(tree)) {
for (var i in tree) {
tree[i] = prepare(tree[i] || {}, [].concat((0, _toConsumableArray3.default)(depth), [parseInt(i)]));
}
} else {
tree.depth = [].concat((0, _toConsumableArray3.default)(depth));
if (tree.children) tree.children = prepare(tree.children, depth);
}
return tree;
}
function renderNodes(plugin, node, parent) {
var reconcile = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
var frame = frames[plugin.id];
if (Array.isArray(node)) {
return node.map(function (node) {
return renderNodes(plugin, node, parent);
});
} else if (node.el) {
var tag = node.tag + '.' + node.depth.join('.');
var found = frame.stack[tag];
var target = found ? found : node;
var element = target.element;
parent = parent || target.parent;
var parentElem = (parent || {}).element;
//console.log(tag, node.props, ', found: ', !!found, ', frame: ', currentId);
if (!found) {
frame.stack[tag] = target;
}
target.parent = parent;
if (target.el.prototype instanceof _element2.default) {
var update = (0, _extends5.default)({}, node.props, {
children: renderNodes(plugin, node.children, target).filter(function (e) {
return e;
}).map(function (e) {
return e.id;
})
});
if (found) {
target.element.update(update);
} else {
target.element = new target.el(frame.plugin, update);
}
target.unsubscribes && target.unsubscribes.forEach(function (unsub) {
return unsub();
});
target.unsubscribes = target.handlers.map(function (handler) {
var name = handler.charAt(2).toLowerCase() + handler.substr(3);
return target.element.observe(function (state) {
return state[name];
}, function (state, old) {
return node.events[handler](state, old);
});
});
} else {
target.element = renderNodes(plugin, node.children, parent);
}
return target.element;
}
}
var React = {
createElement: function createElement(el, props) {
for (var _len2 = arguments.length, children = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
children[_key2 - 2] = arguments[_key2];
}
var frame = frames[currentId];
children = (0, _flatten2.default)(children);
if (el.prototype instanceof _element2.default) {
var handlers = (0, _keys2.default)(props || {}).filter(function (key) {
return typeof props[key] === 'function' && key.startsWith('on');
});
var events = handlers.reduce(function (acc, val) {
return (0, _extends5.default)({}, acc, (0, _defineProperty3.default)({}, val, props[val]));
}, {});
return {
el: el,
tag: el.name,
props: (0, _omit2.default)(props, handlers),
handlers: handlers,
events: events,
children: children
};
} else {
var state = void 0;
var trace = frame.stateStack.shift();
var node = { el: el, tag: (0, _stringHash2.default)(el.toString()), props: props || {}, order: frame.order++ };
//if (trace) console.log(' diff', trace.tag, node.tag);
if (trace && trace.el === node.el && trace.tag === node.tag) {
state = trace.component.state;
node.order = trace.order;
}
node.component = new el((0, _extends5.default)({}, props, { children: children }));
node.component.state = (0, _extends5.default)({}, node.component.state, state);
node.component.node = node;
node.component.componentWillMount && node.component.componentWillMount();
node.children = node.component.render(node.component.props, node.component.state, node.component.setState.bind(node.component));
return node;
}
}
};
exports.default = React;