Skip to content
This repository was archived by the owner on Dec 9, 2021. It is now read-only.

Commit 27bd058

Browse files
authoredOct 9, 2017
Redux with router (#10)
* add react-router-redux * change createBrowserHistory back to createMemoryHistory for server * update dependencies
1 parent 2faca33 commit 27bd058

File tree

8 files changed

+221
-154
lines changed

8 files changed

+221
-154
lines changed
 

‎package.json

+14-10
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,20 @@
4949
"devDependencies": {
5050
"@types/fs-extra": "4.0.2",
5151
"@types/hapi": "16.1.10",
52+
"@types/history": "4.6.0",
5253
"@types/inert": "4.2.3",
53-
"@types/node": "8.0.31",
54+
"@types/node": "8.0.33",
5455
"@types/node-notifier": "0.0.28",
55-
"@types/react": "16.0.7",
56+
"@types/react": "16.0.10",
5657
"@types/react-dom": "15.5.5",
5758
"@types/react-hot-loader": "3.0.4",
58-
"@types/react-redux": "5.0.9",
59+
"@types/react-redux": "5.0.10",
5960
"@types/react-router": "4.0.15",
6061
"@types/react-router-dom": "4.0.8",
61-
"@types/redux-form": "7.0.5",
62+
"@types/react-router-redux": "5.0.8",
63+
"@types/redux-form": "7.0.6",
6264
"@types/serialize-javascript": "1.3.1",
63-
"@types/webpack": "3.0.12",
65+
"@types/webpack": "3.0.13",
6466
"@types/webpack-env": "1.13.1",
6567
"awesome-typescript-loader": "3.2.3",
6668
"babel-cli": "6.26.0",
@@ -75,11 +77,11 @@
7577
"babel-preset-stage-2": "6.24.1",
7678
"babel-watch": "2.0.7",
7779
"concurrently": "3.5.0",
78-
"copy-webpack-plugin": "4.1.0",
80+
"copy-webpack-plugin": "4.1.1",
7981
"cross-env": "5.0.5",
80-
"css-hot-loader": "1.3.1",
82+
"css-hot-loader": "1.3.2",
8183
"css-loader": "0.28.7",
82-
"extract-text-webpack-plugin": "3.0.0",
84+
"extract-text-webpack-plugin": "3.0.1",
8385
"html-webpack-harddisk-plugin": "0.1.0",
8486
"html-webpack-plugin": "2.30.1",
8587
"nodemon": "1.12.1",
@@ -89,7 +91,7 @@
8991
"postcss-loader": "2.0.6",
9092
"rimraf": "2.6.2",
9193
"robotstxt-webpack-plugin": "2.0.0",
92-
"style-loader": "0.18.2",
94+
"style-loader": "0.19.0",
9395
"tslib": "1.7.1",
9496
"tslint": "5.7.0",
9597
"tslint-react": "3.2.0",
@@ -105,6 +107,7 @@
105107
"fs-extra": "4.0.2",
106108
"hapi": "16.6.2",
107109
"hapi-webpack-plugin": "2.0.0",
110+
"history": "4.7.2",
108111
"inert": "4.2.1",
109112
"node-notifier": "5.1.2",
110113
"react": "16.0.0",
@@ -115,9 +118,10 @@
115118
"react-redux": "5.0.6",
116119
"react-router": "4.2.0",
117120
"react-router-dom": "4.2.2",
121+
"react-router-redux": "next",
118122
"redux": "3.7.2",
119123
"redux-devtools-extension": "2.13.2",
120-
"redux-form": "7.0.4",
124+
"redux-form": "7.1.0",
121125
"redux-saga": "0.15.6",
122126
"serialize-javascript": "1.4.0",
123127
"webpack": "3.6.0"

‎src/RouterWrapper.tsx

100644100755
+7-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import * as React from 'react';
22
import {Provider} from 'react-redux';
3-
import {BrowserRouter, Route, Switch, Redirect} from 'react-router-dom';
3+
import {ConnectedRouter} from 'react-router-redux';
4+
import {History, createMemoryHistory} from 'history';
45
import {StaticRouter} from 'react-router';
6+
import {Route, Switch, Redirect} from 'react-router-dom';
57
import AboutAsync from './views/about/AboutAsync';
68
import Home from './views/home/Home';
79
import Contact from './views/contact/Contact';
@@ -16,16 +18,19 @@ interface IProviderWrapperProps {
1618
isServerSide: boolean;
1719
location?: string;
1820
context?: any;
21+
history?: History;
1922
}
2023

2124
const RouterWrapper: React.StatelessComponent<IProviderWrapperProps> = (props: IProviderWrapperProps): JSX.Element => {
22-
const Router: any = props.isServerSide ? StaticRouter : BrowserRouter;
25+
const Router: any = props.isServerSide ? StaticRouter : ConnectedRouter;
26+
const history: History = props.isServerSide ? createMemoryHistory() : props.history;
2327

2428
return (
2529
<Provider store={props.store}>
2630
<Router
2731
context={props.context}
2832
location={props.location}
33+
history={history}
2934
>
3035
<div className="container">
3136
<Header />

‎src/client.tsx

+10-5
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,29 @@ import 'bootstrap/dist/css/bootstrap.css';
22
import './assets/styles/styles.css';
33

44
import 'fetch-everywhere';
5+
import * as React from 'react';
6+
import * as ReactDOM from 'react-dom';
7+
import {History, createBrowserHistory} from 'history';
58
import {AppContainer as ReactHotLoader} from 'react-hot-loader';
69
import {AsyncComponentProvider} from 'react-async-component';
710
import asyncBootstrapper from 'react-async-bootstrapper';
8-
import * as React from 'react';
9-
import * as ReactDOM from 'react-dom';
1011
import RouterWrapper from './RouterWrapper';
1112
import ProviderService from './services/ProviderService';
1213
import IStore from './stores/IStore';
1314
import ISagaStore from './stores/ISagaStore';
1415

1516
const codeSplittingState = window.__ASYNC_COMPONENTS_STATE__;
17+
const serverState: IStore = window.__STATE__;
1618
const initialState: IStore = {
17-
...window.__STATE__,
19+
...serverState,
1820
renderReducer: {
21+
...serverState.renderReducer,
1922
isServerSide: false,
2023
},
2124
};
22-
const store: ISagaStore<IStore> = ProviderService.createProviderStore(initialState);
25+
26+
const history: History = createBrowserHistory();
27+
const store: ISagaStore<IStore> = ProviderService.createProviderStore(initialState, history);
2328
const rootEl: HTMLElement = document.getElementById('root');
2429

2530
delete window.__STATE__;
@@ -28,7 +33,7 @@ delete window.__ASYNC_COMPONENTS_STATE__;
2833
const composeApp = (Component: any) => (
2934
<ReactHotLoader key={Math.random()}>
3035
<AsyncComponentProvider rehydrateState={codeSplittingState}>
31-
<Component store={store} />
36+
<Component store={store} history={history} />
3237
</AsyncComponentProvider>
3338
</ReactHotLoader>
3439
);

‎src/server/controllers/ReactController.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ReactController implements IController {
2222
method: 'GET',
2323
path: '/{route*}',
2424
handler: async (request: Hapi.Request, reply: Hapi.ReplyNoContinue): Promise<void> => {
25-
const store: ISagaStore<IStore> = ProviderService.createProviderStore({}, true);
25+
const store: ISagaStore<IStore> = ProviderService.createProviderStore({}, null, true);
2626
const asyncContext: any = createAsyncContext();
2727
const routeContext: any = {};
2828
const app = (

‎src/services/ProviderService.ts

100644100755
+8-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import {createStore, applyMiddleware} from 'redux';
2+
import {routerMiddleware} from 'react-router-redux';
3+
import {History} from 'history';
24
import rootReducer from '../stores/rootReducer';
35
import {composeWithDevTools} from 'redux-devtools-extension/developmentOnly';
46
import createSagaMiddleware, {END, SagaMiddleware} from 'redux-saga';
@@ -8,13 +10,16 @@ import ISagaStore from '../stores/ISagaStore';
810

911
class ProviderService {
1012

11-
public static createProviderStore(initialState: any = {}, isServerSide: boolean = false): ISagaStore<IStore> {
13+
public static createProviderStore(initialState: any = {}, history: History = null, isServerSide: boolean = false): ISagaStore<IStore> {
1214
const sagaMiddleware: SagaMiddleware<any> = createSagaMiddleware();
1315

1416
const store = createStore(
1517
rootReducer,
1618
initialState,
17-
composeWithDevTools(applyMiddleware(sagaMiddleware)),
19+
composeWithDevTools(applyMiddleware(
20+
sagaMiddleware,
21+
routerMiddleware(history),
22+
)),
1823
) as ISagaStore<IStore>;
1924

2025
if (isServerSide) {
@@ -29,7 +34,7 @@ class ProviderService {
2934
return store;
3035
}
3136

32-
private static _setupHotReloading(store: ISagaStore<IStore>) {
37+
private static _setupHotReloading(store: ISagaStore<IStore>): void {
3338
if (module.hot) {
3439
module.hot.accept('../stores/rootReducer', () => {
3540
const nextReducer = require('../stores/rootReducer').default; // tslint:disable-line:no-require-imports

‎src/stores/IStore.ts

100644100755
+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {RouterState} from 'react-router-redux';
2+
import {Reducer} from 'redux';
13
import {FormReducer} from 'redux-form';
24
import ILoadingReducerState from './loading/ILoadingReducerState';
35
import IMetaReducerState from './meta/IMetaReducerState';
@@ -10,6 +12,7 @@ interface IStore {
1012
readonly metaReducer: IMetaReducerState;
1113
readonly renderReducer: IRenderReducerState;
1214
readonly userReducer: IUserReducerState;
15+
readonly router: Reducer<RouterState>;
1316
}
1417

1518
export default IStore;

‎src/stores/rootReducer.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {combineReducers, Reducer} from 'redux';
2+
import {routerReducer} from 'react-router-redux';
23
import UserReducer from './user/UserReducer';
34
import LoadingReducer from './loading/LoadingReducer';
45
import MetaReducer from './meta/MetaReducer';
@@ -12,6 +13,7 @@ const reducers: IStore = {
1213
metaReducer: MetaReducer.reduce as any,
1314
renderReducer: RenderReducer.reduce as any,
1415
userReducer: UserReducer.reduce as any,
16+
router: routerReducer,
1517
};
1618

1719
export default combineReducers<IStore>(reducers as any) as Reducer<IStore>;

‎yarn.lock

+176-133
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
This repository has been archived.