Skip to content

Commit

Permalink
Merge pull request #18 from lexich/request_method
Browse files Browse the repository at this point in the history
Extract `request` method for pure xhr request
  • Loading branch information
lexich committed Oct 14, 2015
2 parents b2a1192 + df3b950 commit 3c8e769
Show file tree
Hide file tree
Showing 11 changed files with 108 additions and 37 deletions.
17 changes: 15 additions & 2 deletions README.md
Expand Up @@ -337,8 +337,11 @@ dispatch(rest.actions.entries.sync());
###Actions sub methods
#### sync
#### sync(urlparams, params, callback)
- @description: this method save you from twice requests flag `sync`. if `sync===true` requst wouldn't execute. In server-side mode calls twice
- @param **urlparams** - update url according Url schema
- @param **params** - add additional params to rest request
- @param **callback** - callback function when action ends
- @type: Function
- @example:
Expand All @@ -350,7 +353,7 @@ function onEnter(state, replaceState, callback) {

```
#### reset
#### reset()
- @description: Reset state of current reducer
- @type: Function
- @example:
Expand All @@ -362,6 +365,16 @@ function onLeave(state, replaceState, callback) {

```
#### request()
- @description: Pure xhr request without sending events or catching reducers.
- @type: Function
- @example:
```js
import {actions} from "./rest";
actions.entries.request().then((data)=> {
....
});
```
### Url schema
/api/v1/user/:id
Expand Down
2 changes: 1 addition & 1 deletion bower.json
@@ -1,6 +1,6 @@
{
"name": "redux-api",
"version": "0.6.6",
"version": "0.6.7",
"main": "dist/redux-api.min.js",
"dependencies": {}
}
48 changes: 39 additions & 9 deletions dist/redux-api.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/redux-api.js.map

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dist/redux-api.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/redux-api.min.js.map

Large diffs are not rendered by default.

9 changes: 5 additions & 4 deletions examples/isomorphic/app/pages/Repo.jsx
Expand Up @@ -5,17 +5,18 @@ import { Link } from "react-router";
class Repo extends React.Component {
render() {
const { repo } = this.props;
const data = repo.data;
const data = repo.data || {};
const owner = data.owner || {};
return !repo.loading ? (
<div className="Repo media">
<div className="media-left">
<Link to={`/${data.owner.login}`}>
<img className="Repo__media media-object" src={data.owner.avatar_url } />
<Link to={`/${owner.login}`}>
<img className="Repo__media media-object" src={owner.avatar_url } />
</Link>
</div>
<div className="media-body">
<h4>{ data.name }</h4>
<Link to={`/${data.owner.login}`}>@{ data.owner.login }</Link>&nbsp;
<Link to={`/${owner.login}`}>@{ owner.login }</Link>&nbsp;
Stars { data.stargazers_count } Forks {data.forks }
</div>
</div>) : ( <div className="Repo">Loading</div> );
Expand Down
7 changes: 3 additions & 4 deletions examples/isomorphic/package.json
Expand Up @@ -12,15 +12,14 @@
"dependencies": {
"ejs": "^2.3.4",
"express": "^4.13.3",
"history": "^1.11.1",
"history": "^1.12.5",
"isomorphic-fetch": "^2.1.1",
"react": "^0.14.0",
"react-dom": "^0.14.0",
"react-redux": "^3.0.0",
"react-router": "^1.0.0-rc3",
"redux": "^3.0.2",
"redux-thunk": "^1.0.0",
"react-dom": "^0.14.0",
"whatwg-fetch": "^0.9.0"
"redux-thunk": "^1.0.0"
},
"devDependencies": {
"babel-core": "^5.8.25",
Expand Down
10 changes: 5 additions & 5 deletions package.json
@@ -1,6 +1,6 @@
{
"name": "redux-api",
"version": "0.6.6",
"version": "0.6.7",
"author": {
"name": "Efremov Alex",
"email": "lexich121@gmail.com",
Expand All @@ -26,19 +26,19 @@
"dependencies": {
"fast-apply": "0.0.3",
"lodash": "^3.10.1",
"qs": "^5.1.0"
"qs": "^5.2.0"
},
"devDependencies": {
"babel": "^5.8.23",
"babel-eslint": "^4.1.3",
"babel-loader": "^5.3.2",
"chai": "^3.3.0",
"coveralls": "^2.11.4",
"eslint": "^1.5.1",
"eslint": "^1.6.0",
"eslint-config-airbnb": "^0.1.0",
"eslint-plugin-react": "^3.4.2",
"eslint-plugin-react": "^3.5.1",
"husky": "^0.10.1",
"istanbul": "^0.3.21",
"istanbul": "^0.3.22",
"mocha": "^2.3.3",
"mocha-lcov-reporter": "^1.0.0",
"webpack": "^1.12.2"
Expand Down
29 changes: 22 additions & 7 deletions src/actionFn.js
Expand Up @@ -37,6 +37,20 @@ function extractArgs(args) {
export default function actionFn(url, name, options, ACTIONS={}, meta={}) {
const {actionFetch, actionSuccess, actionFail, actionReset} = ACTIONS;
const pubsub = new PubSub();

/**
* Fetch data from server
* @param {Object} pathvars path vars for url
* @param {Object} params fetch params
* @param {Function} getState helper meta function
*/
const request = (pathvars, params, getState=none)=> {
const urlT = urlTransform(url, pathvars);
const baseOptions = isFunction(options) ? options(urlT, params, getState) : options;
const opts = { ...baseOptions, ...params };
return meta.holder.fetch(urlT, opts);
};

/**
* Fetch data from server
* @param {Object} pathvars path vars for url
Expand All @@ -45,8 +59,6 @@ export default function actionFn(url, name, options, ACTIONS={}, meta={}) {
*/
const fn = (...args)=> {
const [pathvars, params, callback] = extractArgs(args);

const urlT = urlTransform(url, pathvars);
const syncing = params ? !!params.syncing : false;
params && delete params.syncing;
pubsub.push(callback);
Expand All @@ -56,19 +68,15 @@ export default function actionFn(url, name, options, ACTIONS={}, meta={}) {
if (store && store.loading) {
return;
}

dispatch({ type: actionFetch, syncing});
const baseOptions = isFunction(options) ? options(urlT, params, getState) : options;
const opts = { ...baseOptions, ...params };

const fetchResolverOpts = {
dispatch, getState,
actions: meta.actions,
prefetch: meta.prefetch
};

fetchResolver(0, fetchResolverOpts,
(err)=> err ? pubsub.reject(err) : meta.holder.fetch(urlT, opts)
(err)=> err ? pubsub.reject(err) : request(pathvars, params, getState)
.then((data)=> !meta.validation ? data :
new Promise((resolve, reject)=> meta.validation(data,
(err)=> err ? reject(err) : resolve(data))))
Expand All @@ -83,10 +91,17 @@ export default function actionFn(url, name, options, ACTIONS={}, meta={}) {
}));
};
};

/*
Pure rest request
*/
fn.request = request;

/**
* Reset store to initial state
*/
fn.reset = ()=> ({type: actionReset});

/**
* Sync store with server. In server mode works as usual method.
* If data have already synced, data would not fetch after call this method.
Expand Down
13 changes: 13 additions & 0 deletions test/actionFn_spec.js
Expand Up @@ -74,6 +74,19 @@ describe("actionFn", function() {
return Promise.all([async1, async2]);
});

it("check request method", function() {
let executeCounter = 0;
const api = actionFn("/test", "test", null, ACTIONS, {holder: {fetch: ()=> {
executeCounter++;
return fetchSuccess();
}}});
const async = api.request();
expect(async).to.be.an.instanceof(Promise);
return async.then((data)=> {
expect(data).to.eql({msg: "hello"});
});
});

it("check normal usage", function() {
const api = actionFn("/test", "test", null, ACTIONS, {holder: { fetch: fetchSuccess}});
expect(api.reset()).to.eql({type: ACTIONS.actionReset });
Expand Down

0 comments on commit 3c8e769

Please sign in to comment.