import { combineReducers, configureStore } from '@reduxjs/toolkit' import API from 'api' import { Config } from 'config.types' import appReducer from 'domains/app/slice' import configReducer from 'domains/config/slice' import { createErrorsMiddleware } from 'domains/errors' import formsReducer from 'domains/forms/slice' import i18nReducer from 'domains/i18n/slice' import createInterruptMiddleware from 'domains/interrupt/middleware' import interruptReducer from 'domains/interrupt/slice' import createOptionsMiddleware from 'domains/options/middleware' import stateReducer from 'domains/store/slice' import createI18nMiddleware from 'domains/translations/middleware' import translationReducer from 'domains/translations/slice' import visibilityReducer from 'domains/visibility/slice' import { Events } from 'minivents' import { useDispatch } from 'react-redux' type CreateStore = { initialState: undefined api: API eventBus: Events config: Config } const rootReducer = combineReducers({ state: stateReducer, app: appReducer, config: configReducer, i18n: i18nReducer, translations: translationReducer, visibility: visibilityReducer, forms: formsReducer, interrupt: interruptReducer, }) export function createStore({ initialState, api, eventBus, config, }: CreateStore) { const store = configureStore({ reducer: rootReducer, preloadedState: initialState, middleware: (getDefaultMiddleWare) => getDefaultMiddleWare({ thunk: { extraArgument: { api, eventBus, config, }, }, serializableCheck: false, }).concat( createErrorsMiddleware({ api }), createInterruptMiddleware({ api }), createOptionsMiddleware({ api }), createI18nMiddleware, ), }) return store } export type Store = ReturnType export type RootState = ReturnType export type AppDispatch = Store['dispatch'] export const useAppDispatch: () => AppDispatch = useDispatch