Skip to content

Commit 848ae10

Browse files
author
spoeck
committed
update redux to v4
2 parents 6687861 + 81dc626 commit 848ae10

File tree

7 files changed

+137
-61
lines changed

7 files changed

+137
-61
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ Inspired by:
1313
- [x] [React](https://facebook.github.io/react/)
1414
- [x] [Redux](https://github.com/reactjs/redux)
1515
- [x] [Redux-Thunk](https://github.com/gaearon/redux-thunk)
16+
- [x] [Redux-Persist](https://github.com/rt2zz/redux-persist)
1617
- [x] [React Router](https://github.com/ReactTraining/react-router)
1718
- [x] [Redux DevTools Extension](https://github.com/zalmoxisus/redux-devtools-extension)
1819
- [x] [TodoMVC example](http://todomvc.com)
19-
- [x] Hot Reloading
20+
- [ ] Hot Reloading
2021
- [x] PWA Support
2122

2223
## How to use

package-lock.json

Lines changed: 61 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,28 @@
77
"@material-ui/icons": "3.0.1",
88
"react": "16.6.0",
99
"react-dom": "16.6.0",
10-
"react-redux": "^5.0.7",
11-
"react-router": "^4.2.0",
10+
"connected-react-router": "5.0.1",
11+
"localforage": "1.7.3",
12+
"react-redux": "5.1.0",
13+
"react-router": "4.3.1",
1214
"react-scripts-ts": "3.1.0",
13-
"redux": "^3.7.2",
15+
"redux": "4.0.1",
1416
"redux-logger": "3.0.6",
15-
"redux-persist": "^5.5.0",
16-
"redux-thunk": "2.2.0"
17+
"redux-persist": "5.10.0",
18+
"redux-thunk": "2.3.0"
1719
},
1820
"devDependencies": {
19-
"@types/history": "^4.6.2",
21+
"@types/history": "4.7.2",
2022
"@types/jest": "22.1.0",
2123
"@types/node": "9.4.0",
2224
"@types/react": "16.4.18",
2325
"@types/react-dom": "16.0.9",
24-
"@types/react-redux": "^5.0.19",
25-
"@types/react-router": "^4.0.18",
26-
"@types/redux-logger": "^3.0.5",
27-
"@types/webpack-env": "^1.13.5",
26+
"@types/react-redux": "6.0.9",
27+
"@types/react-router": "4.4.0",
28+
"@types/redux-logger": "3.0.6",
29+
"@types/webpack-env": "1.13.6",
2830
"csstype": "^2.4.2",
29-
"redux-devtools-extension": "^2.13.2",
31+
"redux-devtools-extension": "2.13.5",
3032
"typescript": "3.1.3"
3133
},
3234
"scripts": {
@@ -35,4 +37,4 @@
3537
"test": "react-scripts-ts test --env=jsdom",
3638
"eject": "react-scripts-ts eject"
3739
}
38-
}
40+
}

src/App.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@ import { WithWidth } from '@material-ui/core/withWidth';
33
import TodoIcon from '@material-ui/icons/FormatListNumbered';
44
import HomeIcon from '@material-ui/icons/Home';
55
import MenuIcon from '@material-ui/icons/Menu';
6-
import { createBrowserHistory } from 'history';
76
import * as React from 'react';
87
import { connect } from 'react-redux';
9-
import { Route, RouteComponentProps, Router } from 'react-router';
8+
import { Route, RouteComponentProps } from 'react-router';
109
import { Todo } from './model/model';
1110
import HomePage from './pages/HomePage';
1211
import TodoPage from './pages/TodoPage';
1312
import { RootState } from './reducers/index';
1413
import { isSmartphone } from './responsive';
1514
import withRoot from './withRoot';
15+
import { history } from './configureStore';
16+
import { ConnectedRouter } from 'connected-react-router';
1617

1718
export namespace App {
1819
export interface Props extends RouteComponentProps<void>, WithStyles<typeof styles>, WithWidth {
@@ -24,8 +25,6 @@ export namespace App {
2425
}
2526
}
2627

27-
const history = createBrowserHistory();
28-
2928
class App extends React.Component<App.Props, App.State> {
3029

3130
state = {
@@ -70,7 +69,7 @@ class App extends React.Component<App.Props, App.State> {
7069
);
7170

7271
return (
73-
<Router history={history}>
72+
<ConnectedRouter history={history}>
7473
<div className={classes.root}>
7574
<div className={classes.appFrame}>
7675
<AppBar className={classes.appBar}>
@@ -118,7 +117,7 @@ class App extends React.Component<App.Props, App.State> {
118117
{this.routes}
119118
</div>
120119
</div>
121-
</Router>
120+
</ConnectedRouter>
122121
);
123122
}
124123

src/ReduxRoot.tsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
1+
2+
import { Typography } from '@material-ui/core';
13
import * as React from 'react';
24
import { Provider } from 'react-redux';
3-
import { applyMiddleware, createStore, Store } from 'redux';
5+
import { applyMiddleware } from 'redux';
46
import { composeWithDevTools } from 'redux-devtools-extension';
57
import { createLogger } from 'redux-logger';
8+
import { PersistGate } from 'redux-persist/integration/react';
69
import thunk from 'redux-thunk';
710
import App from './App';
8-
import rootReducer, { RootState } from './reducers';
11+
import configureStore from './configureStore';
912

1013
const logger = (createLogger as any)();
1114

12-
var middleware;
15+
var middleware = applyMiddleware(logger, thunk);
1316

1417
if (process.env.NODE_ENV === 'development') {
15-
// middleware for development with logger and devTools
16-
middleware = composeWithDevTools(applyMiddleware(logger, thunk));
17-
} else {
18-
// middleware for production
19-
middleware = applyMiddleware(thunk);
18+
middleware = composeWithDevTools(middleware);
2019
}
2120

22-
const store = createStore(rootReducer, {}, middleware) as Store<RootState>;
21+
const { persistor, store } = configureStore();
2322

2423
class ReduxRoot extends React.Component {
2524

@@ -31,10 +30,12 @@ class ReduxRoot extends React.Component {
3130

3231
return (
3332
<Provider store={store}>
34-
<App />
33+
<PersistGate loading={<Typography>Loading...</Typography>} persistor={persistor}>
34+
<App />
35+
</PersistGate>
3536
</Provider>
3637
);
3738
}
3839
}
3940

40-
export default ReduxRoot;
41+
export default ReduxRoot;

src/configureStore.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { routerMiddleware } from 'connected-react-router';
2+
import { createBrowserHistory } from 'history';
3+
import * as localforage from 'localforage';
4+
import { applyMiddleware, createStore } from 'redux';
5+
import { composeWithDevTools } from 'redux-devtools-extension';
6+
import { createLogger } from 'redux-logger';
7+
import { PersistConfig, persistReducer, persistStore } from 'redux-persist';
8+
import thunk from 'redux-thunk';
9+
import rootReducer from './reducers';
10+
11+
const persistConfig: PersistConfig = {
12+
key: 'root',
13+
version: 1,
14+
storage: localforage,
15+
blacklist: [],
16+
};
17+
18+
const logger = (createLogger as any)();
19+
const history = createBrowserHistory();
20+
21+
const dev = process.env.NODE_ENV === 'development';
22+
23+
var middleware = dev ? applyMiddleware(logger, thunk, routerMiddleware(history)) :
24+
applyMiddleware(thunk, routerMiddleware(history));
25+
26+
if (dev) {
27+
middleware = composeWithDevTools(middleware);
28+
}
29+
30+
const persistedReducer = persistReducer(persistConfig, rootReducer(history));
31+
32+
export default () => {
33+
let store = createStore(persistedReducer, {}, middleware);
34+
let persistor = persistStore(store);
35+
return { store, persistor };
36+
};
37+
38+
export { history };

src/reducers/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11

2+
import { connectRouter } from 'connected-react-router';
3+
import { History } from 'history';
24
import { combineReducers } from 'redux';
3-
import * as todoReducder from './todo';
45
import { Todo } from '../model/model';
6+
import * as todoReducder from './todo';
57

68
export interface RootState {
79
todoList: Array<Todo>;
810
}
911

10-
export default combineReducers<RootState>({
12+
export default (history: History) => combineReducers({
13+
router: connectRouter(history),
1114
...todoReducder
1215
});

0 commit comments

Comments
 (0)