apollo-mantra
Version:
Tools for integration of apollo with Mantra
95 lines (94 loc) • 4.21 kB
JavaScript
;
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
var React = require("react");
var config_1 = require("./config");
var helpers_1 = require("./helpers");
;
function waitForData(keys, options) {
if (keys === void 0) { keys = ['data']; }
if (options === void 0) { options = {}; }
return function wait(WrappedComponent) {
var func = function (props, context) {
var Loading = options.LoadingView ? options.LoadingView : config_1.default.loadingComponent;
if (options.waitForAll && config_1.default.store) {
if (!helpers_1.queriesFinished(config_1.default.store.getState().apollo)) {
return React.createElement(Loading, __assign({}, props));
}
}
// solve auth
if (options.auth || options.roles) {
if (config_1.default.isLoggingIn(context)) {
return React.createElement(config_1.default.LoggingIn, __assign({}, props));
}
if (!config_1.default.userIdSelector(context) || (options.roles && options.roles.length && config_1.default.userRolesSelector(context).every(function (r) { return options.roles.indexOf(r) === -1; }))) {
return options.AuthView ? React.createElement(options.AuthView, __assign({}, props)) : React.createElement(config_1.default.authComponent, __assign({}, props));
}
}
// wait for individual queries
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
var key = keys_1[_i];
var selector = void 0;
if (key.indexOf('.') >= 0) {
var splitKey = key.split('.');
key = splitKey[0];
selector = splitKey[1];
}
if (!props[key]) {
console.error('Loading container did not find key in the apollo result set: ' + key);
}
if (props[key].errors) {
if (Array.isArray(props[key].errors)) {
for (var _a = 0, _b = props[key].errors; _a < _b.length; _a++) {
var error = _b[_a];
if (error['message']) {
console.error(error['message']);
}
console.error(error);
}
}
else {
var m = props[key].errors;
if (m.networkError) {
console.error(m.networkError.message);
console.error(m.networkError.stack);
}
else if (m.message) {
console.error(m.message);
console.error(m.stack);
}
else {
console.error(m);
}
}
}
if (selector) {
if (props[key][selector] == null) {
return React.createElement(Loading, __assign({}, props));
}
}
else if (props[key].loading) {
return React.createElement(Loading, __assign({}, props));
}
}
try {
return React.createElement(WrappedComponent, __assign({}, props));
}
catch (ex) {
console.error(ex.stack);
throw ex;
}
};
func.displayName = "WaitForLoad(" + (WrappedComponent.displayName || 'Component') + ")";
func.contextTypes = options.contextTypes || config_1.default.contextTypes;
return func;
};
}
exports.default = waitForData;