freeCodeCamp/server/boot/a-react.js

61 lines
1.7 KiB
JavaScript
Raw Normal View History

2015-06-29 12:01:56 -07:00
import debugFactory from 'debug';
2015-07-01 15:14:10 -07:00
import { app$ } from '../common/app';
2015-06-29 12:01:56 -07:00
import { Cat } from 'thundercats';
2015-06-29 09:50:25 -07:00
2015-06-29 12:01:56 -07:00
const debug = debugFactory('freecc:servereact');
2015-07-01 15:14:10 -07:00
// add routes here as they slowly get reactified
// remove their individual controllers
2015-06-29 12:01:56 -07:00
const routes = [
2015-06-29 09:50:25 -07:00
'/jobs'
];
2015-06-29 12:01:56 -07:00
export default function reactSubRouter(app) {
2015-06-29 09:50:25 -07:00
var router = app.Router();
routes.forEach(function(route) {
router.get(route, serveReactApp);
});
app.use(router);
function serveReactApp(req, res, next) {
var fcc = new Cat();
var decodedUrl = decodeURI(req.path);
// returns a router wrapped app
app$(decodedUrl)
// if react-router does not find a route send down the chain
.filter(function(data) {
var state = data.state;
// this may not work with react-router 1.0.0
var notFound = state.routes.some(route => route.isNotFound);
if (notFound) {
debug('tried to find %s but got 404', state.path);
next();
}
return !notFound;
})
.flatMap(function(app) {
// call thundercats renderToString
// prefetches data and sets up it up for current state
return fcc.renderToString(app);
})
// makes sure we only get one onNext and closes subscription
.firstOrDefault()
.flatMap(function(dats) {
debug('react rendered');
res.expose(dats.data, 'data');
// now render jade file with markup injected from react
return res.render$('layout-react', { markup: dats.markup });
})
.subscribe(
function(markup) {
debug('jade rendered');
res.send(markup);
},
next
);
}
2015-06-29 12:01:56 -07:00
}