Skip to content

Commit 53a28d5

Browse files
committed
rehydrate error state from server to browser
1 parent 9ed74b1 commit 53a28d5

File tree

4 files changed

+31
-98
lines changed

4 files changed

+31
-98
lines changed

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@
2828
"devDependencies": {
2929
"typescript": "^2.1.4"
3030
},
31+
"peerDependencies": {
32+
"react": "15.x.x"
33+
},
3134
"dependencies": {
32-
"react": "15.x.x",
3335
"router-async": "0.5.x"
3436
}
3537
}

src/browser-router.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ export default class BrowserRouter extends Router {
88
constructor(props) {
99
super(props);
1010
this.history = props.history;
11+
if (window && '__REACT_ROUTER_ASYNC__' in window) {
12+
const stateFromServer = window['__REACT_ROUTER_ASYNC__'].state;
13+
if (stateFromServer.error !== null) {
14+
this.state = {
15+
...stateFromServer,
16+
Component: BrowserRouter.getErrorComponent(stateFromServer.error, this.errors)
17+
}
18+
}
19+
}
1120
}
1221
static async init(opts: initParams): Promise<initResult> {
1322
opts.path = opts.history.location.pathname + opts.history.location.search + opts.history.location.hash;

src/router.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface State {
1414
componentProps?: any;
1515
path?: any;
1616
location?: any;
17+
error?: any;
1718
}
1819
export interface Action {
1920
(): React.ReactElement<Props>;
@@ -58,7 +59,8 @@ export default class Router extends React.Component<Props, State> {
5859
Component,
5960
componentProps,
6061
path,
61-
location
62+
location,
63+
error: componentProps.router.error
6264
};
6365

6466
this.router = router;
@@ -152,18 +154,22 @@ export default class Router extends React.Component<Props, State> {
152154
path,
153155
location,
154156
Component,
155-
componentProps
157+
componentProps,
158+
error
156159
}, renderCallback);
157160
}
158161
}
159162
getState() {
160163
return this.state;
161164
}
162165
render() {
163-
if (this.props.children) {
164-
return React.Children.only(this.props.children)
165-
} else {
166-
return <this.state.Component {...this.state.componentProps} />
167-
}
166+
return (
167+
<div>
168+
{this.props.children ? this.props.children : <this.state.Component {...this.state.componentProps} />}
169+
<script dangerouslySetInnerHTML={{ __html: `window.__REACT_ROUTER_ASYNC__=${JSON.stringify({
170+
state: this.state
171+
})};`}} />
172+
</div>
173+
)
168174
}
169175
}

yarn.lock

Lines changed: 6 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -2,68 +2,10 @@
22
# yarn lockfile v1
33

44

5-
asap@~2.0.3:
6-
version "2.0.5"
7-
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
8-
9-
core-js@^1.0.0:
10-
version "1.2.7"
11-
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
12-
13-
encoding@^0.1.11:
14-
version "0.1.12"
15-
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
16-
dependencies:
17-
iconv-lite "~0.4.13"
18-
19-
fbjs@^0.8.4:
20-
version "0.8.8"
21-
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.8.tgz#02f1b6e0ea0d46c24e0b51a2d24df069563a5ad6"
22-
dependencies:
23-
core-js "^1.0.0"
24-
isomorphic-fetch "^2.1.1"
25-
loose-envify "^1.0.0"
26-
object-assign "^4.1.0"
27-
promise "^7.1.1"
28-
setimmediate "^1.0.5"
29-
ua-parser-js "^0.7.9"
30-
31-
iconv-lite@~0.4.13:
32-
version "0.4.15"
33-
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
34-
35-
is-stream@^1.0.1:
36-
version "1.1.0"
37-
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
38-
395
406
version "0.0.1"
417
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
428

43-
isomorphic-fetch@^2.1.1:
44-
version "2.2.1"
45-
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
46-
dependencies:
47-
node-fetch "^1.0.1"
48-
whatwg-fetch ">=0.10.0"
49-
50-
js-tokens@^3.0.0:
51-
version "3.0.0"
52-
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.0.tgz#a2f2a969caae142fb3cd56228358c89366957bd1"
53-
54-
loose-envify@^1.0.0, loose-envify@^1.1.0:
55-
version "1.3.1"
56-
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
57-
dependencies:
58-
js-tokens "^3.0.0"
59-
60-
node-fetch@^1.0.1:
61-
version "1.6.3"
62-
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
63-
dependencies:
64-
encoding "^0.1.11"
65-
is-stream "^1.0.1"
66-
679
object-assign@^4.1.0:
6810
version "4.1.1"
6911
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -74,50 +16,24 @@ path-to-regexp@^1.6.0:
7416
dependencies:
7517
isarray "0.0.1"
7618

77-
promise@^7.1.1:
78-
version "7.1.1"
79-
resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
80-
dependencies:
81-
asap "~2.0.3"
82-
8319
query-string@^4.2.3:
84-
version "4.3.1"
85-
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.1.tgz#54baada6713eafc92be75c47a731f2ebd09cd11d"
20+
version "4.3.2"
21+
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.2.tgz#ec0fd765f58a50031a3968c2431386f8947a5cdd"
8622
dependencies:
8723
object-assign "^4.1.0"
8824
strict-uri-encode "^1.0.0"
8925

90-
91-
version "15.4.2"
92-
resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef"
93-
dependencies:
94-
fbjs "^0.8.4"
95-
loose-envify "^1.1.0"
96-
object-assign "^4.1.0"
97-
9826
99-
version "0.5.2"
100-
resolved "https://registry.yarnpkg.com/router-async/-/router-async-0.5.2.tgz#6b0c5448de137dfb425798a51d5d6ce7cc312161"
27+
version "0.5.3"
28+
resolved "https://registry.yarnpkg.com/router-async/-/router-async-0.5.3.tgz#0b6c39f4858a3d37691e394b0e5cba7811c2d77d"
10129
dependencies:
10230
path-to-regexp "^1.6.0"
10331
query-string "^4.2.3"
10432

105-
setimmediate@^1.0.5:
106-
version "1.0.5"
107-
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
108-
10933
strict-uri-encode@^1.0.0:
11034
version "1.1.0"
11135
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
11236

11337
typescript@^2.1.4:
114-
version "2.1.5"
115-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.5.tgz#6fe9479e00e01855247cea216e7561bafcdbcd4a"
116-
117-
ua-parser-js@^0.7.9:
118-
version "0.7.12"
119-
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
120-
121-
whatwg-fetch@>=0.10.0:
122-
version "2.0.1"
123-
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.1.tgz#078b9461bbe91cea73cbce8bb122a05f9e92b772"
38+
version "2.2.0"
39+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.2.0.tgz#626f2fc70087d2480f21ebb12c1888288c8614e3"

0 commit comments

Comments
 (0)