/
dedaMazai
/
TestServer
Обзор
Документация
Войти
/
dedaMazai
/
TestServer
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/shared/lib/components/DynamicModuleLoader/DynamicModuleLoader.tsx
53 строки
2 KB
Andrey Chipizubov
fix
23 апр 2023, 17:32
23 апр 2023, 17:32
cc424e9
Код
Авторство
О чём код?
import { ReactNode, useEffect } from 'react'; import { useDispatch, useStore } from 'react-redux'; import { Reducer } from '@reduxjs/toolkit'; import { ReduxStoreWithManager, StateSchema, StateSchemaKey, } from '@/app/providers/StoreProvider'; export type ReducersList = { [name in StateSchemaKey]?: Reducer<NonNullable<StateSchema[name]>>; }; interface DynamicModuleLoaderProps { reducers: ReducersList; removeAfterUnmount?: boolean; children: ReactNode; } export const DynamicModuleLoader = (props: DynamicModuleLoaderProps) => { 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}</> ); };