/
Jafar
/
production-project
Обзор
Документация
Войти
/
Jafar
/
production-project
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/shared/lib/components/DynamicModuleLoader/DynamicModuleLoader.tsx
54 строки
2 KB
jafar
fix store, dynamic, loader, update reducer manager
03 фев 2024, 17:16
03 фев 2024, 17:16
5a47d64
Код
Авторство
О чём код?
import { FC, useEffect } from 'react'; import { useDispatch, useStore } from 'react-redux'; import { ReduxStoreWithManager, StateSchemaKey } from 'app/providers/StoreProvider/config/StateSchema'; import { Reducer } from '@reduxjs/toolkit'; export type ReducersList = { [name in StateSchemaKey]?: Reducer; } interface DynamicModuleLoaderProps { reducers: ReducersList; removeAfterUnmount?: boolean; } export const DynamicModuleLoader: FC<DynamicModuleLoaderProps> = (props) => { const { children, reducers, removeAfterUnmount = true, } = props; const store = useStore() as ReduxStoreWithManager; const dispatch = useDispatch(); useEffect(() => { const mountedReducers = store.reducerManager.getMountedReducers(); Object.entries(reducers).forEach(([name, reducer]) => { const mounted = mountedReducers[name as StateSchemaKey]; // Добавляем новый редюсер только если его нет if (!mounted) { store.reducerManager.add(name as StateSchemaKey, reducer); dispatch({ type: `@INIT ${name} reducer` }); } }); return () => { if (removeAfterUnmount) { Object.entries(reducers).forEach(([name, reducer]) => { store.reducerManager.remove(name as StateSchemaKey); dispatch({ type: `@DESTROY ${name} reducer` }); }); } }; // eslint-disable-next-line }, []); return ( // eslint-disable-next-line react/jsx-no-useless-fragment <> {children} </> ); };