authenticated
. You also need action creators that create actions corresponding to user login and user logout, along with the action objects themselves.
reducer
function to handle multiple authentication actions. Use a JavaScript switch
statement in the reducer
to respond to different action events. This is a standard pattern in writing Redux reducers. The switch statement should switch over action.type
and return the appropriate authentication state.
Note: At this point, don't worry about state immutability, since it is small and simple in this example. For each action, you can return a new object — for example, {authenticated: true}
. Also, don't forget to write a default
case in your switch statement that returns the current state
. This is important because once your app has multiple reducers, they are all run any time an action dispatch is made, even when the action isn't related to that reducer. In such a case, you want to make sure that you return the current state
.
loginUser
should return an object with type property set to the string LOGIN
.
testString: assert(loginUser().type === 'LOGIN', 'Calling the function loginUser
should return an object with type property set to the string LOGIN
.');
- text: Calling the function logoutUser
should return an object with type property set to the string LOGOUT
.
testString: assert(logoutUser().type === 'LOGOUT', 'Calling the function logoutUser
should return an object with type property set to the string LOGOUT
.');
- text: The store should be initialized with an object with an authenticated
property set to false
.
testString: assert(store.getState().authenticated === false, 'The store should be initialized with an object with an authenticated
property set to false
.');
- text: Dispatching loginUser
should update the authenticated
property in the store state to true
.
testString: assert((function() { const initialState = store.getState(); store.dispatch(loginUser()); const afterLogin = store.getState(); return initialState.authenticated === false && afterLogin.authenticated === true })(), 'Dispatching loginUser
should update the authenticated
property in the store state to true
.');
- text: Dispatching logoutUser
should update the authenticated
property in the store state to false
.
testString: assert((function() { store.dispatch(loginUser()); const loggedIn = store.getState(); store.dispatch(logoutUser()); const afterLogout = store.getState(); return loggedIn.authenticated === true && afterLogout.authenticated === false })(), 'Dispatching logoutUser
should update the authenticated
property in the store state to false
.');
- text: The authReducer
function should handle multiple action types with a switch
statement.
testString: getUserInput => assert( getUserInput('index').toString().includes('switch') && getUserInput('index').toString().includes('case') && getUserInput('index').toString().includes('default'), 'The authReducer
function should handle multiple action types with a switch
statement.');
```