redux-api icon indicating copy to clipboard operation
redux-api copied to clipboard

pathvars and body in store + multiple actions => weird behaviour

Open xurei opened this issue 7 years ago • 2 comments

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 avatar Jul 12 '17 14:07 xurei

@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?

lexich avatar Jul 18 '17 19:07 lexich

Yes I was thinking of something like that... Although I'm not fan, I cannot see any better option, so let's do that.

xurei avatar Jul 19 '17 08:07 xurei