diff --git a/client/index.js b/client/index.js index 0970b76831..92f87720fe 100644 --- a/client/index.js +++ b/client/index.js @@ -8,7 +8,6 @@ import sendPageAnalytics from './utils/send-page-analytics'; import { App, createApp, provideStore } from '../common/app'; import { getLangFromPath } from '../common/app/utils/lang'; -import flashReducer, { messagesFoundOnBoot } from '../common/app/Flash/redux'; // client specific epics import epics from './epics'; @@ -29,7 +28,6 @@ const { document, ga, __fcc__: { - flash = {}, data: ssrState = {}, csrf: { token: csrfToken @@ -51,10 +49,6 @@ const defaultState = isColdStored() ? const primaryLang = getLangFromPath(location.pathname); defaultState.app.csrfToken = csrfToken; -defaultState.flash = flashReducer( - defaultState.flash, - messagesFoundOnBoot(flash) -); const serviceOptions = { xhrPath: '/services', context: { _csrf: csrfToken } }; diff --git a/server/boot/home.js b/server/boot/home.js index 8d5f26cec9..6e79563176 100644 --- a/server/boot/home.js +++ b/server/boot/home.js @@ -9,14 +9,15 @@ module.exports = function(app) { var router = app.loopback.Router(); router.get('/', addDefaultImage, index); app.use( - '/:lang', - (req, res, next) => { - // add url language to request for all routers - req._urlLang = req.params.lang; - next(); - }, - router - ); + '/:lang', + (req, res, next) => { + // add url language to request for all routers + req._urlLang = req.params.lang; + next(); + }, + router + ); + app.use(router); function addDefaultImage(req, res, next) { diff --git a/server/boot/react.js b/server/boot/react.js index 02332feae9..6653e3a3fd 100644 --- a/server/boot/react.js +++ b/server/boot/react.js @@ -95,8 +95,9 @@ export default function reactSubRouter(app) { const title = titleSelector(state); epic.dispose(); res.expose(state, 'data', { isJSON: true }); - res.expose(req.flash(), 'flash', { isJSON: true }); - res.render('layout-react', { markup, title }); + // note(berks): we render without express-flash dumping our messages + // the app will query for these on load + res.renderWithoutFlash('layout-react', { markup, title }); }) .subscribe(() => log('html rendered and sent'), next); } diff --git a/server/middleware.json b/server/middleware.json index 7fdf3e8e6d..a9d377440d 100644 --- a/server/middleware.json +++ b/server/middleware.json @@ -45,6 +45,7 @@ "./middlewares/validator": {} }, "routes:before": { + "./middlewares/express-extensions": {}, "express-flash": {}, "helmet#xssFilter": {}, "helmet#noSniff": {}, @@ -52,7 +53,6 @@ "./middlewares/csurf": {}, "./middlewares/constant-headers": {}, "./middlewares/csp": {}, - "./middlewares/express-rx": {}, "./middlewares/jade-helpers": {}, "./middlewares/migrate-completed-challenges": {}, "./middlewares/add-lang": {}, diff --git a/server/middlewares/express-extensions.js b/server/middlewares/express-extensions.js new file mode 100644 index 0000000000..d875260fa1 --- /dev/null +++ b/server/middlewares/express-extensions.js @@ -0,0 +1,14 @@ +import { Observable } from 'rx'; + +// add rx methods to express +export default function() { + return function expressExtensions(req, res, next) { + // express flash will overwrite render with one that will + // dump flash messages to locals on every call to render + // Use this when that behavior is not wanted + res.renderWithoutFlash = res.render; + // render to observable stream using build in render + res.render$ = Observable.fromNodeCallback(res.render, res); + next(); + }; +} diff --git a/server/middlewares/express-rx.js b/server/middlewares/express-rx.js deleted file mode 100644 index d687e38363..0000000000 --- a/server/middlewares/express-rx.js +++ /dev/null @@ -1,10 +0,0 @@ -import { Observable } from 'rx'; - -// add rx methods to express -export default function expressRx() { - return function expressRx(req, res, next) { - // render to observable stream - res.render$ = Observable.fromNodeCallback(res.render, res); - next(); - }; -}