Skip to content

Commit

Permalink
Merge branch 'main' into VACMS-19548-orientation-of-map-controls-fl
Browse files Browse the repository at this point in the history
  • Loading branch information
eselkin authored Jan 7, 2025
2 parents 006df7b + b714d8b commit 0a71281
Show file tree
Hide file tree
Showing 223 changed files with 2,550 additions and 1,298 deletions.
16 changes: 13 additions & 3 deletions src/applications/appeals/10182/actions/index.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
import environment from 'platform/utilities/environment';
import { apiRequest } from 'platform/utilities/api';

import { CONTESTABLE_ISSUES_API } from '../constants';
import {
NEW_API,
CONTESTABLE_ISSUES_API,
CONTESTABLE_ISSUES_API_NEW,
} from '../constants/apis';

import {
FETCH_CONTESTABLE_ISSUES_INIT,
FETCH_CONTESTABLE_ISSUES_SUCCEEDED,
FETCH_CONTESTABLE_ISSUES_FAILED,
} from '../../shared/actions';

export const getContestableIssues = () => {
export const getContestableIssues = props => {
const newApi = props?.[NEW_API];
return dispatch => {
dispatch({ type: FETCH_CONTESTABLE_ISSUES_INIT });

return apiRequest(CONTESTABLE_ISSUES_API, { apiVersion: 'v1' })
const apiUrl = `${environment.API_URL}${
newApi ? CONTESTABLE_ISSUES_API_NEW : CONTESTABLE_ISSUES_API
}`;

return apiRequest(apiUrl)
.then(response =>
dispatch({
type: FETCH_CONTESTABLE_ISSUES_SUCCEEDED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { setData } from 'platform/forms-system/src/js/actions';

import { getContestableIssues as getContestableIssuesAction } from '../actions';
import { APP_NAME } from '../constants';
import { NEW_API } from '../constants/apis';
import { getEligibleContestableIssues } from '../../shared/utils/issues';

import { FETCH_CONTESTABLE_ISSUES_FAILED } from '../../shared/actions';
Expand Down Expand Up @@ -37,22 +38,24 @@ const ContestableIssuesWidget = props => {
getContestableIssues,
contestableIssues,
setFormData,
formData,
formData = {},
} = props;

const hasAttempted = useRef(false);
const newApi = formData[NEW_API];

useEffect(
() => {
if (
!hasAttempted.current &&
typeof newApi !== 'undefined' &&
contestableIssues.status === FETCH_CONTESTABLE_ISSUES_FAILED
) {
hasAttempted.current = true; // only call API once if previously failed
getContestableIssues();
getContestableIssues({ [NEW_API]: newApi });
}
},
[contestableIssues.status, getContestableIssues],
[contestableIssues.status, newApi, getContestableIssues],
);

useEffect(() => {
Expand Down
4 changes: 3 additions & 1 deletion src/applications/appeals/10182/config/form.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import prefillTransformer from './prefill-transformer';
import { transform } from './submit-transformer';
import submitForm from './submitForm';

import { SUBMIT_URL } from '../constants/apis';

import IntroductionPage from '../containers/IntroductionPage';
import ConfirmationPage from '../containers/ConfirmationPage';
import AddContestableIssue from '../components/AddContestableIssue';
Expand Down Expand Up @@ -64,7 +66,7 @@ import manifest from '../manifest.json';
const formConfig = {
rootUrl: manifest.rootUrl,
urlPrefix: '/',
submitUrl: 'notice_of_disagreements',
submitUrl: SUBMIT_URL,
trackingPrefix: '10182-board-appeal-',

downtime: {
Expand Down
12 changes: 8 additions & 4 deletions src/applications/appeals/10182/config/submitForm.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
import { submitToUrl } from 'platform/forms-system/src/js/actions';
import environment from 'platform/utilities/environment';

import { NEW_API, SUBMIT_URL_NEW } from '../constants/apis';

// Analytics event
export const buildEventData = () => {};

const submitForm = (form, formConfig) => {
const { trackingPrefix } = formConfig;
// v1 (add part III data)
const submitUrl = `${environment.API_URL}/v1/${formConfig.submitUrl}`;
const { submitUrl, trackingPrefix } = formConfig;
const body = formConfig.transformForSubmit(formConfig, form);

const url = `${environment.API_URL}${
form.data[NEW_API] ? SUBMIT_URL_NEW : submitUrl
}`;

// eventData for analytics
const eventData = buildEventData(form.data);
return submitToUrl(body, submitUrl, trackingPrefix, eventData);
return submitToUrl(body, url, trackingPrefix, eventData);
};

export default submitForm;
26 changes: 26 additions & 0 deletions src/applications/appeals/10182/constants/apis.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* NOTE: If any of these API values change, please update the documentation:
* https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/decision-reviews/Notice-of-Disagreement/engineering/NOD_frontend_backend_interactions.md
*/
export const NEW_API = 'decisionReviewNodNewApi';

export const CONTESTABLE_ISSUES_API =
'/v1/notice_of_disagreements/contestable_issues';

// Evidence upload API - same endpoint as Supplemental Claim
export const EVIDENCE_UPLOAD_API = '/v1/decision_review_evidence';

export const SUBMIT_URL = '/v1/notice_of_disagreements';

/**
* New modularized API behind feature toggle: decision_review_nod_new_api
* The endpoint will be the same until the backend has completed modularization
*/
export const CONTESTABLE_ISSUES_API_NEW =
'/decision_reviews/v1/notice_of_disagreements/contestable_issues';

// Evidence upload API - same endpoint as Supplemental Claim
export const EVIDENCE_UPLOAD_API_NEW =
'/decision_reviews/v1/decision_review_evidence';

export const SUBMIT_URL_NEW = '/decision_reviews/v1/notice_of_disagreements';
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,3 @@ export const APP_NAME = 'Notice of Disagreement';
export const DATA_DOG_ID = 'cabce133-7a68-46ba-ac9b-68c57e8375eb';
export const DATA_DOG_TOKEN = 'pubb208973905b7f32eb100b1c27688ecc9';
export const DATA_DOG_SERVICE = 'benefits-notice-of-disagreement';

export const CONTESTABLE_ISSUES_API =
'/notice_of_disagreements/contestable_issues';
29 changes: 27 additions & 2 deletions src/applications/appeals/10182/containers/FormApp.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { getContestableIssues as getContestableIssuesAction } from '../actions';

import formConfig from '../config/form';
import { DATA_DOG_ID, DATA_DOG_TOKEN, DATA_DOG_SERVICE } from '../constants';
import { NEW_API } from '../constants/apis';

import { FETCH_CONTESTABLE_ISSUES_SUCCEEDED } from '../../shared/actions';
import { wrapWithBreadcrumb } from '../../shared/components/Breadcrumbs';
Expand All @@ -32,6 +33,7 @@ export const FormApp = ({
setFormData,
getContestableIssues,
contestableIssues = {},
toggles,
}) => {
const { pathname } = location || {};

Expand Down Expand Up @@ -77,7 +79,7 @@ export const FormApp = ({
// work properly is overly complicated
(!isOutsideForm(pathname) || formData.internalTesting)
) {
getContestableIssues();
getContestableIssues({ [NEW_API]: toggles[NEW_API] });
} else if (
// Checks if the API has returned contestable issues not already reflected
// in `formData`.
Expand All @@ -102,7 +104,25 @@ export const FormApp = ({
// `useEffect` (e.g. `setFormData`) never change, so we don't need to include
// them in the dependency array.
// eslint-disable-next-line react-hooks/exhaustive-deps
[loggedIn, contestableIssues, formData.contestedIssues, pathname],
[toggles, loggedIn, contestableIssues, formData.contestedIssues, pathname],
);

useEffect(
() => {
const isUpdatedApi = toggles[NEW_API] || false;
if (
!toggles.loading &&
(typeof formData[NEW_API] === 'undefined' ||
formData[NEW_API] !== isUpdatedApi)
) {
setFormData({
...formData,
[NEW_API]: toggles[NEW_API],
});
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[toggles, formData[NEW_API]],
);

const content = isLoading ? (
Expand Down Expand Up @@ -156,6 +176,10 @@ FormApp.propTypes = {
push: PropTypes.func,
}),
setFormData: PropTypes.func,
toggles: PropTypes.shape({
[NEW_API]: PropTypes.bool,
loading: PropTypes.bool,
}),
};

const mapStateToProps = state => ({
Expand All @@ -165,6 +189,7 @@ const mapStateToProps = state => ({
loggedIn: isLoggedIn(state),
returnUrlFromSIPForm: state.form?.loadedData?.metadata?.returnUrl,
isStartingOver: state.form.isStartingOver,
toggles: state.featureToggles || {},
});

const mapDispatchToProps = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { CONTESTABLE_ISSUES_API } from '../constants';
import {
CONTESTABLE_ISSUES_API,
CONTESTABLE_ISSUES_API_NEW,
} from '../constants/apis';

import mockData from './fixtures/data/maximal-test.json';

Expand All @@ -20,12 +23,12 @@ describe('NOD contact info loop', () => {

cy.intercept(
'GET',
`/v0${CONTESTABLE_ISSUES_API}compensation`,
`${CONTESTABLE_ISSUES_API}/compensation`,
mockContestableIssues,
);
cy.intercept(
'GET',
`/v1${CONTESTABLE_ISSUES_API}compensation`,
`${CONTESTABLE_ISSUES_API_NEW}/compensation`,
mockContestableIssues,
);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CONTESTABLE_ISSUES_API } from '../constants';
import { CONTESTABLE_ISSUES_API } from '../constants/apis';

import mockInProgress from './fixtures/mocks/in-progress-forms.json';
import mockData from './fixtures/data/minimal-test.json';
Expand All @@ -8,7 +8,7 @@ import downtimeTesting from '../../shared/tests/cypress.downtime';

downtimeTesting({
baseUrl: NOD_BASE_URL,
contestableApi: `/v1${CONTESTABLE_ISSUES_API}`,
contestableApi: CONTESTABLE_ISSUES_API,
formId: '10182',
inProgressVersion: 2,
data: mockData.data,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import formConfig from '../config/form';
import mockInProgress from './fixtures/mocks/in-progress-forms.json';
import mockSubmit from './fixtures/mocks/application-submit.json';

import { CONTESTABLE_ISSUES_API } from '../constants';
import {
CONTESTABLE_ISSUES_API,
SUBMIT_URL,
SUBMIT_URL_NEW,
} from '../constants/apis';
import mockData from './fixtures/data/maximal-test.json';

import { CONTACT_INFO_PATH } from '../../shared/constants';
Expand All @@ -15,14 +19,14 @@ describe('Notice of Disagreement keyboard only navigation', () => {

cy.wrap(mockData.data).as('testData');

cy.intercept('PUT', 'v0/in_progress_forms/10182', mockInProgress);
cy.intercept('POST', `v0/${formConfig.submitUrl}`, mockSubmit);
cy.intercept('POST', `v1/${formConfig.submitUrl}`, mockSubmit);
cy.intercept('PUT', '/v0/in_progress_forms/10182', mockInProgress);
cy.intercept('POST', SUBMIT_URL, mockSubmit);
cy.intercept('POST', SUBMIT_URL_NEW, mockSubmit);

cy.get('@testData').then(data => {
const { chapters } = formConfig;

cy.intercept('GET', `/v1${CONTESTABLE_ISSUES_API}`, {
cy.intercept('GET', CONTESTABLE_ISSUES_API, {
data: fixDecisionDates(data.contestedIssues, { unselected: true }),
}).as('getIssues');
cy.visit(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CONTESTABLE_ISSUES_API } from '../constants';
import { CONTESTABLE_ISSUES_API } from '../constants/apis';

import mockInProgress from './fixtures/mocks/in-progress-forms.json';
import mockData from './fixtures/data/101-issues.json';
Expand All @@ -8,7 +8,7 @@ import preventMaxSelections from '../../shared/tests/cypress.max-selections';

preventMaxSelections({
baseUrl: NOD_BASE_URL,
contestableApi: `/v1${CONTESTABLE_ISSUES_API}`,
contestableApi: CONTESTABLE_ISSUES_API,
formId: '10182',
inProgressVersion: 2,
data: mockData.data,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import mockInProgress from './fixtures/mocks/in-progress-forms.json';
import mockPrefill from './fixtures/mocks/prefill.json';
import mockSubmit from './fixtures/mocks/application-submit.json';
import mockUpload from './fixtures/mocks/mock-upload.json';
import { CONTESTABLE_ISSUES_API } from '../constants';
import {
CONTESTABLE_ISSUES_API,
SUBMIT_URL,
SUBMIT_URL_NEW,
} from '../constants/apis';

import {
CONTESTABLE_ISSUES_PATH,
Expand Down Expand Up @@ -119,13 +123,13 @@ const testConfig = createTestConfig(
cypressSetup();

cy.intercept('POST', 'v1/decision_review_evidence', mockUpload);
cy.intercept('POST', `v0/${formConfig.submitUrl}`, mockSubmit);
cy.intercept('POST', `v1/${formConfig.submitUrl}`, mockSubmit);
cy.intercept('POST', SUBMIT_URL, mockSubmit);
cy.intercept('POST', SUBMIT_URL_NEW, mockSubmit);

cy.get('@testData').then(data => {
cy.intercept('GET', '/v0/in_progress_forms/10182', mockPrefill);
cy.intercept('PUT', 'v0/in_progress_forms/10182', mockInProgress);
cy.intercept('GET', `/v1${CONTESTABLE_ISSUES_API}`, {
cy.intercept('GET', CONTESTABLE_ISSUES_API, {
data: fixDecisionDates(data.contestedIssues, { unselected: true }),
}).as('getIssues');
});
Expand Down
Loading

0 comments on commit 0a71281

Please sign in to comment.