import { DARSState, INITIAL_DARS_STATE } from '@app/dars/store/state'; import { DarsActionTypes, AddAuditMetadata } from './actions'; import * as darsActions from './actions'; type SupportedActions = | darsActions.ErrorLoadingMetadata | darsActions.AddAuditMetadata | darsActions.PopulateDarsState | darsActions.StartLoadingAudit | darsActions.DoneLoadingAudit | darsActions.CloseAudit; export function darsReducer( state = INITIAL_DARS_STATE, action: SupportedActions, ): DARSState { switch (action.type) { case DarsActionTypes.PopulateDarsState: { return { ...state, ...action.payload }; } case DarsActionTypes.ErrorLoadingMetadata: { return { ...state, metadata: { status: 'Error', message: action.payload.message, }, }; } case DarsActionTypes.AddAuditMetadata: { const programMetadata = (state.metadata.status === 'Loaded' ? state.metadata.programMetadata : [] ).concat(action.payload.programMetadata); const whatIfMetadata = (state.metadata.status === 'Loaded' ? state.metadata.whatIfMetadata : [] ).concat(action.payload.whatIfMetadata); return { ...state, metadata: { status: 'Loaded', programMetadata: programMetadata, whatIfMetadata, }, }; } case DarsActionTypes.StartLoadingAudit: { return { ...state, visibleAudit: { status: 'Loading', metadata: action.payload, }, }; } case DarsActionTypes.DoneLoadingAudit: { return { ...state, visibleAudit: { status: 'Loaded', metadata: action.payload.metadata, audit: action.payload.audit, }, }; } case DarsActionTypes.CloseAudit: { return { ...state, visibleAudit: { status: 'NotLoaded' }, }; } default: return state; } }