ngrx-handlers
Version:
NgRx Plugin for Generating Actions and Reducer Based on the Handler Map
83 lines (82 loc) • 2.73 kB
TypeScript
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>;