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 | darsActions.DismissAlert; 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, audits: { ...state.audits, [action.payload.darsDegreeAuditReportId]: { status: 'Loading', metadata: action.payload, }, }, }; } case DarsActionTypes.DoneLoadingAudit: { return { ...state, audits: { ...state.audits, [action.payload.metadata.darsDegreeAuditReportId]: { status: 'Loaded', metadata: action.payload.metadata, audit: action.payload.audit, }, }, }; } case DarsActionTypes.CloseAudit: { // TODO return state; } case DarsActionTypes.DismissAlert: { return { ...state, alerts: state.alerts.filter(({ key }) => { return key !== action.payload.key; }), }; } default: return state; } }