xphong/marvel-app

View on GitHub
client/actions/PowerLevelActions.js

Summary

Maintainability
A
0 mins
Test Coverage
import axios from 'axios';
import { compose } from 'redux';

import * as types from '../constants/ActionTypes';
import { ENDPOINT } from '../constants/AppConstants';

const requestPowerLevels = () => {
  return {
    type: types.REQUEST_POWERLEVELS
  };
}

const receivePowerLevels = data => {
  return {
    type: types.RECEIVE_POWERLEVELS,
    payload: {
      data
    }
  };
}

const receivePowerLevelsError = data => {
  return {
    type: types.RECEIVE_POWERLEVELS_ERROR,
    payload: {
      data
    }
  };
}

const calculatePowerLevel = character => {
  const numberOfSkills = 6;

  return ((parseInt(character.Intelligence, 10)
    + parseInt(character.Strength, 10)
    + parseInt(character.Speed, 10)
    + parseInt(character.Durability, 10)
    + parseInt(character.Energy_Projection, 10)
    + parseInt(character.Fighting_Ability, 10)) / numberOfSkills).toFixed(2);
}

const createCharacter = data => {
  const character = {
    ...data
  };

  character.averagePowerLevel = calculatePowerLevel(data);
  character.name = data.Name;
  character.url = data.Profile_Link;
  character.image = data.Image_Link;

  return character;
}

const createCharacterMap = data => data.map(createCharacter);

const sortCharactersByName = data => {
  const sortedData = data.slice(0);

  sortedData.sort((a, b) => {
    const textA = a.name.toUpperCase();
    const textB = b.name.toUpperCase();
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
  });

  return sortedData;
}

const createPowerLevelsData = compose(sortCharactersByName, createCharacterMap);

export const fetchPowerLevels = () => {
  const opts = {
    url: `${ENDPOINT}/powerlevels`,
    timeout: 10000,
    method: 'get',
    responseType: 'json'
  };

  return async dispatch => {
    dispatch(requestPowerLevels());

    const powerLevelsSessionData = sessionStorage.getItem('powerlevels-data');

    if (powerLevelsSessionData) {
      return dispatch(receivePowerLevels(JSON.parse(powerLevelsSessionData)));
    }

    try {
      const { data } = await axios(opts);

      if (data && data.length) {
        const powerLevelsData = createPowerLevelsData(data);

        sessionStorage.setItem('powerlevels-data', JSON.stringify(powerLevelsData));

        dispatch(receivePowerLevels(powerLevelsData));
      }
    } catch (e) {
      dispatch(receivePowerLevelsError(e));
    }
  };
}