import { EntityAdapter, EntityState } from '@ngrx/entity/src/models'; import { createEntityAdapter } from '@ngrx/entity'; import * as coreActions from '../actions/core.action'; import { map, assign } from 'lodash'; import { ReferenceData } from '../../shared/models/reference-data'; import { TypedReferenceData } from '../../shared/models/typed-reference-data'; export interface LocalState extends EntityState> { loading: boolean; } export const adapter: EntityAdapter> = createEntityAdapter>( { selectId: ( t: TypedReferenceData ) => t.type, } ); export const initialState: LocalState = adapter.getInitialState( { loading: false, } ); export function reducer( state: LocalState = initialState, action: coreActions.CoreReferenceDataActions ): LocalState { switch ( action.type ) { case coreActions.CoreActionTypes.LoadReferenceData: { return assign( {}, state, { loading: true } ); } case coreActions.CoreActionTypes.LoadReferenceDataSuccess: { if ( !action.payload ) { return state; } const updatedState: LocalState = adapter.removeMany( map( action.payload, ( p: TypedReferenceData ) => p.type ), state ); return adapter.addMany( action.payload, updatedState ); } case coreActions.CoreActionTypes.LoadReferenceDataFail: { return assign( {}, state, { loading: false, errors: action.payload } ); } default: { return state; } } }