From 7bbb889258050502e6fce11b65b175a0f10e5a54 Mon Sep 17 00:00:00 2001 From: Andy Shultz Date: Fri, 10 Sep 2021 14:15:06 -0400 Subject: [PATCH 1/2] feat: if verified name is on, we can redo ID verification The verified_name endpoint provides is_enabled only it a name exists, so we have to request the enabled flag separately. MST-1026 --- src/account-settings/data/service.js | 13 +++++++++++ .../IdVerificationContextProvider.jsx | 22 +++++++++++++++---- .../IdVerificationContextProvider.test.jsx | 15 ++++++++++++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/account-settings/data/service.js b/src/account-settings/data/service.js index c77ceb4..9f80f38 100644 --- a/src/account-settings/data/service.js +++ b/src/account-settings/data/service.js @@ -176,6 +176,19 @@ export async function shouldDisplayDemographicsQuestions() { return false; } +export async function getVerifiedNameEnabled() { + let data; + const client = getAuthenticatedHttpClient(); + try { + const requestUrl = `${getConfig().LMS_BASE_URL}/api/edx_name_affirmation/v1/verified_name_enabled`; + ({ data } = await client.get(requestUrl)); + } catch (error) { + return {}; + } + + return data; +} + export async function getVerifiedName() { let data; const client = getAuthenticatedHttpClient(); diff --git a/src/id-verification/IdVerificationContextProvider.jsx b/src/id-verification/IdVerificationContextProvider.jsx index 942c072..538152d 100644 --- a/src/id-verification/IdVerificationContextProvider.jsx +++ b/src/id-verification/IdVerificationContextProvider.jsx @@ -2,7 +2,7 @@ import React, { useState, useContext, useEffect } from 'react'; import PropTypes from 'prop-types'; import { AppContext } from '@edx/frontend-platform/react'; -import { getProfileDataManager, getVerifiedName } from '../account-settings/data/service'; +import { getProfileDataManager, getVerifiedName, getVerifiedNameEnabled } from '../account-settings/data/service'; import PageLoading from '../account-settings/PageLoading'; import { getExistingIdVerification, getEnrollments } from './data/service'; @@ -30,11 +30,25 @@ export default function IdVerificationContextProvider({ children }) { hasGetUserMediaSupport ? MEDIA_ACCESS.PENDING : MEDIA_ACCESS.UNSUPPORTED, ); + const [verifiedNameEnabled, setVerifiedNameEnabled] = useState(''); + useEffect(() => { + // Make the API call to retrieve VerifiedNameEnabled + (async () => { + const response = await getVerifiedNameEnabled(); + if (response) { + setVerifiedNameEnabled(response.verified_name_enabled); + } else { + setVerifiedNameEnabled(false); + } + })(); + }, []); + const [canVerify, setCanVerify] = useState(true); const [error, setError] = useState(''); useEffect(() => { - // Check for an existing verification attempt - if (existingIdVerification && !existingIdVerification.canVerify) { + // With verified name we can redo verification multiple times + // if not a successful request prevents re-verification + if (!verifiedNameEnabled && existingIdVerification && !existingIdVerification.canVerify) { const { status } = existingIdVerification; setCanVerify(false); if (status === 'pending' || status === 'approved') { @@ -43,7 +57,7 @@ export default function IdVerificationContextProvider({ children }) { setError(ERROR_REASONS.CANNOT_VERIFY); } } - }, [existingIdVerification]); + }, [existingIdVerification, verifiedNameEnabled]); useEffect(() => { // Check whether the learner is enrolled in a verified course mode. (async () => { diff --git a/src/id-verification/tests/IdVerificationContextProvider.test.jsx b/src/id-verification/tests/IdVerificationContextProvider.test.jsx index 9f4b1e4..698c401 100644 --- a/src/id-verification/tests/IdVerificationContextProvider.test.jsx +++ b/src/id-verification/tests/IdVerificationContextProvider.test.jsx @@ -5,7 +5,7 @@ import '@testing-library/jest-dom/extend-expect'; import { IntlProvider } from '@edx/frontend-platform/i18n'; import { AppContext } from '@edx/frontend-platform/react'; -import { getProfileDataManager, getVerifiedName } from '../../account-settings/data/service'; +import { getProfileDataManager, getVerifiedName, getVerifiedNameEnabled } from '../../account-settings/data/service'; import { getExistingIdVerification, getEnrollments } from '../data/service'; import IdVerificationContextProvider from '../IdVerificationContextProvider'; @@ -13,6 +13,7 @@ import IdVerificationContextProvider from '../IdVerificationContextProvider'; jest.mock('../../account-settings/data/service', () => ({ getProfileDataManager: jest.fn(), getVerifiedName: jest.fn(), + getVerifiedNameEnabled: jest.fn(), })); jest.mock('../data/service', () => ({ @@ -75,4 +76,16 @@ describe('IdVerificationContextProvider', () => { ))); expect(getVerifiedName).toHaveBeenCalled(); }); + + it('calls getVerifiedNameEnabled', async () => { + const context = { authenticatedUser: { userId: 3, roles: [] } }; + await act(async () => render(( + + + + + + ))); + expect(getVerifiedNameEnabled).toHaveBeenCalled(); + }); }); From 5640fb95c2b7df07b7e2cf2b6455e4a66acdaa18 Mon Sep 17 00:00:00 2001 From: Andy Shultz Date: Wed, 15 Sep 2021 09:36:09 -0400 Subject: [PATCH 2/2] fix: use correct initial state type --- src/id-verification/IdVerificationContextProvider.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/id-verification/IdVerificationContextProvider.jsx b/src/id-verification/IdVerificationContextProvider.jsx index 538152d..b8f4cd8 100644 --- a/src/id-verification/IdVerificationContextProvider.jsx +++ b/src/id-verification/IdVerificationContextProvider.jsx @@ -30,7 +30,7 @@ export default function IdVerificationContextProvider({ children }) { hasGetUserMediaSupport ? MEDIA_ACCESS.PENDING : MEDIA_ACCESS.UNSUPPORTED, ); - const [verifiedNameEnabled, setVerifiedNameEnabled] = useState(''); + const [verifiedNameEnabled, setVerifiedNameEnabled] = useState(false); useEffect(() => { // Make the API call to retrieve VerifiedNameEnabled (async () => {