react-apollo-graphql
Version:
Get rid of decorators and use Apollo GraphQL queries and mutations in the simple and readable way.
173 lines (130 loc) • 5.35 kB
JavaScript
;
exports.__esModule = true;
exports.getDataFromTree = undefined;
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var getDataFromTree = exports.getDataFromTree = function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(element) {
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var Component, props, childContext, child, instance, promises;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(element == null)) {
_context.next = 2;
break;
}
return _context.abrupt('return');
case 2:
// get type of element
Component = element.type;
// a functional stateless component or a class
if (!(typeof Component === 'function')) {
_context.next = 26;
break;
}
// create props
props = (0, _assign2.default)({}, Component.defaultProps, element.props);
childContext = context;
child = void 0;
if (!(Component.prototype && Component.prototype.isReactComponent)) {
_context.next = 21;
break;
}
instance = new Component(props, context);
// In case the user doesn't pass these to super in the constructor
instance.props = instance.props || props;
instance.context = instance.context || context;
// Override setState to just change the state, not queue up an update.
// (we can't do the default React thing as we aren't mounted "properly"
// however, we don't need to re-render as well only support setState in
// componentWillMount, which happens *before* render).
instance.setState = function (state, cb) {
if (typeof state === 'function') {
instance.state = (0, _assign2.default)({}, instance.state, state(instance.state));
} else {
instance.state = (0, _assign2.default)({}, instance.state, state);
}
if (typeof cb === 'function') {
cb();
}
};
if (instance.componentWillMount) {
instance.componentWillMount();
}
if (instance.getChildContext) {
childContext = (0, _assign2.default)({}, context, instance.getChildContext());
}
// is this GraphQL component?
if (!(element.type === _2.default)) {
_context.next = 17;
break;
}
_context.next = 17;
return _promise2.default.all(instance.getObservers().map(function (observer) {
return new _promise2.default(function (resolve, reject) {
try {
observer.result().then(function () {
return resolve();
}, function () {
return resolve();
});
} catch (e) {
reject(e);
}
});
}));
case 17:
// now call render, we have everything resolved and updated so it should return a child
// then call this function on child
child = instance.render();
if (element.type === _2.default) {
// unmount GraphQL component so we can clean up subscriptipns
instance.componentWillUnmount();
}
_context.next = 22;
break;
case 21:
// just a stateless functional
child = Component(props, context);
case 22:
_context.next = 24;
return getDataFromTree(child, childContext);
case 24:
_context.next = 31;
break;
case 26:
if (!(element.props && element.props.children)) {
_context.next = 31;
break;
}
promises = [];
_react.Children.forEach(element.props.children, function (child) {
if (child) {
promises.push(getDataFromTree(child, context));
}
});
_context.next = 31;
return _promise2.default.all(promises);
case 31:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
return function getDataFromTree(_x2) {
return _ref.apply(this, arguments);
};
}();
var _ = require('./');
var _2 = _interopRequireDefault(_);
var _react = require('react');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }