import AsyncStorage from '@react-native-community/async-storage' import { configureStore } from '@reduxjs/toolkit' import * as Sentry from '@sentry/react-native' import { clone } from 'ramda' import { createEpicMiddleware } from 'redux-observable' import { FLUSH, PAUSE, PERSIST, PURGE, REGISTER, REHYDRATE } from 'redux-persist/es/constants' import createMigrate from 'redux-persist/es/createMigrate' import persistReducer from 'redux-persist/es/persistReducer' import persistStore from 'redux-persist/es/persistStore' import autoMergeLevel2 from 'redux-persist/es/stateReconciler/autoMergeLevel2' import createSentryMiddleware from 'redux-sentry-middleware' import { config } from '../../config/index' import rootEpic from './epics' import { migrations } from './migrations' import reducers from './reducers' import { appTransform } from './transforms' Sentry.init({ dsn: config.sentry.dsn, normalizeDepth: 10, environment: config.sentry.environment, }) const sentryStateTransformer = (state: any): any => clone(state) const sentryMiddleware = createSentryMiddleware(Sentry, { stateTransformer: sentryStateTransformer, }) const epicMiddleware = createEpicMiddleware() const middlewares = [sentryMiddleware, epicMiddleware] if (__DEV__) { // eslint-disable-next-line const createDebugger = require('redux-flipper').default middlewares.push(createDebugger()) } const persistConfig = { key: 'root', storage: AsyncStorage, stateReconciler: autoMergeLevel2, version: 0, migrate: createMigrate(migrations, { debug: false }), transforms: [appTransform], whitelist: ['app'], } const persistedReducer = persistReducer(persistConfig, reducers as any) export const store = configureStore({ reducer: persistedReducer, middleware: getDefaultMiddleware => [ ...getDefaultMiddleware({ thunk: false, serializableCheck: { ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], }, }), ...middlewares, ], }) export const persistor = persistStore(store) epicMiddleware.run(rootEpic) export type RootState = ReturnType export type AppDispatch = typeof store.dispatch