Skip to content
Snippets Groups Projects
reducer.ts 1.79 KiB
Newer Older
import { DARSState, INITIAL_DARS_STATE } from '@app/dars/store/state';
import { DarsActionTypes } from './actions';
import * as darsActions from './actions';

type SupportedActions =
  | darsActions.ErrorLoadingMetadata
  | darsActions.AddAuditMetadata
  | darsActions.StartLoadingAudit
  | darsActions.DoneLoadingAudit
  | darsActions.CloseAudit;

export function darsReducer(
  state = INITIAL_DARS_STATE,
): DARSState {
  switch (action.type) {
    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',
        },
      };
    }
    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;
  }
}