Onuchukwu Chika
Onuchukwu Chika

Reputation: 269

Redux State not updating in the Redux DevTool

When I click on a button, it dispatches a function that is meant to login a user and return the user's data. But the Redux store seems not to be updated after the dispatch. When I checked the Redux devtool, It shows that the actions are dispatching appropriately with their payloads but the state remains as the initial state, it doesn't get updated after each dispatched action.

This images below display the action and state of the redux devtool. Dispatched actions

State display initial state

I don't know I have done wrong, my code are as follows.

userInitialState.js

export default {
  user: {},
  error: null,
  loading: false
};

userLoginAction.js

import axios from 'axios';
import * as types from './actionTypes';

export const signInUserSuccess = payload => ({
  type: types.SIGNIN_USER_SUCCESS,
  payload
});

export const signingInUser = () => ({
  type: types.SIGNING_IN_USER
});

export const signInUserFailure = () => ({
  type: types.SIGNIN_USER_FAILURE
});

export const userSignIn = (data) => {
  const url = 'https://eventcity.herokuapp.com/api/v1/users/login';
  return (dispatch) => {
    dispatch(signingInUser());
    return axios({
      method: 'post',
      url,
      data
    })
      .then((response) => {
        const user = response.data;
        dispatch(signInUserSuccess(user));
      })
      .catch(() => {
        dispatch(signInUserFailure());
      });
  };
};

userLoginReducer.js

import * as types from '../actions/actionTypes';
import userInitialState from './userInitialState';

const userReducer = (state = userInitialState, action = {}) => {
  switch (action.types) {
    case types.SIGNING_IN_USER:
      return {
        ...state,
        user: {},
        error: null,
        loading: true
      };
    case types.SIGNIN_USER_FAILURE:
      return {
        ...state,
        user: {},
        error: { message: 'Error loading data from the API' },
        loading: false
      };
    case types.SIGNIN_USER_SUCCESS:
      return {
        ...state,
        user: action.payload,
        error: null,
        loading: false
      };
    default:
      return state;
  }
};

export default userReducer;

rootReducer.js

import { combineReducers } from 'redux';
import userReducer from './userReducer';

const rootReducer = combineReducers({
  userReducer
});

export default rootReducer;

configureStore.js

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import { composeWithDevTools } from 'redux-devtools-extension';
import rootReducer from '../reducer/rootReducer';

const configureStore = () => createStore(rootReducer, composeWithDevTools(applyMiddleware(thunk)));

export default configureStore;

SignInModal.js

import React, { Component } from 'react';

class SignInModal extends Component {
  state = {
    username: '',
    password: ''
  };
  componentDidMount() {
    this.props.userSignIn({});
  }
  onUsernameChange = e => {
    const username = e.target.value;
    this.setState(() => ({
      username
    }));
  };
  onPasswordChange = e => {
    const password = e.target.value;
    this.setState(() => ({
      password
    }));
  };
  onSubmitForm = e => {
    e.preventDefault();
    const user = {
      username: this.state.username,
      password: this.state.password
    };
    this.props.userSignIn(user);
  };

  render() {
    console.log(this.props.user)
    return (
      <div>
        <div
          className="modal fade"
          id="exampleModalCenter"
          tabIndex="-1"
          role="dialog"
          aria-labelledby="exampleModalCenterTitle"
          aria-hidden="true"
        >
          <div className="modal-dialog" role="document">
            <div className="modal-content">
              <div className="modal-header">
                <h5 className="modal-title" id="exampleModalLongTitle">
                  Sign In Form
                </h5>
                <button type="button" className="close" data-dismiss="modal" aria-label="Close">
                  <span aria-hidden="true">&times;</span>
                </button>
              </div>
              <div className="modal-body">
                <form onSubmit={this.onSubmitForm} id="signin">
                  <div className="form-group">
                    <label htmlFor="username">Username or Email</label>
                    <input
                      type="text"
                      className="form-control"
                      name="username"
                      placeholder="Username or email"
                      value={this.state.username}
                      onChange={this.onUsernameChange}
                    />
                  </div>
                  <div className="form-group">
                    <label htmlFor="password">Password</label>
                    <input
                      type="password"
                      className="form-control"
                      placeholder="Password"
                      name="password"
                      value={this.state.password}
                      onChange={this.onPasswordChange}
                    />
                  </div>
                </form>
                <div className="modal-footer">
                  <button type="button" className="btn btn-secondary" data-dismiss="modal">
                    Close
                  </button>
                  <button type="submit" className="btn btn-primary" form="signin">
                    Save changes
                  </button>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

export default SignInModal;

SignInModalContainer

import { connect } from 'react-redux';
import { userSignIn } from '../actions/userLoginAction';
import SignInModal from '../components/SignInModal';

const mapStateToProps = state => ({
  user: state.userReducer
});
const mapDispatchToProps = dispatch => ({
  userSignIn: data => dispatch(userSignIn(data))
});

export default connect(mapStateToProps, mapDispatchToProps)(SignInModal);

Upvotes: 0

Views: 2367

Answers (1)

Onuchukwu Chika
Onuchukwu Chika

Reputation: 269

I have found the problem. I was using action.types in the switch statement. Instead of using switch(action.type).

Upvotes: 0

Related Questions