redux-api
redux-api copied to clipboard
pathvars and body in store + multiple actions => weird behaviour
This issue is related to #152, that have been merged in version 0.10.7
If several actions are bound to the same reducer (with the reducerName
option), the pathvars and body will contain the latest action done on it. That might not be the expected behaviour.
Example :
const rest = reduxApi({
getUser: {
reducerName: "user"
url: "/user/:id", // return a user object
},
updateUser: {
reducerName: "user"
url: "/user/:id/update",
options: {
method: "post"
},
transformer: function(data, prevData, action) {
/* update the store content based on the data received */
}
}
});
/* ... */
dispatch(rest.actions.getUser({id:1}));
// store will contain { pathvars: {id:1}, body: {} }
dispatch(rest.actions.updateUser({ id:1 }, {
body: {message: 'hello world'}
}));
// store will contain { pathvars: {id:1}, body: {message: 'hello world'} }
The content of body
is kinda weird : the store still contains the results of the first call, with the update.
It would make sense that the body
stays empty.
This gets even worse with a poorly coded API, where updateUser
does not contain any pathvar :
const rest = reduxApi({
getUser: {
reducerName: "user"
url: "/user/:id", // return a user object
},
updateUser: {
reducerName: "user"
url: "/user/update",
options: {
method: "post"
},
transformer: function(data, prevData, action) {
/* update the store content based on the data received */
}
}
});
/* ... */
dispatch(rest.actions.getUser({id:1}));
// store will contain { pathvars: {id:1}, body: {} }
dispatch(rest.actions.updateUser({ id:1 }, {
body: {user_id:1, message: 'hello world'}
}));
// store will contain { pathvars: {}, body: {user_id:1, message: 'hello world'} }
This can also be a problem when the request gives an error : pathvars
and body
will change, but not the content.
How should we handle such cases ?
@xurei It's a correct behaviour. State hold the last request. We can add flag to save request data or skip it. What do you think about it?
Yes I was thinking of something like that... Although I'm not fan, I cannot see any better option, so let's do that.