I am getting error
Cannot destructure property ‘currentUser’ of ‘useSelector(…)’ as it is null.
on this line
const { currentUser } = useSelector((state) => state.user);
in App.jsx
Main.jsx
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import { Provider } from "react-redux";
import { PersistGate } from "redux-persist/integration/react";
import { store, persistor } from "./redux/store";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<Provider store={store}>
<PersistGate persistor={persistor}>
<App />
</PersistGate>
</Provider>
</React.StrictMode>
);
App.jsx
import styled, { ThemeProvider } from "styled-components";
import { lightTheme } from "./utils/Themes";
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Navbar from "./components/navbar/navbar.component";
import Home from "./pages/home/home.page";
import { useState } from "react";
import Authentication from "./pages/authentication/authentication.page";
import ShopListing from "./pages/shop-listing/shop-listing.page";
import Favourite from "./pages/favourite/favourite.page";
import Cart from "./pages/cart/cart.page";
import ProductDetails from "./pages/product-details/product-details.page";
import { useDispatch, useSelector } from "react-redux";
import ToastMessage from "./components/toast-message/toast-message.component";
const Container = styled.div`
width: 100%;
height: 100vh;
display: flex;
flex-direction: column;
background: ${({ theme }) => theme.bg};
color: ${({ theme }) => theme.text_primary};
overflow-x: hidden;
overflow-y: hidden;
transition: all 0.2s ease;
`;
function App() {
const { currentUser } = useSelector((state) => state.user);
const { open, message, severity } = useSelector((state) => state.snackbar);
const [openAuth, setOpenAuth] = useState(false);
return (
<ThemeProvider theme={lightTheme}>
<BrowserRouter>
<Container>
<Navbar setOpenAuth={setOpenAuth} currentUser={currentUser} />
<Routes>
<Route path="/" exact element={<Home />} />
<Route path="/shop" exact element={<ShopListing />} />
<Route path="/favorite" exact element={<Favourite />} />
<Route path="/cart" exact element={<Cart />} />
<Route path="/shop/:id" exact element={<ProductDetails />} />
</Routes>
{openAuth && (
<Authentication openAuth={openAuth} setOpenAuth={setOpenAuth} />
)}
{open && (
<ToastMessage open={open} message={message} severity={severity} />
)}
</Container>
</BrowserRouter>
</ThemeProvider>
);
}
export default App;
userSlice.js
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
currentUser: null,
};
export const userSlice = createSlice({
name: "user",
initialState,
reducers: {
updateUser: (state, action) => {
state.currentUser = action.payload.user;
},
loginSuccess: (state, action) => {
state.currentUser = action.payload.user;
localStorage.setItem("krist-app-token", action.payload.token);
},
logout: (state) => {
state.currentUser = null;
localStorage.removeItem("krist-app-token");
},
},
});
export const { updateUser, loginSuccess, logout } = userSlice.actions;
export default userSlice.reducer;
snackbarSlice.js
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
open: false,
message: "",
severity: "success",
};
export const snackbarSlice = createSlice({
name: "snackbar",
initialState,
reducers: {
openSnackbar: (state, action) => {
state.open = true;
state.message = action.payload.message;
state.severity = action.payload.severity;
},
closeSnackbar: (state) => {
state.open = false;
},
},
});
export const { openSnackbar, closeSnackbar } = snackbarSlice.actions;
export default snackbarSlice.reducer;
store.js
import { configureStore, combineReducers } from "@reduxjs/toolkit";
import {
persistStore,
persistReducer,
FLUSH,
REHYDRATE,
PAUSE,
PERSIST,
PURGE,
REGISTER,
} from "redux-persist";
import storage from "redux-persist/lib/storage";
import userReducer from "./reducers/userSlice";
import snackbarReducer from "./reducers/snackbarSlice";
const persistConfig = {
key: "root",
version: 1,
storage,
};
const rootReducer = combineReducers({
user: userReducer,
snackbar: snackbarReducer,
});
const persistedReducer = persistReducer(persistConfig, rootReducer);
export const store = configureStore({
reducer: persistedReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: {
ignoreActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
},
}),
});
export const persistor = persistStore(store);