PliWould/app/store.ts

57 lines
1.7 KiB
TypeScript

import { useDispatch, useSelector } from "react-redux";
import { configureStore } from "@reduxjs/toolkit";
import { rememberReducer, rememberEnhancer } from "redux-remember";
import reducers, { DEFAULT_PRELOADED_STATE } from "@/features/product/productSlice";
import AsyncStorage from "@react-native-async-storage/async-storage";
// thanks to https://github.com/rt2zz/redux-persist/issues/1208#issuecomment-658695446
// for the workaround
const createNoopStorage = () => {
return {
getItem(_key : any) {
return Promise.resolve(null);
},
setItem(_key : any, value : any) {
return Promise.resolve(value);
},
removeItem(_key : any) {
return Promise.resolve();
},
};
};
const storage =
typeof window === "undefined" ? createNoopStorage() : AsyncStorage;
export default storage;
const PERSIST_WHOLE_STORE =
new Boolean(process.env.PERSIST_WHOLE_STORE).valueOf() || false;
const rememberedKeys = ["products"];
const rootReducer = reducers;
// const isBrowser = typeof window !== "undefined";
export function setupStore(preloadedState = DEFAULT_PRELOADED_STATE) {
return configureStore({
reducer: rememberReducer(reducers),
preloadedState,
enhancers: (getDefaultEnhancers) =>
getDefaultEnhancers().concat(
rememberEnhancer(storage, rememberedKeys, {
persistWholeStore: PERSIST_WHOLE_STORE,
})
),
});
}
export type RootState = ReturnType<typeof rootReducer>;
export type AppStore = ReturnType<typeof setupStore>;
export type AppDispatch = AppStore["dispatch"];
export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
export const useAppSelector = useSelector.withTypes<RootState>();