React/Flux way to handle permission sensitive actions with login flows

后端 未结 3 996
后悔当初
后悔当初 2021-02-08 20:24

I have been playing with React/Flux, and I am having trouble wrapping my head around the \'Flux Way\' for handling permission-sensitive actions.

Overarching question: W

相关标签:
3条回答
  • 2021-02-08 20:51

    As FakeRainBrigand suggested in his answer, you'd want to just check that the user has a valid session before creating a comment by first retrieving that value from the SessionStore:

    case CommentConstants.ADD_COMMENT:
      if (SessionStore.getUser()) {
       createComment(action.data);
      }
      break;
    

    But to preserve the comment so that it gets created after the user logs in, I would create a collection of pending comments in the CommentStore, and then later, in a callback to the login verification and session creation, dispatch a new action to inform the CommentStore that the user has now logged in. Then the CommentStore can respond to that by creating real comments out of the pending ones.

    0 讨论(0)
  • 2021-02-08 20:53

    It should be noted that there's an example called auth-flow in react-router repo, that shines light on how this could be done. Although, I'm still trying to make it work for me it is useful to add here.

    0 讨论(0)
  • 2021-02-08 21:01

    The simplest would be just asking SessionStore if there's a session.

     case CommentConstants.ADD_COMMENT:
        if (SessionStore.getUser()) {
           createComment(action.data);
        }
        break;
    

    Of course, this just saves you a server request. The behavior shouldn't be any different than always calling createComment(action.data).

    Is this a case where the payload should be passed into ensureCurrentUser, and then into the route handler for /login? What is the Flux way of handling these types of flows?

    For this, you might want to have an event emitter that emits a 'login' event.

     case CommentConstants.ADD_COMMENT:
        if (SessionStore.getUser()) {
           createComment(action.data);
        }
        else {
           someEventEmitter.one('login', function(){
               createComment(action.data);
           });
           someEventEmitter.emit('loginRequired');
        }
        break;
    

    And when loginRequired is emitted, if there isn't a user logged in, the login view would be presented.

    0 讨论(0)
提交回复
热议问题