thundercats-react
Version:
Thundercats addon for use with React
121 lines (100 loc) • 3.4 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
exports.fetch$ = fetch$;
exports.renderToObs$ = renderToObs$;
exports.render$ = render$;
exports.renderToString$ = renderToString$;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _rx = require('rx');
var _rx2 = _interopRequireDefault(_rx);
var _reactDom = require('react-dom');
var _reactDomServer = require('react-dom/server');
var _debug = require('debug');
var _debug2 = _interopRequireDefault(_debug);
var _ContextWrapper = require('./ContextWrapper');
var _ContextWrapper2 = _interopRequireDefault(_ContextWrapper);
var debug = (0, _debug2['default'])('thundercats:render');
function fetch$(fetchMap) {
if (!fetchMap || fetchMap.size === 0) {
debug('cat found empty fetch map');
return _rx2['default'].Observable.just(fetchMap);
}
var fetchCtx$ = _rx2['default'].Observable.from(fetchMap.values()).shareReplay();
var stores$ = fetchCtx$.map(function (_ref) {
var store = _ref.store;
return store;
}).filter(function (store) {
return !!store;
}).toArray().flatMap(function (stores) {
return _rx2['default'].Observable.combineLatest(stores);
});
var actionDurations$ = fetchCtx$.map(function (_ref2) {
var action = _ref2.action;
return action.__duration();
}).toArray().flatMap(function (actionDurations) {
return _rx2['default'].Observable.combineLatest(actionDurations);
}).tapOnCompleted(function () {
return debug('fetch actions have all completed');
});
var fetch$ = fetchCtx$.tapOnNext(function (_ref3) {
var action = _ref3.action;
var payload = _ref3.payload;
action(payload);
}).tapOnCompleted(function () {
return debug('fetchers activated');
}).toArray();
return _rx2['default'].Observable.combineLatest(stores$, actionDurations$, fetch$.delaySubscription(50)).first().tapOnNext(function () {
return debug('fetch completed');
}).map(function () {
return fetchMap;
});
}
function renderToObs$(Comp, DOMContainer) {
return new _rx2['default'].AnonymousObservable(function (observer) {
try {
(0, _reactDom.render)(Comp, DOMContainer, function () {
observer.onNext(this);
});
} catch (e) {
observer.onError(e);
observer.onCompleted();
}
});
}
function render$(cat, Component, DOMContainer) {
var Burrito = undefined;
try {
Burrito = _ContextWrapper2['default'].wrap(Component, cat);
} catch (e) {
return _rx.Observable['throw'](e);
}
return renderToObs$(Burrito, DOMContainer);
}
function renderToString$(cat, Component) {
var fetchMap = undefined;
var Burrito = undefined;
try {
fetchMap = new Map();
cat.fetchMap = fetchMap;
Burrito = _ContextWrapper2['default'].wrap(Component, cat);
debug('initiation fetcher registration');
(0, _reactDomServer.renderToStaticMarkup)(Burrito);
debug('fetcher registration complete');
} catch (e) {
return _rx.Observable['throw'](e);
}
return fetch$(fetchMap)
// move fetch to next event loop to prevent
// synchronous actions from causing infiniti loop
.delay(50).map(function (fetchMap) {
var markup = (0, _reactDomServer.renderToString)(Burrito);
return {
markup: markup,
fetchMap: fetchMap
};
}).tapOnNext(function () {
return cat.fetchMap = null;
});
}