diff --git a/frontend/index.js b/frontend/index.js
deleted file mode 100644
index 49b8ad9288..0000000000
--- a/frontend/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { run } from './router';
-
-if (typeof window !== 'undefined') {
- run();
-}
diff --git a/frontend/index.jsx b/frontend/index.jsx
new file mode 100644
index 0000000000..1037c26786
--- /dev/null
+++ b/frontend/index.jsx
@@ -0,0 +1,17 @@
+import React from 'react';
+import { Provider } from 'react-redux';
+import { render } from 'react-dom';
+import routes from './router';
+import store from './redux/store';
+
+if (typeof window !== 'undefined') {
+ const { document } = global;
+ const app = document.getElementById('app');
+ const reactReduxApp = (
+
+ {routes}
+
+ );
+
+ render(reactReduxApp, app);
+}
diff --git a/frontend/redux/nodes/app/reducer.js b/frontend/redux/nodes/app/reducer.js
new file mode 100644
index 0000000000..4ba4a58ef9
--- /dev/null
+++ b/frontend/redux/nodes/app/reducer.js
@@ -0,0 +1,5 @@
+const reducer = (state = {}) => {
+ return state;
+};
+
+export default reducer;
diff --git a/frontend/redux/reducers.js b/frontend/redux/reducers.js
new file mode 100644
index 0000000000..05cd81adae
--- /dev/null
+++ b/frontend/redux/reducers.js
@@ -0,0 +1,8 @@
+import { combineReducers } from 'redux';
+import { routerReducer } from 'react-router-redux';
+import app from './nodes/app/reducer';
+
+export default combineReducers({
+ app,
+ routing: routerReducer,
+});
diff --git a/frontend/redux/store.js b/frontend/redux/store.js
new file mode 100644
index 0000000000..a23af5da3a
--- /dev/null
+++ b/frontend/redux/store.js
@@ -0,0 +1,19 @@
+import { createStore, applyMiddleware, compose } from 'redux';
+import thunkMiddleware from 'redux-thunk';
+import { browserHistory } from 'react-router';
+import { routerMiddleware } from 'react-router-redux';
+import reducers from './reducers';
+
+const initialState = {};
+const middleware = [
+ thunkMiddleware,
+ routerMiddleware(browserHistory),
+];
+const appliedMiddleware = applyMiddleware(...middleware);
+
+const store = createStore(
+ reducers,
+ initialState,
+ compose(appliedMiddleware),
+);
+export default store;
diff --git a/frontend/router/index.jsx b/frontend/router/index.jsx
index d905d1d4df..5c6a6226a6 100644
--- a/frontend/router/index.jsx
+++ b/frontend/router/index.jsx
@@ -1,35 +1,15 @@
import React from 'react';
-import { render } from 'react-dom';
import { Router, Route, browserHistory } from 'react-router';
-import { Promise } from 'when';
+import { syncHistoryWithStore } from 'react-router-redux';
import App from '../components/app';
+import store from '../redux/store';
-const window = global.window || {};
-const document = global.document || {};
+const history = syncHistoryWithStore(browserHistory, store);
-export function run() {
- window.Promise = window.Promise || Promise;
- window.self = window;
+const routes = (
+
+
+
+);
- const router = (
-
-
-
- );
-
- render(router, document.getElementById('app'));
-}
-
-// Style live reloading
-if (module.hot) {
- let c = 0;
- module.hot.accept('#css', () => {
- const a = document.createElement('a');
- const link = document.querySelector('link[rel="stylesheet"]');
- a.href = link.href;
- a.search = `?${c++}`;
- link.href = a.href;
- });
-}
-
-export default { run };
+export default routes;
diff --git a/package.json b/package.json
index 88783cd920..9594c12a97 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,11 @@
"proxy-middleware": "^0.15.0",
"react": "^15.2.1",
"react-dom": "^15.2.1",
- "react-router": "^2.6.1",
+ "react-redux": "^4.4.5",
+ "react-router": "^2.7.0",
+ "react-router-redux": "^4.0.5",
+ "redux": "^3.6.0",
+ "redux-thunk": "^2.1.0",
"style-loader": "^0.13.0",
"stylus-loader": "1.5.1",
"webpack": "1.13.1",
diff --git a/webpack.config.js b/webpack.config.js
index bf4ccd26dc..32c9bd2817 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -38,7 +38,7 @@ var repo = __dirname
var config = {
entry: {
- bundle: path.join(repo, 'frontend/index.js')
+ bundle: path.join(repo, 'frontend/index.jsx')
},
output: {
path: path.join(repo, 'build'),