import { EntityAdapter, EntityState } from '@ngrx/entity/src/models'; import { createEntityAdapter } from '@ngrx/entity'; import * as caseDetailsActions from '../actions/case-details.action'; import { assign, get } from 'lodash'; import { CaseDetails } from '../models/case-details'; export interface LocalState extends EntityState { loading: boolean; caseDetails: CaseDetails; selectedCaseId: number; errors: any; } export const adapter: EntityAdapter = createEntityAdapter( { selectId: ( t: CaseDetails ) => t.caseNumber, } ); export const initialState: LocalState = adapter.getInitialState( { loading: false, caseDetails: undefined, selectedCaseId: undefined, errors: undefined, } ); export function reducer( state: LocalState = initialState, action: caseDetailsActions.CoreCaseDetailsActions ): LocalState { switch ( action.type ) { case caseDetailsActions.CaseDetailsActionTypes.LoadCaseDetails: { return assign( {}, state, { loading: true } ); } case caseDetailsActions.CaseDetailsActionTypes.LoadCaseDetailsSuccess: { if ( !action.payload ) { return state; } const updatedState: LocalState = adapter.removeAll( state ); return adapter.addOne( action.payload, { ...updatedState, selectedCaseId: get(action.payload, 'caseNumber'), loading: false, } ); } case caseDetailsActions.CaseDetailsActionTypes.LoadCaseDetailsFail: { return assign( {}, state, { loading: false, errors: action.payload } ); } default: { return state; } } } export const getErrors: any = (state: LocalState) => state.errors; export const getCaseDetails: any = (state: LocalState) => state.caseDetails; export const getLoading: any = (state: LocalState) => state.loading; export const getSelectedCaseId: any = (state: LocalState) => state.selectedCaseId;