export function getReducerManager()

in packages/redux-dynamic-modules-core/src/Managers/ReducerManager.ts [48:97]


export function getReducerManager<S extends {}>(
    initialReducers: ReducersMapObject<S>,
    reducerCombiner: (
        reducers: ReducersMapObject<S, any>
    ) => Reducer<S> = combineReducers
): IReducerManager<S> {
    let combinedReducer = reducerCombiner(initialReducers);
    const reducers: ReducersMapObject<S> = {
        ...(initialReducers as object),
    } as ReducersMapObject<S>;
    let keysToRemove = [];

    const reduce = (state: S, action: AnyAction) => {
        if (keysToRemove.length > 0) {
            state = { ...(state as any) };
            for (let key of keysToRemove) {
                delete state[key];
            }
            keysToRemove = [];
        }

        if (state === undefined) {
            state = {} as S;
        }

        return combinedReducer(state, action);
    };

    return {
        getReducerMap: () => reducers,
        reduce,
        add: <ReducerState>(key: string, reducer: Reducer<ReducerState>) => {
            if (!key || reducers[key]) {
                return;
            }

            reducers[key] = reducer;
            combinedReducer = getCombinedReducer(reducers, reducerCombiner);
        },
        remove: (key: string) => {
            if (!key || !reducers[key]) {
                return;
            }

            delete reducers[key];
            keysToRemove.push(key);
            combinedReducer = getCombinedReducer(reducers, reducerCombiner);
        },
    };
}