department-of-veterans-affairs/vets-website

View on GitHub
src/applications/appeals/testing/sc/utils/evidence.js

Summary

Maintainability
D
2 days
Test Coverage
import {
  EVIDENCE_VA,
  EVIDENCE_PRIVATE,
  EVIDENCE_OTHER,
  MST_OPTION,
} from '../constants';

import { getIssueName, getSelected } from '../../../shared/utils/issues';

export const hasVAEvidence = formData => formData?.[EVIDENCE_VA];
export const hasPrivateEvidence = formData => formData?.[EVIDENCE_PRIVATE];
export const hasOtherEvidence = formData => formData?.[EVIDENCE_OTHER];
export const hasMstOption = formData => formData?.[MST_OPTION];

export const hasErrors = errors =>
  Object.values(errors).filter(err => (Array.isArray(err) ? err.length : err))
    .length;

export const getIndex = (data, testingIndex, testSearch) => {
  // get index from url '/{path}?index={index}' or testingIndex
  const searchIndex = new URLSearchParams(testSearch || window.location.search);
  let index = parseInt(searchIndex.get('index') || testingIndex || '0', 10);
  if (Number.isNaN(index)) {
    index = 0;
  } else if (index > data.length) {
    index = data.length;
  }
  return index;
};

// Update evidence issues if they change
export const evidenceNeedsUpdating = formData => {
  let needsUpdate = false;
  const selectedIssues = getSelected(formData).map(getIssueName);
  const iterator = ({ issues }) =>
    (issues || []).every(issue => selectedIssues.includes(issue));

  if (hasVAEvidence(formData)) {
    const locations = formData.locations || [];
    needsUpdate = locations.length > 0 && !locations.every(iterator);
  }
  if (!needsUpdate && hasPrivateEvidence(formData)) {
    const facility = formData.providerFacility || [];
    needsUpdate = facility.length > 0 && !facility?.every(iterator);
  }
  return needsUpdate;
};

/**
 * Remove non-selected issues from VA locations and private facilities
 * Needed in case issues are added or changed on the review & submit page. The
 * evidence entries need to be auto-updated
 * @param {Object} data - form data
 * @returns {Object} - cleaned up data
 */
export const removeNonSelectedIssuesFromEvidence = data => {
  const formData = data || {};
  const selectedIssues = getSelected(formData).map(getIssueName);
  const mapper = obj => ({
    ...obj,
    issues: obj.issues.filter(issue => selectedIssues.includes(issue)),
  });
  return {
    ...formData,
    locations: formData.locations?.map(mapper) || [],
    providerFacility: formData.providerFacility?.map(mapper) || [],
  };
};