UNPKG

thundercats-react

Version:

Thundercats addon for use with React

121 lines (100 loc) 3.4 kB
'use strict'; 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; }); }