Skip to content

Commit 72431f3

Browse files
committed
feat(router5): couple things
- bring back react-router5 - use RouterProvider and its router context - fix mapStateToProps in App - add type def - formatting - fix module.hot
1 parent e9b91c3 commit 72431f3

7 files changed

Lines changed: 98 additions & 46 deletions

File tree

config/types/react-router5.d.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
declare module "react-router5" {
2+
import { Component, Props } from "react";
3+
import { Router } from "router5";
4+
5+
interface IRouteOptions {
6+
reload?: boolean;
7+
}
8+
9+
interface ILinkProps extends Props<Link> {
10+
router?: Router;
11+
routeName: string;
12+
routeParams?: {};
13+
routeOptions?: IRouteOptions;
14+
activeClassName?: string;
15+
activeStrict?: boolean;
16+
onClick?: () => any;
17+
}
18+
19+
interface IRouterProviderProps {
20+
router: Router;
21+
}
22+
23+
class BaseLink extends Component<ILinkProps, {}> { }
24+
// noinspection TsLint
25+
class Link extends Component<ILinkProps, {}> { }
26+
// noinspection TsLint
27+
class RouterProvider extends Component<IRouterProviderProps, {}> { }
28+
29+
function routeNode(nodeName: string, register?: boolean): (hoc: any) => any;
30+
31+
function withRoute<C>(BaseComponent: C): C;
32+
33+
export {
34+
BaseLink,
35+
routeNode,
36+
RouterProvider,
37+
withRoute,
38+
Link
39+
};
40+
}

package-lock.json

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

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
"@types/enzyme": "^2.8.1",
5151
"@types/isomorphic-fetch": "0.0.34",
5252
"@types/jest": "^19.2.3",
53-
"@types/lodash": "^4.14.68",
5453
"@types/node": "^8.0.2",
54+
"@types/prop-types": "^15.5.1",
5555
"@types/raven-js": "^3.10.0",
5656
"@types/react": "^15.0.31",
5757
"@types/react-addons-test-utils": "^0.14.19",
@@ -103,7 +103,7 @@
103103
"es6-promise": "^4.0.5",
104104
"express": "^4.14.0",
105105
"isomorphic-fetch": "^2.2.1",
106-
"lodash": "^4.17.4",
106+
"prop-types": "^15.5.10",
107107
"raven-for-redux": "^1.0.0",
108108
"raven-js": "^3.16.0",
109109
"react": "^15.5.4",
@@ -113,6 +113,7 @@
113113
"react-redux": "^5.0.2",
114114
"react-router": "^3.0.2",
115115
"react-router-redux": "^4.0.7",
116+
"react-router5": "^5.0.2",
116117
"redux": "^3.6.0",
117118
"redux-form": "^6.8.0",
118119
"redux-logger": "^3.0.0",

src/app/components/Link.tsx

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
1-
import {isEqual} from "lodash";
1+
import {object} from "prop-types";
22
import * as React from "react";
33
import {connect} from "react-redux";
44
import {actions} from "redux-router5";
5-
import {State as IRouterState} from "router5";
5+
import {Router, State as IRouterState} from "router5";
66

77
class Link extends React.Component<IStateToProps & IDispatchToProps & IOwnProps, null> {
8+
public static contextTypes: React.ValidationMap<any> = {
9+
router: object.isRequired
10+
};
11+
12+
public context: {
13+
router: Router;
14+
};
15+
816
public render(): JSX.Element {
9-
const {children, name, params, options, route} = this.props;
17+
const {children, name, params, options} = this.props;
18+
const {navigateTo} = actions;
1019

11-
const href = this.buildUrl(name, params);
20+
const href = this.context.router.buildPath(name, params);
1221
const onClick = (evt) => {
1322
evt.preventDefault();
14-
this.props.dispatch(actions.navigateTo(name, params, options));
23+
this.props.dispatch(navigateTo(name, params, options));
1524
};
16-
const className = (route.name === name && (!params || isEqual(route.params, params))) ? "active" : "";
25+
const className = this.context.router.isActive(name, params) ? "active" : "";
1726

1827
return <a {...{className, href, onClick}}>{children}</a>;
1928
}
20-
21-
// todo: now only assume query params, will implement other types of params
22-
private buildUrl(name: string, params: {[key: string]: string}): string {
23-
let url: string = name;
24-
if (params) {
25-
Object.keys(params).forEach((key) => {
26-
url += `?${key}=${params[key]}`;
27-
});
28-
}
29-
return url;
30-
}
3129
}
3230

3331
interface IStateToProps {

src/app/containers/App.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const Styles = {
4242
};
4343

4444
class App extends React.Component<IStateToProps, null> {
45-
private components: any = {
45+
private components: {[key: string]: React.ComponentClass} = {
4646
about: AboutPage,
4747
counter: CounterPage,
4848
home: HomePage,
@@ -62,7 +62,7 @@ class App extends React.Component<IStateToProps, null> {
6262
<IntlProvider locale={language.payload.locale} messages={language.payload.languageData}>
6363
<section className={Styles.container}>
6464
<Helmet {...appConfig.app.head}/>
65-
<Header />
65+
<Header/>
6666
{segment && this.components[segment] ? React.createElement(this.components[segment]) : <div>Not found</div>}
6767
</section>
6868
</IntlProvider>
@@ -76,7 +76,7 @@ interface IStateToProps {
7676
}
7777

7878
const mapStateToProps = (state: Partial<IStore>) => ({
79-
languages: state.language,
79+
language: state.language,
8080
...routeNodeSelector("")(state)
8181
});
8282

src/client.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import "isomorphic-fetch";
44
import * as React from "react";
55
import * as ReactDOM from "react-dom";
66
import {Provider} from "react-redux";
7+
import {RouterProvider} from "react-router5";
78
import {setStylesTarget} from "typestyle";
9+
810
import {App} from "./app/containers";
911
import {configureStore} from "./app/redux/configureStore";
1012
import {configureRouter} from "./app/routes/configureRouter";
@@ -24,7 +26,9 @@ store.runSaga(rootSaga);
2426
ReactDOM.render(
2527
<ReactHotLoader>
2628
<Provider store={store} key="provider">
27-
<App/>
29+
<RouterProvider router={router}>
30+
<App/>
31+
</RouterProvider>
2832
</Provider>
2933
</ReactHotLoader>,
3034
document.getElementById("app")
@@ -33,14 +37,17 @@ ReactDOM.render(
3337
setStylesTarget(document.getElementById("styles-target"));
3438

3539
if ((module as any).hot) {
36-
(module as any).hot.accept("./app/routes/routes", () => {
40+
(module as any).hot.accept("./app/containers", () => {
3741
const {App} = require("./app/containers");
3842
ReactDOM.render(
3943
<ReactHotLoader>
4044
<Provider store={store}>
41-
<App/>
45+
<RouterProvider router={router}>
46+
<App/>
47+
</RouterProvider>
4248
</Provider>
4349
</ReactHotLoader>,
44-
document.getElementById("app"));
50+
document.getElementById("app")
51+
);
4552
});
4653
}

src/server.tsx

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
1-
import {LanguageHelper} from "./app/helpers/LanguageHelper";
2-
3-
const appConfig = require("../config/main");
4-
51
import * as e6p from "es6-promise";
2+
(e6p as any).polyfill();
63
import "isomorphic-fetch";
7-
84
import * as React from "react";
9-
import { renderToString } from "react-dom/server";
10-
5+
import {renderToString} from "react-dom/server";
116
import {Provider} from "react-redux";
12-
import {configureStore} from "./app/redux/configureStore";
13-
import {configureRouter} from "./app/routes/configureRouter";
14-
import rootSaga from "./app/sagas/rootSaga";
7+
import {RouterProvider} from "react-router5";
158

169
import {App, Html} from "./app/containers";
10+
import {LanguageHelper} from "./app/helpers/LanguageHelper";
11+
import {configureStore} from "./app/redux/configureStore";
1712
import {ILanguage} from "./app/redux/modules/languageModule";
18-
(e6p as any).polyfill();
19-
const manifest = require("../build/manifest.json");
13+
import {configureRouter} from "./app/routes/configureRouter";
14+
import rootSaga from "./app/sagas/rootSaga";
2015

2116
const express = require("express");
2217
const path = require("path");
2318
const Chalk = require("chalk");
2419
const favicon = require("serve-favicon");
2520

21+
const appConfig = require("../config/main");
22+
const manifest = require("../build/manifest.json");
2623
const app = express();
2724
const translationHandler = (req, res) => {
2825
const languageHelper = new LanguageHelper(req.params.lang);
@@ -99,7 +96,9 @@ app.get("*", (req, res) => {
9996
// render again from the initial data
10097
const markup = renderToString(
10198
<Provider store={store} key="provider">
102-
<App />
99+
<RouterProvider router={router}>
100+
<App/>
101+
</RouterProvider>
103102
</Provider>
104103
);
105104

@@ -119,7 +118,9 @@ app.get("*", (req, res) => {
119118
// first render to activate componentWillMount to dispatch actions for loading initial data
120119
renderToString(
121120
<Provider store={store} key="provider">
122-
<App />
121+
<RouterProvider router={router}>
122+
<App/>
123+
</RouterProvider>
123124
</Provider>
124125
);
125126

0 commit comments

Comments
 (0)