department-of-veterans-affairs/vets-website

View on GitHub
src/applications/pensions/config/chapters/04-household-information/helpers.jsx

Summary

Maintainability
A
0 mins
Test Coverage
import get from 'platform/forms-system/src/js/utilities/data/get';
import numberToWords from 'platform/forms-system/src/js/utilities/data/numberToWords';
import titleCase from 'platform/utilities/data/titleCase';
import { createSelector } from 'reselect';
import { Title } from 'platform/forms-system/src/js/web-component-patterns';
import React from 'react';
import { isWithinInterval, parseISO, startOfDay, subYears } from 'date-fns';

export function isSeparated(formData) {
  return formData.maritalStatus === 'SEPARATED';
}

export function isMarried(form = {}) {
  return ['MARRIED', 'SEPARATED'].includes(form.maritalStatus);
}

export function doesHaveDependents(formData) {
  return get(['view:hasDependents'], formData) === true;
}

export function isCurrentMarriage(formData, index) {
  const numMarriages =
    formData && formData.marriages ? formData.marriages.length : 0;
  return isMarried(formData) && numMarriages - 1 === index;
}

export function currentSpouseHasFormerMarriages(formData) {
  return isMarried(formData) && formData.currentSpouseMaritalHistory === 'YES';
}

export function showSpouseAddress(formData) {
  return (
    isMarried(formData) &&
    (formData.maritalStatus === 'SEPARATED' ||
      get(['view:liveWithSpouse'], formData) === false)
  );
}

export function isBetween18And23(childDOB) {
  if (!childDOB) return false;
  const today = startOfDay(new Date());
  const lowerBound = subYears(today, 23);
  const upperBound = subYears(today, 18);

  return isWithinInterval(parseISO(childDOB), {
    start: lowerBound,
    end: upperBound,
  });
}

export function dependentIsOutsideHousehold(formData, index) {
  // if 'view:hasDependents' is false,
  // all checks requiring dependents must be false
  return (
    doesHaveDependents(formData) &&
    !get(['dependents', index, 'childInHousehold'], formData)
  );
}

export function getMarriageTitle(index) {
  const desc = numberToWords(index + 1);
  return `${titleCase(desc)} marriage`;
}

export function getMarriageTitleWithCurrent(form, index) {
  if (isMarried(form) && form.marriages.length - 1 === index) {
    return 'Current marriage';
  }

  return getMarriageTitle(index);
}

export function getDependentChildTitle(item, description) {
  if (item.fullName) {
    return `${item.fullName.first || ''} ${item.fullName.last ||
      ''} ${description}`;
  }
  return description;
}

export function createSpouseLabelSelector(nameTemplate) {
  return createSelector(
    form =>
      form.marriages && form.marriages.length
        ? form.marriages[form.marriages.length - 1].spouseFullName
        : null,
    spouseFullName => {
      if (spouseFullName) {
        return {
          title: nameTemplate(spouseFullName),
        };
      }

      return {
        title: null,
      };
    },
  );
}

export const MarriageTitle = title => <Title title={title} />;