igor-starostenko/report_factory-web

View on GitHub
src/reducers/scenarios_reducers.js

Summary

Maintainability
A
30 mins
Test Coverage
import _ from 'lodash';
import { removeSpecialCharacters } from '../helpers/format_helpers';
import {
  SCENARIOS,
  SCENARIO,
  GET_SCENARIOS,
  GET_PROJECT_SCENARIOS,
} from '../actions/scenarios_actions';

const INITIAL_STATE = {
  list: { data: [], error: null, loading: true },
  byProject: { data: {}, error: null, loading: true },
  details: { data: {}, error: null, loading: false },
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case SCENARIOS: {
      const { scenarios } = action.payload.data;
      const projectScenarios = _.groupBy(
        scenarios,
        scenario => scenario.projectName,
      );
      /* eslint-disable arrow-body-style */
      const byProjectData = _.mapValues(projectScenarios, project => {
        return { scenarios: project, totalCount: project.length };
      });
      /* eslint-enable arrow-body-style */
      const dataObject = data => ({ data, error: null, loading: false });
      return {
        ...state,
        list: dataObject(scenarios),
        byProject: dataObject(byProjectData),
      };
    }
    case SCENARIO: {
      const {
        scenario,
        scenario: { projectName },
      } = action.payload.data;
      const scenarioName = removeSpecialCharacters(scenario.name);
      const project = {
        ...state.details.data[projectName],
        [scenarioName]: scenario,
      };
      const data = { ...state.details.data, [projectName]: project };
      return { ...state, details: { data, error: null, loading: false } };
    }
    case GET_SCENARIOS: {
      /* eslint-disable arrow-body-style */
      const projectScenarios = _.mapKeys(action.payload.data, project => {
        return project.attributes.project_name;
      });
      /* eslint-enable arrow-body-style */
      const data = _.mapValues(
        projectScenarios,
        project => project.attributes.scenarios,
      );
      return { ...state, list: { data, error: null, loading: false } };
    }
    case GET_PROJECT_SCENARIOS: {
      const { data } = action.payload;
      const projectName = data.attributes.project_name;
      const { scenarios } = data.attributes;
      const scenariosList = _.set(state.list.data, projectName, scenarios);
      return {
        ...state,
        list: { data: scenariosList, error: null, loading: false },
      };
    }
    default: {
      return state;
    }
  }
};