import { useMemo } from 'react'; import { configureStore } from '@reduxjs/toolkit'; import thunk from 'redux-thunk'; import rootReducer from './reducers'; let store; export function getStore(preloadedState) { return configureStore({ reducer: rootReducer, middleware: [thunk], preloadedState, }); } export const initializeStore = preloadedState => { let _store = store ?? getStore(preloadedState); // After navigating to a page with an initial Redux state, merge that state // with the current state in the store, and create a new store if (preloadedState && store) { _store = getStore({ ...store.getState(), ...preloadedState, }); // Reset the current store store = undefined; } // For SSG and SSR always create a new store if (typeof window === 'undefined') return _store; // Create the store once in the client if (!store) store = _store; return _store; }; export function useStore(initialState) { return useMemo(() => initializeStore(initialState), [initialState]); }