Skip to content

Commit 69f4d27

Browse files
committed
Initial release
1 parent c50a588 commit 69f4d27

7 files changed

+249
-111
lines changed

.travis.yml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
language: node_js
2+
sudo: false
3+
node_js:
4+
- 6
5+
6+
cache:
7+
directories:
8+
- node_modules
9+
10+
script:
11+
- npm i -g typings
12+
- typings install
13+
- npm run transpile
14+
15+
deploy:
16+
provider: npm
17+
18+
api_key: $NPM_API_KEY
19+
on:
20+
tags: true
21+
repo: router-async/hook-fetcher

package.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717
"typings": "lib/index.d.ts",
1818
"scripts": {
1919
"clean": "rm -rf lib",
20-
"watch": "npm run clean && tsc -p . --watch",
21-
"transpile": "npm run clean && tsc -p .",
20+
"watch": "yarn run clean && tsc -p . --watch",
21+
"transpile": "yarn run clean && tsc -p .",
2222
"tsc": "tsc"
2323
},
2424
"devDependencies": {
2525
"typescript": "next"
26+
},
27+
"dependencies": {
28+
"react": "15.x.x"
2629
}
2730
}

src/index.ts

-106
This file was deleted.

src/index.tsx

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import * as React from 'react';
2+
3+
function runPromises(items, props = {}) {
4+
return new Promise((resolve, reject) => {
5+
let pending = items.length;
6+
let values = {};
7+
if (pending == 0) resolve(values);
8+
function checkAndResolve(value, data) {
9+
pending--;
10+
if (data && data.key) values[data.key] = value;
11+
if (pending == 0) resolve(values);
12+
}
13+
items.forEach(item => {
14+
item.promise(props).then(value => {
15+
checkAndResolve(value, item.data);
16+
return value;
17+
}).catch(error => {
18+
if (item.critical) {
19+
reject(error);
20+
} else {
21+
checkAndResolve(error, item.data);
22+
}
23+
throw error;
24+
})
25+
});
26+
});
27+
}
28+
29+
export interface Options {
30+
errorHandler?: Function
31+
}
32+
33+
export function hookFetcher(options: Options = {}) {
34+
return {
35+
start: ({ ctx }) => {
36+
ctx.set('fetcher', {
37+
items: [],
38+
deferred: [],
39+
values: {}
40+
});
41+
},
42+
resolve: async ({ ctx, params, result }) => {
43+
// check if fetcher instance
44+
if (!result.isFetcher) {
45+
console.warn('Component not wrapped with Fetcher');
46+
return;
47+
}
48+
// set init values
49+
result.items.forEach(({ data }) => {
50+
if (data && data.key && data.value) {
51+
ctx.get('fetcher').values[data.key] = data.value;
52+
}
53+
});
54+
// filter deferred items
55+
ctx.get('fetcher').deferred = result.items.filter(item => item.deferred);
56+
ctx.get('fetcher').items = result.items.filter(item => !item.deferred);
57+
// execute promises and return result
58+
try {
59+
const values = await runPromises(ctx.get('fetcher').items, { params });
60+
Object.assign(ctx.get('fetcher').values, values);
61+
} catch (error) {
62+
if (options.errorHandler) {
63+
options.errorHandler(error);
64+
} else {
65+
console.error('Hook fetcher resolve error', error);
66+
throw error;
67+
}
68+
}
69+
},
70+
render: async ({ ctx, params }) => {
71+
if (ctx.get('fetcher').deferred.length) {
72+
try {
73+
const values = await runPromises(ctx.get('fetcher').deferred, { params });
74+
Object.assign(ctx.get('fetcher').values, values);
75+
if (ctx.get('fetcher').callback) ctx.get('fetcher').callback(values);
76+
} catch (error) {
77+
if (options.errorHandler) {
78+
options.errorHandler(error);
79+
} else {
80+
console.error('Hook fetcher render error', error);
81+
throw error;
82+
}
83+
}
84+
}
85+
}
86+
}
87+
}
88+
89+
export interface Props {
90+
router: Object
91+
}
92+
export interface State {
93+
data: Object
94+
}
95+
// Helps track hot reloading.
96+
// let nextVersion = 0;
97+
export function fetcher(items) {
98+
// Helps track hot reloading.
99+
// const version = nextVersion++;
100+
return function wrapWithFetcherConnect(WrappedComponent) {
101+
return class FetcherConnect extends React.Component<Props, State> {
102+
// private version: number;
103+
static isFetcher = true;
104+
static items = items;
105+
constructor(props) {
106+
super(props);
107+
// this.version = version;
108+
this.state = {
109+
data: props.router.ctx.get('fetcher').values
110+
};
111+
props.router.ctx.get('fetcher').callback = values => {
112+
this.setState({
113+
data: values
114+
})
115+
}
116+
}
117+
render() {
118+
return <WrappedComponent data={this.state.data} router={this.props.router} />
119+
}
120+
}
121+
}
122+
}

tsconfig.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22
"compilerOptions": {
33
"target": "es5",
44
"module": "commonjs",
5-
"outDir": "./lib"/*,
6-
"declaration": true*/
5+
"outDir": "./lib",
6+
//"declaration": true,
7+
"jsx": "react"
78
},
89
"include": [
910
"src/**/*",

typings.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"globalDependencies": {
33
"es2015": "registry:env/es2015#1.0.0+20160526151700"
4+
},
5+
"dependencies": {
6+
"react": "registry:npm/react#15.0.1+20160601175240"
47
}
5-
}
8+
}

yarn.lock

+94
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2+
# yarn lockfile v1
3+
asap@~2.0.3:
4+
version "2.0.5"
5+
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
6+
7+
core-js@^1.0.0:
8+
version "1.2.7"
9+
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
10+
11+
encoding@^0.1.11:
12+
version "0.1.12"
13+
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
14+
dependencies:
15+
iconv-lite "~0.4.13"
16+
17+
fbjs@^0.8.4:
18+
version "0.8.5"
19+
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.5.tgz#f69ba8a876096cb1b9bffe4d7c1e71c19d39d008"
20+
dependencies:
21+
core-js "^1.0.0"
22+
immutable "^3.7.6"
23+
isomorphic-fetch "^2.1.1"
24+
loose-envify "^1.0.0"
25+
object-assign "^4.1.0"
26+
promise "^7.1.1"
27+
ua-parser-js "^0.7.9"
28+
29+
iconv-lite@~0.4.13:
30+
version "0.4.13"
31+
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
32+
33+
immutable@^3.7.6:
34+
version "3.8.1"
35+
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2"
36+
37+
is-stream@^1.0.1:
38+
version "1.1.0"
39+
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
40+
41+
isomorphic-fetch@^2.1.1:
42+
version "2.2.1"
43+
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
44+
dependencies:
45+
node-fetch "^1.0.1"
46+
whatwg-fetch ">=0.10.0"
47+
48+
js-tokens@^1.0.1:
49+
version "1.0.3"
50+
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.3.tgz#14e56eb68c8f1a92c43d59f5014ec29dc20f2ae1"
51+
52+
loose-envify@^1.0.0, loose-envify@^1.1.0:
53+
version "1.2.0"
54+
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f"
55+
dependencies:
56+
js-tokens "^1.0.1"
57+
58+
node-fetch@^1.0.1:
59+
version "1.6.3"
60+
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
61+
dependencies:
62+
encoding "^0.1.11"
63+
is-stream "^1.0.1"
64+
65+
object-assign@^4.1.0:
66+
version "4.1.0"
67+
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
68+
69+
promise@^7.1.1:
70+
version "7.1.1"
71+
resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
72+
dependencies:
73+
asap "~2.0.3"
74+
75+
76+
version "15.3.2"
77+
resolved "https://registry.yarnpkg.com/react/-/react-15.3.2.tgz#a7bccd2fee8af126b0317e222c28d1d54528d09e"
78+
dependencies:
79+
fbjs "^0.8.4"
80+
loose-envify "^1.1.0"
81+
object-assign "^4.1.0"
82+
83+
typescript@next:
84+
version "2.1.0-dev.20161024"
85+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.0-dev.20161024.tgz#8c9bd571ce990a1bc01444e28b5124658145b83a"
86+
87+
ua-parser-js@^0.7.9:
88+
version "0.7.10"
89+
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.10.tgz#917559ddcce07cbc09ece7d80495e4c268f4ef9f"
90+
91+
whatwg-fetch@>=0.10.0:
92+
version "1.0.0"
93+
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-1.0.0.tgz#01c2ac4df40e236aaa18480e3be74bd5c8eb798e"
94+

0 commit comments

Comments
 (0)