MetaPhase-Consulting/State-TalentMAP

View on GitHub
src/actions/bureauPositions.js

Summary

Maintainability
A
0 mins
Test Coverage
F
52%
import { downloadFromResponse, formatDate } from 'utilities';
import { batch } from 'react-redux';
import { get, identity, isArray, isEmpty, pickBy } from 'lodash';
import querystring from 'query-string';
import { CancelToken } from 'axios';
import { toastError } from './toast';
import api from '../api';

let cancel;


export function downloadBureauPositionsData(userQuery) {
  if (get(userQuery, 'position__bureau__code__in', []).length < 1 && get(userQuery, 'position__org__code__in', []).length < 1) {
    return () => {
      // eslint-disable-next-line global-require
      require('../store').store.dispatch(toastError('Export unsuccessful. Please try again.', 'Error exporting'));
    };
  }
  const defaults = {
    limit: 99999999,
    page: 1,
  };
  const query = { ...userQuery, ...defaults };
  let q = pickBy(query, identity);
  Object.keys(q).forEach(queryk => { if (isArray(q[queryk])) { q[queryk] = q[queryk].join(); } });
  q = querystring.stringify(q);

  const url = `/fsbid/bureau/positions/export/?${q}`;

  return api().get(url, {
    cancelToken: new CancelToken((c) => { cancel = c; }),
    responseType: 'stream',
  })
    .then((response) => {
      downloadFromResponse(response, `TalentMap_bureau_positions_export_${formatDate(new Date().getTime(), 'YYYY_M_D_H')}`);
    })
    .catch(() => {
      // eslint-disable-next-line global-require
      require('../store').store.dispatch(toastError('Export unsuccessful. Please try again.', 'Error exporting'));
    });
}

export function bureauPositionsHasErrored(bool) {
  return {
    type: 'BUREAU_POSITIONS_HAS_ERRORED',
    hasErrored: bool,
  };
}

export function bureauPositionsIsLoading(bool) {
  return {
    type: 'BUREAU_POSITIONS_IS_LOADING',
    isLoading: bool,
  };
}

export function bureauPositionsFetchDataSuccess(results) {
  return {
    type: 'BUREAU_POSITIONS_FETCH_DATA_SUCCESS',
    results,
  };
}

export function bureauPositionsFetchData(userQuery, fromBureauMenu = true) {
  // Ensure the userQuery includes bureaus or orgs, based on menu
  // - otherwise we risk querying unauthorized positions
  if ((fromBureauMenu && isEmpty(get(userQuery, 'position__bureau__code__in', []))) ||
    (!fromBureauMenu && isEmpty(get(userQuery, 'position__org__code__in', [])))) {
    return (dispatch) => {
      batch(() => {
        dispatch(bureauPositionsHasErrored(true));
        dispatch(bureauPositionsIsLoading(false));
      });
    };
  }

  // Combine defaults with given userQuery
  let q = pickBy(userQuery, identity);
  Object.keys(q).forEach(queryk => { if (isArray(q[queryk])) { q[queryk] = q[queryk].join(); } });
  q = querystring.stringify(q);

  const url = `/fsbid/bureau/positions/?${q}`;

  return (dispatch) => {
    if (cancel) { cancel('cancel'); dispatch(bureauPositionsIsLoading(true)); }
    batch(() => {
      dispatch(bureauPositionsIsLoading(true));
      dispatch(bureauPositionsHasErrored(false));
    });

    api().get(url, {
      cancelToken: new CancelToken((c) => { cancel = c; }),
    })
      .then(({ data }) => {
        batch(() => {
          dispatch(bureauPositionsFetchDataSuccess(data));
          dispatch(bureauPositionsHasErrored(false));
          dispatch(bureauPositionsIsLoading(false));
        });
      })
      .catch((err) => {
        if (get(err, 'message') === 'cancel') {
          batch(() => {
            dispatch(bureauPositionsHasErrored(false));
            dispatch(bureauPositionsIsLoading(true));
          });
        } else {
          batch(() => {
            dispatch(bureauPositionsFetchDataSuccess({ results: [] }));
            dispatch(bureauPositionsHasErrored(true));
            dispatch(bureauPositionsIsLoading(false));
          });
        }
      });
  };
}

export function bureauUserSelectionsSaveSuccess(result) {
  return {
    type: 'BUREAU_SELECTIONS_SAVE_SUCCESS',
    result,
  };
}

export function saveBureauUserSelections(queryObject) {
  return (dispatch) => dispatch(bureauUserSelectionsSaveSuccess(queryObject));
}