UNPKG

ngrx-handlers

Version:

NgRx Plugin for Generating Actions and Reducer Based on the Handler Map

83 lines (82 loc) 2.73 kB
import { ActionReducer } from '@ngrx/store'; import { ActionMap, CaseReducer, HandlerMap, PlainCaseReducer } from './models'; /** * Generates a map of action creators and reducer function based on the initial state, source and handler map. * * @param initialState An initial state of the reducer function. * @param source A source of the actions creators. * @param handlers A map where the keys are action events and the values are case reducers. * @returns A tuple of action creator map and the reducer function. * * @example * // movies.state.ts * interface MoviesState { * movies: Movie[]; * selectedMovieId: number | null; * searchTerm: string; * loading: boolean; * } * * const initMoviesState: MoviesState = { * movies: [], * selectedMovieId: null, * searchTerm: '', * loading: false, * }; * * // movies-page.handlers.ts * const [moviesPageActions, moviesPageReducer] = combineHandlers(initMoviesState, 'moviesPage', { * updateSelectedMovieId: (state, { selectedMovieId }: { selectedMovieId: number }) => ({ * ...state, * selectedMovieId, * }), * updateSearchTerm: (state, { searchTerm }: { searchTerm: string }) => ({ * ...state, * searchTerm, * }), * }); * * // movies-effects.handlers.ts * const [moviesEffectsActions, moviesEffectsReducer] = combineHandlers( * initMoviesState, * 'moviesEffects', * { * fetchMovies: state => ({ ...state, loading: true }), * fetchMoviesSuccess: (state, { movies }: { movies: Movie[] }) => ({ * ...state, * movies, * loading: false, * }), * fetchMoviesError: state => ({ ...state, movies: [], loading: false }), * }, * ); * * @see mergeReducers */ export declare function combineHandlers<State, Handlers extends HandlerMap<State>>(initialState: State, source: string, handlers: Handlers): [actions: ActionMap<State, Handlers>, reducer: ActionReducer<State>]; /** * Creates a plain case reducer. * * @returns A plain case reducer. * * @example * const [moviesPageActions, moviesPageReducer] = combineHandlers(initMoviesState, 'moviesPage', { * showCreateMovieDialog: plain(), * }); * * @see combineHandlers */ export declare function plain<State>(): PlainCaseReducer<State>; /** * Creates a plain case reducer with the payload. * * @returns A plain case reducer with the payload. * * @example * const [moviesPageActions, moviesPageReducer] = combineHandlers(initMoviesState, 'moviesPage', { * createMovie: withPayload<{ movie: Movie }>(), * }); * * @see combineHandlers */ export declare function withPayload<Payload>(): CaseReducer<any, Payload>;