MonkeyBonkey MonkeyBonkey - 16 days ago 7
React JSX Question

Confused about an auth0 lock example using react and redux

I'm looking through the auth0 sample project for using react, redux and auth0 for a login scenario here. However I'm a bit confused about this particular example where we call

this.props.doAuthentication()


// App.js
import { loginUser, fetchQuote, doAuthentication, fetchSecretQuote } from '../actions'

// add a constructor
constructor(props) {
super(props)
this.props.doAuthentication()
}


Here is the action definition

// actions.js

...

const lock = new Auth0Lock('YOUR_CLIENT_ID', 'YOUR_CLIENT_DOMAIN');

export function login() {
// display lock widget
return dispatch => {
lock.show();
}
}

// Listen to authenticated event and get the profile of the user
export function doAuthentication() {
return dispatch => {
lock.on("authenticated", function(authResult) {
lock.getProfile(authResult.idToken, function(error, profile) {

if (error) {
// handle error
return dispatch(lockError(error))
}

localStorage.setItem('profile', JSON.stringify(profile))
localStorage.setItem('id_token', authResult.idToken)
return dispatch(lockSuccess(profile))
});
});
}
}

...


I'm new to redux so maybe this is an obvious answer but


  1. Where is doAuthentication bound to the the props in App.js? Assuming that App.js is the top level root app component.

  2. Doesn't doAuthentication generate a function that expects a dispatch argument? Why don't we do anything in the constructor with the returned function from doAuthentication()? If we don't assign the returned function to anything, does
    this.props.doAuthentication
    persist anything or have any effects? Shouldn't it be something like
    doAuthentication()(someDispatchFunction)
    Where does this dispatch function come from?


Answer

1.Where is doAuthentication bound to the the props in App.js? Assuming that App.js is the top level root app component.

Ans: The action doAuthentication is bound with the props of App component using the middleware called redux-thunk.

let createStoreWithMiddleware = applyMiddleware(thunkMiddleware, api)(createStore)

let store = createStoreWithMiddleware(quotesApp)

The above two line of code would have done it for your. Read here why redux-thunk is required.

2.Doesn't doAuthentication generate a function that expects a dispatch argument? Why don't we do anything in the constructor with the returned function from doAuthentication()? If we don't assign the returned function to anything, does this.props.doAuthentication persist anything or have any effects? Shouldn't it be something like doAuthentication()(someDispatchFunction) Where does this dispatch function come from?

Ans: 2.1 Yes, the function which is returned by doAuthentication function expects a dispatch method as to be a first parameter.

2.2, 2.3 Here the doAuthentication action creator's job is to create a Redux action which would just listen for the event called authenticated. When we call doAuthentication action creator, it returns a Redux action function which accepts a dispatch method as first parameter and getState method as second. The parameters would be passed by the redux-thunnk middleware.

The redux-thunk middleware would call the redux action which is return from the doAuthentication call since it is connet-ed. Otherwise we have to dispatch the action returned by the doAuthentication as like the below,

this.props.dispatch(doAuthentication())

2.4 We can do as you mention doAuthentication()(someDispatchFunction), but consider this quote

If Redux Thunk middleware is enabled, any time you attempt to dispatch a function instead of an action object, the middleware will call that function with dispatch method itself as the first argument.

And, you can find a detailed info about the redux-thunk with this answer