I installed redux-persist
now all of my Redux states return undefined.
All the other Redux state used to work before, however once I changed to redux-persist
, they do not work anymore and return undefined. I have 2 redux slices, one UserSlice.js and another ModalSlice.js, I only want to have persist on the UserSlice.js
Here is an example of how I use it:
export default function LoginModal() {
// Modal
const isLoginOpen = useSelector((state) => state.modal.loginModalOpen);
const isSignupOpen = useSelector((state) => state.modal.signupModalOpen);
const isPasswordOpen = useSelector((state) => state.modal.passwordModalOpen);
<button
onClick={() => dispatch(openLoginModal())}
className="btn home__cta--btn"
>
Here is my store.js
import { configureStore } from "@reduxjs/toolkit";
import userSlice from "./userSlice";
import storage from "redux-persist/lib/storage";
import { persistReducer, persistStore } from "redux-persist";
import thunk from "redux-thunk";
const persistConfig = {
key: "root",
storage,
};
const persistedReducer = persistReducer(persistConfig, userSlice);
export const store = configureStore({
reducer: persistedReducer,
devTools: process.env.NODE_ENV !== "production",
middleware: [thunk],
});
export const persistor = persistStore(store);
Userslice.js:
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
email: null,
uid: null,
premium: false,
type: "Basic",
currentUser: null,
};
const userSlice = createSlice({
name: "user",
initialState,
reducers: {
setCurrentUser: (state, action) => {
state.currentUser = action.payload;
},
signOutUser: (state) => {
state.email = null;
state.uid = null;
state.premium = false;
},
typeOfSubIsYearly: (state) => {
state.type = "Premium Plus";
},
typeOfSubIsMonthly: (state) => {
state.type = "Premium";
},
setPremiumStatus: (state, action) => {
state.premium = action.payload;
},
},
});
export const {
setCurrentUser,
signOutUser,
upgradeUser,
typeOfSubIsYearly,
typeOfSubIsMonthly,
setPremiumStatus,
} = userSlice.actions;
export default userSlice.reducer;`
And here is my app.js:
import "@/styles/globals.css";
import { library } from "@fortawesome/fontawesome-svg-core";
import {
faCrown,
faStar,
faStarHalf,
faUser,
faX,
} from "@fortawesome/free-solid-svg-icons";
import { Provider } from "react-redux";
import { persistor, store } from "@/redux/store";
import { PersistGate } from "redux-persist/integration/react";
library.add(faCrown, faStar, faStarHalf, faUser, faX);
export default function App({ Component, pageProps }) {
return (
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<Component {...pageProps} />
</PersistGate>
</Provider>
);
}
The code isn't including the
ModalSlice
reducer in the Redux state, sostate.modal
is undefined. If you would like to persist only the user state then you can configure the persistence a couple of ways.Use a whitelist/blacklist to exclude/include specific parts of state.
Persist only the user slice.