department-of-veterans-affairs/vets-website

View on GitHub
src/applications/simple-forms/20-10207/helpers.js

Summary

Maintainability
D
1 day
Test Coverage
import moment from 'moment';

import { $$ } from 'platform/forms-system/src/js/utilities/ui';
import { focusElement } from 'platform/utilities/ui';

import { PREPARER_TYPES } from './config/constants';

export function getMockData(mockData, isLocalhost) {
  return !!mockData && isLocalhost() && !window.Cypress ? mockData : undefined;
}

export function getPreparerString(preparerType) {
  switch (preparerType) {
    case PREPARER_TYPES.THIRD_PARTY_VETERAN:
      return 'Veteran’s';
    case PREPARER_TYPES.THIRD_PARTY_NON_VETERAN:
      return 'Claimant’s';
    default:
      return 'Your';
  }
}

export function getPersonalInformationChapterTitle(formData) {
  const preparerString = getPreparerString(formData.preparerType);

  return `${preparerString} personal information`;
}

export function getFullNameLabels(label, skipMiddleCheck = false) {
  if (label === 'middle name' && !skipMiddleCheck) {
    return 'Middle initial';
  }

  return label.charAt(0).toUpperCase() + label.slice(1);
}

export function getNameAndDobPageTitle(formData) {
  const { preparerType } = formData;
  const titleEnding = 'name and date of birth';
  switch (preparerType) {
    case PREPARER_TYPES.THIRD_PARTY_VETERAN:
      return `Veteran’s ${titleEnding}`;
    case PREPARER_TYPES.THIRD_PARTY_NON_VETERAN:
      return `Claimant’s ${titleEnding}`;
    default:
      return 'Your name and date of birth';
  }
}

export function getNameAndDobPageDescription(formData) {
  const { preparerType } = formData;
  switch (preparerType) {
    case PREPARER_TYPES.NON_VETERAN:
      return 'Please provide your information as the person with the claim.';
    case PREPARER_TYPES.THIRD_PARTY_VETERAN:
      return 'Please provide the Veteran’s information.';
    case PREPARER_TYPES.THIRD_PARTY_NON_VETERAN:
      return 'Please provide information on the person with the claim (also called the claimant).';
    default:
      return 'Please provide your information as the Veteran.';
  }
}

export function getIdentityInfoPageTitle(formData) {
  const { preparerType } = formData;
  const titleEnding = 'identification information';
  switch (preparerType) {
    case PREPARER_TYPES.THIRD_PARTY_VETERAN:
      return `Veteran’s ${titleEnding}`;
    case PREPARER_TYPES.THIRD_PARTY_NON_VETERAN:
      return `Claimant’s ${titleEnding}`;
    default:
      return `Your ${titleEnding}`;
  }
}

export function getVeteranIdentityInfoPageTitle(formData) {
  const titleEnding = 'identification information';
  return formData.preparerType === PREPARER_TYPES.VETERAN
    ? `Your ${titleEnding}`
    : `Veteran’s ${titleEnding}`;
}

export function getLivingSituationChapterTitle(formData) {
  const preparerString = getPreparerString(formData.preparerType);
  return `${preparerString} living situation`;
}

export function validateLivingSituation(errors, fields) {
  const selectedSituations = Object.keys(fields.livingSituation).filter(
    key => fields.livingSituation[key],
  );
  let preparerString = '';
  switch (fields.preparerType) {
    case PREPARER_TYPES.THIRD_PARTY_VETERAN:
      preparerString = 'the Veteran';
      break;
    case PREPARER_TYPES.THIRD_PARTY_NON_VETERAN:
      preparerString = 'the Claimant';
      break;
    default:
      preparerString = 'you';
      break;
  }

  // We're just checking to make sure no other option's selected along with NONE here
  // schema's required prop already handles required error-message
  if (selectedSituations.length > 1 && selectedSituations.includes('NONE')) {
    errors.livingSituation.addError(
      `If none of these situations apply to ${preparerString}, unselect the other options you selected`,
    );
  }
}

export function getContactInfoChapterTitle(formData) {
  const preparerString = getPreparerString(formData.preparerType);
  return `${preparerString} contact information`;
}

export function getMailindAddressPageTitle(formData) {
  const preparerString = getPreparerString(formData.preparerType);
  return `${preparerString} mailing address`;
}

export function getPhoneAndEmailPageTitle(formData) {
  const preparerString = getPreparerString(formData.preparerType);
  return `${preparerString} phone and email address`;
}

export function createPayload(file, formId, password) {
  const payload = new FormData();
  payload.set('form_id', formId);
  payload.append('file', file);
  if (password) {
    payload.append('password', password);
  }
  return payload;
}

export function parseResponse({ data }) {
  const { name } = data.attributes;
  const focusFileCard = () => {
    const target = $$('.schemaform-file-list li').find(entry =>
      entry.textContent?.trim().includes(name),
    );

    if (target) {
      focusElement(target);
    }
  };

  setTimeout(() => {
    focusFileCard();
  }, 100);

  return {
    name,
    confirmationCode: data.attributes.confirmationCode,
  };
}

export function dateOfDeathValidation(errors, fields) {
  const { veteranDateOfBirth, veteranDateOfDeath } = fields;
  const dob = moment(veteranDateOfBirth);
  const dod = moment(veteranDateOfDeath);

  if (dod.isBefore(dob)) {
    errors.veteranDateOfDeath.addError(
      'Provide a date that is after the date of birth',
    );
  }
}

export function powConfinementDateRangeValidation(errors, fields) {
  const { powConfinementStartDate, powConfinementEndDate } = fields;
  const startDate = moment(powConfinementStartDate);
  const endDate = moment(powConfinementEndDate);

  if (!!endDate && !!startDate && endDate.isSameOrBefore(startDate)) {
    errors.powConfinementEndDate.addError(
      'The end date must be after the start date',
    );
  }
}

export function powConfinement2DateRangeValidation(errors, fields) {
  const { powConfinement2StartDate, powConfinement2EndDate } = fields;
  const startDate = moment(powConfinement2StartDate);
  const endDate = moment(powConfinement2EndDate);

  if (!!endDate && !!startDate && endDate.isSameOrBefore(startDate)) {
    errors.powConfinement2EndDate.addError(
      'The end date must be after the start date',
    );
  }
}

export const statementOfTruthFullNamePath = ({ formData }) => {
  const { preparerType } = formData;
  switch (preparerType) {
    case PREPARER_TYPES.VETERAN:
      return 'veteranFullName';
    case PREPARER_TYPES.NON_VETERAN:
      return 'nonVeteranFullName';
    default:
      return 'thirdPartyFullName';
  }
};

export const getSubmitterName = formData => {
  const { preparerType } = formData;
  switch (preparerType) {
    case PREPARER_TYPES.VETERAN:
      return formData.veteranFullName;
    case PREPARER_TYPES.NON_VETERAN:
      return formData.nonVeteranFullName;
    default:
      return formData.thirdPartyFullName;
  }
};

export const evidenceConfinementHintUpdateUiSchema = ({
  formData,
  beganEndedString,
}) => {
  if (formData?.preparerType === PREPARER_TYPES.THIRD_PARTY_VETERAN) {
    return {
      'ui:options': {
        hint: `Tell us the dates the Veteran’s confinement ${beganEndedString} as a prisoner of war.`,
      },
    };
  }

  if (formData?.preparerType === PREPARER_TYPES.THIRD_PARTY_NON_VETERAN) {
    return {
      'ui:options': {
        hint: `Tell us the dates the claimant’s confinement ${beganEndedString} as a prisoner of war.`,
      },
    };
  }

  return {
    'ui:options': {
      hint: `Tell us the dates your confinement ${beganEndedString} as a prisoner of war.`,
    },
  };
};