Skip to content
Snippets Groups Projects
reducer.ts 2.2 KiB
Newer Older
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.DismissAlert;

export function darsReducer(
  state = INITIAL_DARS_STATE,
): 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.DismissAlert: {
      return {
        ...state,
        alerts: state.alerts.filter(({ key }) => {
          return key !== action.payload.key;
        }),
      };
    }
    default:
      return state;
  }
}