2025-10-25 11:39:24 +02:00

71 lines
2.1 KiB
TypeScript

import {
configureStore,
combineReducers,
type Reducer,
} from "@reduxjs/toolkit";
import storage from "redux-persist/lib/storage"; // defaults to localStorage for web
import { createTransform, persistReducer, persistStore } from "redux-persist";
import { createEpicMiddleware, combineEpics } from "redux-observable";
import advancedSearchReducer from "./advanedSearch/advancedSearchSlice";
import authReducer from "./auth/authSlice";
import userEpics from "./user/epic";
import authEpics from "./auth/epic";
type PersistedAuth = { user: unknown | null };
const persistConfig = {
key: "root",
storage,
whitelist: ["auth"], // only persist auth slice
transforms: [
// Persist only the `user` subkey from the auth slice
createTransform(
(inboundState: unknown): PersistedAuth => {
const s = inboundState as { user?: unknown } | null | undefined;
return { user: s?.user ?? null };
},
(outboundState: unknown): PersistedAuth => {
const s = outboundState as { user?: unknown } | null | undefined;
return { user: s?.user ?? null };
},
{ whitelist: ["auth"] }
),
],
};
const rootReducer = combineReducers({
advancedSearch: advancedSearchReducer,
auth: authReducer,
});
const rootEpic = combineEpics(...userEpics, ...authEpics);
const persistedReducer = persistReducer(persistConfig, rootReducer as Reducer);
// Create epic middleware
const epicMiddleware = createEpicMiddleware();
export const makeStore = () => {
const store = configureStore({
reducer: persistedReducer,
devTools: process.env.NODE_ENV !== "production",
middleware: getDefaultMiddleware =>
getDefaultMiddleware({
serializableCheck: false, // redux-persist uses non-serializable values
}).concat(epicMiddleware),
});
// Run the epic
epicMiddleware.run(rootEpic);
return store;
};
// Create store + persistor
export const store = makeStore();
export const persistor = persistStore(store);
// Types
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;