0

I have been getting this error "Cannot read property 'user' of undefined" in a userSlice.js which by default is named as counterSlice.js in react-redux. I have tried exporting by changing names and function names too, and I guess I am exporting the right function.

any suggestions or fix that might get it running?

Here is my userSlice.js file,

import { createSlice } from '@reduxjs/toolkit';
export const userSlice = createSlice({
  name: 'user',
  initialState: {
    user: null,
  },
  reducers: {
    login: (state, action) => {
      state.user = action.payload;
    },
    logout: (state) => {
      state.user = null;
    },
  },
});

export const { login, logout} = userSlice.actions;
export const selectUser = state => state.user.user;
export default userSlice.reducer;

here is the store.js file,

import { configureStore } from '@reduxjs/toolkit';
import userReducer from '../features/userSlice';

export default configureStore({
  reducer: {
    counter: userReducer,
  },
});

and here is the App.js file where I am trying to make the login user state to be logged in,

import React, {useEffect} from 'react';
import './App.css';
import Homescreen from "./screens/Homescreen";
import LoginScreen from "./screens/LoginScreen";
import {auth} from "./firebase";
import {useDispatch, useSelector} from "react-redux";
import {login, logout, selectUser} from "./features/userSlice";
import {BrowserRouter as Router, Switch,Route} from 'react-router-dom';


function App() {
    const user = useSelector(selectUser);
    const dispatch = useDispatch();

    useEffect(() => {
        const unsubscribe = auth.onAuthStateChanged((userAuth) => {
            if(userAuth){
                dispatch(login({
                    uid: userAuth.uid,
                    email: userAuth.email,
                })
                );
            } else{
                dispatch(logout())
            }
        });

        return unsubscribe;
    }, []);

  return (
    <div className="App">
        <Router>
            {!user ? (
                <LoginScreen/>
            ):(
            <Switch>
                <Route exact path="/">
                    <Homescreen />
                </Route>
            </Switch>
            )}
        </Router>
    </div>
  );
}

export default App;

1 Answer 1

2

The problem is here

export const selectUser = state => state.user.user;

You created slice with name counter here

export default configureStore({
  reducer: {
    counter: userReducer,
  },
});

Try

export const selectUser = state => state.counter.user;

Or rename counter to user

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks that worked, I changed the counter to the user.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.