diff --git a/src/components/InstitutionTile.js b/src/components/InstitutionTile.js index 1f932267ec..4d4967ac70 100644 --- a/src/components/InstitutionTile.js +++ b/src/components/InstitutionTile.js @@ -19,6 +19,16 @@ export const InstitutionTile = (props) => { const tokens = useTokens() const styles = getStyles(tokens) + let statusChip = null + if (institution.is_disabled_by_client) { + statusChip = + } else if ( + status === InstitutionStatus.UNAVAILABLE || + status === InstitutionStatus.UNAVAILABLE_PER_MX + ) { + statusChip = + } + return ( ) } @@ -138,8 +143,6 @@ const getStyles = (tokens) => { }, chip: { padding: `${tokens.Spacing.XTiny}px 0`, - background: '#ECECEC', - color: '#494949', height: tokens.Spacing.Medium, fontSize: '9px', }, diff --git a/src/components/__tests__/InstitutionTile-test.jsx b/src/components/__tests__/InstitutionTile-test.jsx index a7d7718f9f..a2e4c42ec5 100644 --- a/src/components/__tests__/InstitutionTile-test.jsx +++ b/src/components/__tests__/InstitutionTile-test.jsx @@ -1,18 +1,16 @@ import React from 'react' import { render, screen } from 'src/utilities/testingLibrary' -import { act } from 'react' import { InstitutionTile } from '../InstitutionTile' +import { InstitutionStatusField } from 'src/utilities/institutionStatus' describe('', () => { - it('renders the logoUrl in the src if there is one', async () => { + it('renders the logoUrl in the src if there is one', () => { const institution = { name: 'testName', logo_url: 'testLogoUrl', } - await act(async () => { - render( {}} />) - }) + render( {}} />) expect(screen.getByAltText(`${institution.name} logo`)).toHaveAttribute( 'src', @@ -20,46 +18,67 @@ describe('', () => { ) }) - it('renders a generated url with the guid if there is no logoUrl', async () => { + it('renders a generated url with the guid if there is no logoUrl', () => { const institution = { guid: 'testGuid', name: 'testName', } - await act(async () => { - render( {}} />) - }) + render( {}} />) expect(screen.getByAltText(`${institution.name} logo`).src.includes(institution.guid)).toBe( true, ) }) - it('renders a disabled Chip if the institution is disabled', async () => { + it('renders a disabled Chip if the institution is disabled', () => { const institution = { guid: 'testGuid', name: 'testName', is_disabled_by_client: true, } - await act(async () => { - render( {}} />) - }) + render( {}} />) expect(screen.getByText('DISABLED')).toBeInTheDocument() }) - it('does not render a disabled Chip if the institution is not disabled', async () => { + it('does not render a disabled Chip if the institution is not disabled', () => { const institution = { guid: 'testGuid', name: 'testName', is_disabled_by_client: false, } - await act(async () => { - render( {}} />) - }) + render( {}} />) expect(screen.queryByText('DISABLED')).not.toBeInTheDocument() }) + + it('renders an UNAVAILABLE Chip if the institution is unavailable by experiment values', () => { + const institution = { guid: 'testGuid', name: 'testName' } + const preloadedState = { + experimentalFeatures: { + unavailableInstitutions: [institution], + }, + } + + render( {}} />, { + preloadedState, + }) + + expect(screen.getByText('UNAVAILABLE')).toBeInTheDocument() + }) + + it('renders an UNAVAILABLE Chip if the institution is unavailable by API', () => { + const institution = { + guid: 'testGuid', + name: 'testName', + status: InstitutionStatusField.UNAVAILABLE, + } + + render( {}} />) + + expect(screen.getByText('UNAVAILABLE')).toBeInTheDocument() + }) }) diff --git a/src/const/language/es.po b/src/const/language/es.po index 44e884c2cc..70082c4ff0 100644 --- a/src/const/language/es.po +++ b/src/const/language/es.po @@ -1881,7 +1881,6 @@ msgstr "" msgid "Log in again" msgstr "Inicie sesión nuevamente" -#: src/views/institutionStatusDetails/InstitutionStatusDetails.tsx #: src/views/actionableError/useActionableErrorMap.tsx msgid "Connect a different institution" msgstr "Conecte una institución diferente" @@ -2071,7 +2070,25 @@ msgid "Demo mode active" msgstr "Modo de demostración activo" #: src/views/demoConnectGuard/DemoConnectGuard.tsx -msgid "Live institutions are not available in the demo environment. Please select " +msgid "" +"Live institutions are not available in the demo environment. Please select " "*MX Bank* to test the connection process." -msgstr "Las instituciones en vivo no están disponibles en el entorno de " +msgstr "" +"Las instituciones en vivo no están disponibles en el entorno de " "demostración. Seleccione *MX Bank* para probar el proceso de conexión." + +#: src/utilities/institutionStatus.ts +msgid "Connection unavailable" +msgstr "Conexión no disponible" + +#: src/utilities/institutionStatus.ts +msgid "" +"This institution is experiencing issues that prevent successful " +"connections. It's unclear when this will be resolved." +msgstr "" +"Esta institución está experimentando problemas que impiden establecer " +"conexiones exitosas. No está claro cuándo se resolverá esta situación." + +#: src/views/institutionStatusDetails/InstitutionStatusDetails.tsx +msgid "Back" +msgstr "Retroceder" diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index 21fb3e08a4..edd8c3537c 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -1957,7 +1957,6 @@ msgstr "" msgid "Log in again" msgstr "Connectez-vous à nouveau" -#: src/views/institutionStatusDetails/InstitutionStatusDetails.tsx #: src/views/actionableError/useActionableErrorMap.tsx msgid "Connect a different institution" msgstr "Mettre en relation un autre établissement" @@ -2149,8 +2148,26 @@ msgid "Demo mode active" msgstr "Mode démo actif" #: src/views/demoConnectGuard/DemoConnectGuard.tsx -msgid "Live institutions are not available in the demo environment. Please select " +msgid "" +"Live institutions are not available in the demo environment. Please select " "*MX Bank* to test the connection process." -msgstr "Les établissements réels ne sont pas disponibles dans l'environnement de " +msgstr "" +"Les établissements réels ne sont pas disponibles dans l'environnement de " "démonstration. Veuillez sélectionner *MX Bank* pour tester la procédure de " "connexion." + +#: src/utilities/institutionStatus.ts +msgid "Connection unavailable" +msgstr "Connexion indisponible" + +#: src/utilities/institutionStatus.ts +msgid "" +"This institution is experiencing issues that prevent successful " +"connections. It's unclear when this will be resolved." +msgstr "" +"Cet établissement rencontre des problèmes qui empêchent d'établir des " +"connexions. Il est difficile de déterminer quand la situation sera résolue." + +#: src/views/institutionStatusDetails/InstitutionStatusDetails.tsx +msgid "Back" +msgstr "Reculer" diff --git a/src/hooks/__tests__/useLoadConnect-test.tsx b/src/hooks/__tests__/useLoadConnect-test.tsx index 676cc00b25..4e42244269 100644 --- a/src/hooks/__tests__/useLoadConnect-test.tsx +++ b/src/hooks/__tests__/useLoadConnect-test.tsx @@ -10,6 +10,7 @@ import { apiValue } from 'src/const/apiProviderMock' import { ConfigError } from 'src/components/ConfigError' import { COMBO_JOB_DATA_TYPES } from 'src/const/comboJobDataTypes' import { loadExperimentalFeatures } from 'src/redux/reducers/experimentalFeaturesSlice' +import { InstitutionStatusField } from 'src/utilities/institutionStatus' const TestLoadConnectComponent: React.FC<{ clientConfig: ClientConfigType @@ -309,7 +310,7 @@ describe('useLoadConnect', () => { ).toBeInTheDocument() }) - it('will return the INSTITUTION_STATUS_DETAILS step if the state contains a configured unavailable institution', async () => { + it('will return the INSTITUTION_STATUS_DETAILS step if the state contains a configured unavailable institution, via the experimental props', async () => { const mockApi = { ...apiValue, loadInstitutionByGuid: vi.fn().mockResolvedValue( @@ -337,4 +338,29 @@ describe('useLoadConnect', () => { ) expect(await screen.findByText(/Institution status details/i)).toBeInTheDocument() }) + + it('will return the INSTITUTION_STATUS_DETAILS step if the state contains a configured unavailable institution, via the api', async () => { + const mockApi = { + ...apiValue, + loadInstitutionByGuid: vi.fn().mockResolvedValue( + Promise.resolve({ + ...institutionData.institution, + guid: 'INS-unavailable', + name: 'Unavailable Bank', + status: InstitutionStatusField.UNAVAILABLE, // This status triggers the UNAVAILABLE_PER_MX status + }), + ), + } + render( + + + , + ) + expect(await screen.findByText(/Institution status details/i)).toBeInTheDocument() + }) }) diff --git a/src/redux/reducers/Connect.js b/src/redux/reducers/Connect.js index e3e1b1b823..d220032f80 100644 --- a/src/redux/reducers/Connect.js +++ b/src/redux/reducers/Connect.js @@ -20,7 +20,7 @@ import { institutionIsBlockedForCostReasons, memberIsBlockedForCostReasons, } from 'src/utilities/institutionBlocks' -import { InstitutionStatus } from 'src/utilities/institutionStatus' +import { getInstitutionStatus, InstitutionStatus } from 'src/utilities/institutionStatus' export const defaultState = { error: null, // The most recent job request error, if any @@ -290,7 +290,8 @@ const selectInstitutionSuccess = (state, action) => { if ( action.payload.institution && (institutionIsBlockedForCostReasons(action.payload.institution) || - action.payload.institutionStatus === InstitutionStatus.UNAVAILABLE) + action.payload.institutionStatus === InstitutionStatus.UNAVAILABLE || + action.payload.institutionStatus === InstitutionStatus.UNAVAILABLE_PER_MX) ) { nextStep = STEPS.INSTITUTION_STATUS_DETAILS } else if (action.payload.user?.is_demo && !action.payload.institution?.is_demo) { @@ -544,11 +545,9 @@ function getStartingStep( // Unavailable institutions experimental feature: Make sure we don't load a user // directly to an institution that should be unavailable. const unavailableInstitutions = experimentalFeatures?.unavailableInstitutions || [] - const institutionIsAvailable = - institution && - unavailableInstitutions.find( - (ins) => ins.guid === institution?.guid || ins.name === institution?.name, - ) === undefined + const institutionStatus = getInstitutionStatus(institution, unavailableInstitutions) + const unavailableStatuses = [InstitutionStatus.UNAVAILABLE, InstitutionStatus.UNAVAILABLE_PER_MX] + const institutionIsAvailable = institution && !unavailableStatuses.includes(institutionStatus) const shouldStepToMFA = member && config.update_credentials && member.connection_status === ReadableStatuses.CHALLENGED diff --git a/src/utilities/__tests__/institutionStatus-test.tsx b/src/utilities/__tests__/institutionStatus-test.tsx index 69650c9254..6245bfa32f 100644 --- a/src/utilities/__tests__/institutionStatus-test.tsx +++ b/src/utilities/__tests__/institutionStatus-test.tsx @@ -8,6 +8,7 @@ import { useInstitutionStatusMessage, useInstitutionStatus, getInstitutionStatus, + InstitutionStatusField, } from '../institutionStatus' import * as institutionBlocks from '../institutionBlocks' import { Provider } from 'react-redux' @@ -93,6 +94,20 @@ describe('institutionStatus', () => { const result = getInstitutionStatus(institution, unavailableInstitutions) expect(result).toBe(InstitutionStatus.OPERATIONAL) }) + + // API response for institution.status + it('returns UNAVAILABLE_PER_MX when institution.status is set to UNAVAILABLE', () => { + const institution = { + guid: 'test-guid', + name: 'Test Bank', + status: InstitutionStatusField.UNAVAILABLE, + } + const unavailableInstitutions: { guid: string; name: string }[] = [] + vi.mocked(institutionBlocks.institutionIsBlockedForCostReasons).mockReturnValue(false) + + const result = getInstitutionStatus(institution, unavailableInstitutions) + expect(result).toBe(InstitutionStatus.UNAVAILABLE_PER_MX) + }) }) describe('useInstitutionStatus', () => { @@ -108,6 +123,21 @@ describe('institutionStatus', () => { expect(result.current).toBe(InstitutionStatus.UNAVAILABLE) }) + it('returns UNAVAILABLE_PER_MX when institution.status is set to UNAVAILABLE in API response', () => { + const institution = { + guid: 'test-guid', + name: 'Test Bank', + status: InstitutionStatusField.UNAVAILABLE, + } + const store = createMockStore([]) + + const { result } = renderHook(() => useInstitutionStatus(institution), { + wrapper: ({ children }) => wrapper({ children, store }), + }) + + expect(result.current).toBe(InstitutionStatus.UNAVAILABLE_PER_MX) + }) + it('handles null institution', () => { const store = createMockStore([]) @@ -173,6 +203,25 @@ describe('institutionStatus', () => { }) }) + it('returns a unique unavailable message when institution.status is set to UNAVAILABLE in API response', () => { + const institution = { + guid: 'test-guid', + name: 'Test Bank', + status: InstitutionStatusField.UNAVAILABLE, + } + const store = createMockStore([]) + vi.mocked(institutionBlocks.institutionIsBlockedForCostReasons).mockReturnValue(false) + + const { result } = renderHook(() => useInstitutionStatusMessage(institution), { + wrapper: ({ children }) => wrapper({ children, store }), + }) + + expect(result.current).toEqual({ + title: 'Connection unavailable', + body: "This institution is experiencing issues that prevent successful connections. It's unclear when this will be resolved.", + }) + }) + it('returns empty message for OPERATIONAL status', () => { const institution = { guid: 'test-guid', name: 'Test Bank' } const store = createMockStore([]) diff --git a/src/utilities/institutionStatus.ts b/src/utilities/institutionStatus.ts index 6e3c69f6fa..aecf20a1a5 100644 --- a/src/utilities/institutionStatus.ts +++ b/src/utilities/institutionStatus.ts @@ -3,16 +3,29 @@ import { institutionIsBlockedForCostReasons } from './institutionBlocks' import { __ } from 'src/utilities/Intl' import { useSelector } from 'react-redux' +// InstitutionStatus is a manually defined value, it's not something the API will give us +// These are the values we'll return to our application to determine what messaging to show for an institution, if any export const InstitutionStatus = { CLIENT_BLOCKED_FOR_FEES: 'CLIENT_BLOCKED_FOR_FEES', OPERATIONAL: 'OPERATIONAL', - UNAVAILABLE: 'UNAVAILABLE', + UNAVAILABLE_PER_MX: 'UNAVAILABLE_PER_MX', + UNAVAILABLE: 'UNAVAILABLE', // Experimental feature status, will be remove eventually } +// The InstitutionStatusType and InstitutionStatusField below are API defined values, this is our mapping for them +export const InstitutionStatusField = { + OPERATIONAL: 0, + MAINTENANCE: 1, + DEGRADED: 2, + UNAVAILABLE: 3, +} as const +type InstitutionStatusType = (typeof InstitutionStatusField)[keyof typeof InstitutionStatusField] + export function useInstitutionStatusMessage(institution: { guid: string name: string is_disabled_by_client?: boolean + status?: InstitutionStatusType }) { const { unavailableInstitutions } = useSelector(getExperimentalFeatures) const status = useInstitutionStatus(institution) @@ -45,6 +58,13 @@ export function useInstitutionStatusMessage(institution: { institution.name, ), } + case InstitutionStatus.UNAVAILABLE_PER_MX: + return { + title: __('Connection unavailable'), + body: __( + "This institution is experiencing issues that prevent successful connections. It's unclear when this will be resolved.", + ), + } default: return { title: '', @@ -58,6 +78,7 @@ export function useInstitutionStatus( guid: string name: string is_disabled_by_client?: boolean + status?: InstitutionStatusType } | null, ) { // Right now the statuses are driven by experimental features. @@ -73,6 +94,7 @@ export function getInstitutionStatus( guid: string name: string is_disabled_by_client?: boolean + status?: InstitutionStatusType } | null, unavailableInstitutions: { guid: string; name: string }[], ) { @@ -88,6 +110,10 @@ export function getInstitutionStatus( return InstitutionStatus.CLIENT_BLOCKED_FOR_FEES } + if (institution?.status === InstitutionStatusField.UNAVAILABLE) { + return InstitutionStatus.UNAVAILABLE_PER_MX + } + // Return UNAVAILABLE if the institution is currently marked as unavailable. // This is driven by the experimental feature "unavailableInstitutions". // Each institution must be included manually into the npm package's props diff --git a/src/views/institutionStatusDetails/InstitutionStatusDetails.tsx b/src/views/institutionStatusDetails/InstitutionStatusDetails.tsx index df6e90eed0..8df3a1e506 100644 --- a/src/views/institutionStatusDetails/InstitutionStatusDetails.tsx +++ b/src/views/institutionStatusDetails/InstitutionStatusDetails.tsx @@ -82,7 +82,7 @@ export const InstitutionStatusDetails = React.forwardRef - {__('Connect a different institution')} + {__('Back')} diff --git a/src/views/institutionStatusDetails/__tests__/InstitutionStatusDetails-test.tsx b/src/views/institutionStatusDetails/__tests__/InstitutionStatusDetails-test.tsx index d855748edd..9bff25f9a9 100644 --- a/src/views/institutionStatusDetails/__tests__/InstitutionStatusDetails-test.tsx +++ b/src/views/institutionStatusDetails/__tests__/InstitutionStatusDetails-test.tsx @@ -2,6 +2,7 @@ import React from 'react' import { useDispatch } from 'react-redux' import { ActionTypes } from 'src/redux/actions/Connect' import { initialState } from 'src/redux/reducers/configSlice' +import { InstitutionStatusField } from 'src/utilities/institutionStatus' import { render, screen, waitFor } from 'src/utilities/testingLibrary' import { InstitutionStatusDetails } from 'src/views/institutionStatusDetails/InstitutionStatusDetails' @@ -18,6 +19,11 @@ const blockedInstitution = { guid: 'INS-78c7b591-6512-9c17-b092-1cddbd3c85ba', // PROD INS guid } const unavailableInstitution = { guid: 'INST-unavailable', name: 'Unavailable Bank' } +const apiUnavailableInstitution = { + guid: 'INST-api-unavailable', + name: 'API Unavailable Bank', + status: InstitutionStatusField.UNAVAILABLE, +} describe('InstitutionStatusDetails', () => { const preloadedState = { @@ -55,7 +61,7 @@ describe('InstitutionStatusDetails', () => { expect(disabledIcon).toBeInTheDocument() }) - it('CLIENT_BLOCKED_FOR_FEES status - renders the header title and paragraph explaination', () => { + it('CLIENT_BLOCKED_FOR_FEES status - renders the header title and paragraph explanation', () => { const result = render(, { preloadedState: { connect: { @@ -79,7 +85,7 @@ describe('InstitutionStatusDetails', () => { ).toBeInTheDocument() }) - it('UNAVAILABLE status - renders the header title and paragraph explaination', () => { + it('UNAVAILABLE status - renders the header title and paragraph explanation', () => { const result = render(, { preloadedState: { connect: { @@ -106,8 +112,37 @@ describe('InstitutionStatusDetails', () => { ).toBeInTheDocument() }) + it('UNAVAILABLE institution.status from API - renders the header title and paragraph explanation', () => { + const result = render(, { + preloadedState: { + connect: { + selectedInstitution: apiUnavailableInstitution, + }, + config: { + ...initialState, + _initialValues: JSON.stringify(initialState), + }, + experimentalFeatures: { + unavailableInstitutions: [], + }, + }, + }) + container = result.container + + expect(screen.getByText(`Connection unavailable`)).toBeInTheDocument() + expect( + screen.getByText( + (content, element) => + element?.tagName.toLowerCase() === 'p' && + content.includes( + 'This institution is experiencing issues that prevent successful connections', + ), + ), + ).toBeInTheDocument() + }) + it('renders a primary button that dispatches the correct action', () => { - const button = screen.getByRole('button', { name: 'Connect a different institution' }) + const button = screen.getByRole('button', { name: 'Back' }) expect(button).toBeInTheDocument() button.click() diff --git a/src/views/search/Search.js b/src/views/search/Search.js index 23391f35d4..104c8ebe9f 100644 --- a/src/views/search/Search.js +++ b/src/views/search/Search.js @@ -216,15 +216,22 @@ export const Search = React.forwardRef((_, navigationRef) => { }) // Remove any Unavailable institutions from the popular/discovered lists - const filteredPopularInstitutions = updatedPopularInstitutions.filter( - (popular) => - getInstitutionStatus(popular, unavailableInstitutions) !== - InstitutionStatus.UNAVAILABLE, - ) + const filteredPopularInstitutions = updatedPopularInstitutions.filter((popular) => { + const status = getInstitutionStatus(popular, unavailableInstitutions) + return ( + status !== InstitutionStatus.UNAVAILABLE && + status !== InstitutionStatus.UNAVAILABLE_PER_MX + ) + }) + const filteredDiscoveredInstitutions = updatedDiscoveredInstitutions.filter( - (discovered) => - getInstitutionStatus(discovered, unavailableInstitutions) !== - InstitutionStatus.UNAVAILABLE, + (discovered) => { + const status = getInstitutionStatus(discovered, unavailableInstitutions) + return ( + status !== InstitutionStatus.UNAVAILABLE && + status !== InstitutionStatus.UNAVAILABLE_PER_MX + ) + }, ) return dispatch({ @@ -411,6 +418,8 @@ export const Search = React.forwardRef((_, navigationRef) => { state.popularInstitutions, state.discoveredInstitutions, connectedMembers, + MAX_SUGGESTED_LIST_SIZE, + unavailableInstitutions, ) } onSearchInstitutionClick={() => searchInput.current.focus()} @@ -507,14 +516,22 @@ export const getSuggestedInstitutions = ( discoveredInstitutions, connectedMembers, limit = MAX_SUGGESTED_LIST_SIZE, + unavailableInstitutions = [], ) => { // Combine and dedupe both our institution lists const dedupedList = _unionBy(popularInstitutions, discoveredInstitutions, 'guid') // Remove connected institutions from the list - const filteredConnectedList = dedupedList.filter( - (popular) => !_find(connectedMembers, ['institution_guid', popular.guid]), - ) + // Remove UNAVAILABLE institutions from the list + // Remove UNAVAILABLE_PER_MX institutions from the list + const filteredConnectedList = dedupedList.filter((popular) => { + const status = getInstitutionStatus(popular, unavailableInstitutions) + return ( + !_find(connectedMembers, ['institution_guid', popular.guid]) && + status !== InstitutionStatus.UNAVAILABLE && + status !== InstitutionStatus.UNAVAILABLE_PER_MX + ) + }) // Sort list by popularity (highest to lowest) const sortedList = filteredConnectedList.sort((a, b) => b.popularity - a.popularity) diff --git a/src/views/search/__tests__/Search-test.js b/src/views/search/__tests__/Search-test.js index 42a7881d6f..b3f0edce6c 100644 --- a/src/views/search/__tests__/Search-test.js +++ b/src/views/search/__tests__/Search-test.js @@ -7,6 +7,7 @@ import { SEARCH_PER_PAGE_DEFAULT, SEARCH_PAGE_DEFAULT } from 'src/views/search/c import { __ } from 'src/utilities/Intl' import { ApiProvider } from 'src/context/ApiContext' import { apiValue } from 'src/const/apiProviderMock' +import { InstitutionStatusField } from 'src/utilities/institutionStatus' describe('Search View', () => { describe('Search component', () => { @@ -265,6 +266,25 @@ describe('Search View', () => { expect(searchResult).toEqual(undefined) }) + it('Does not suggest institutions that have the status of unavailable via the API', () => { + const unavailableInstitution = { + guid: 'unavailable-guid', + popularity: 51, + status: InstitutionStatusField.UNAVAILABLE, + } + + const result = getSuggestedInstitutions( + [...popular, unavailableInstitution], + discovered, + [], + EXPECTED_MAX_SIZE, + ) + const searchResult = result.find( + (institution) => institution.guid === unavailableInstitution.guid, + ) + expect(searchResult).toEqual(undefined) + }) + it('Dedupes popular & discovered lists, only includes an institution once', () => { const institution1 = { guid: '1', popularity: 1 } const institution2 = { guid: '2', popularity: 2 } diff --git a/typings/apiTypes.d.ts b/typings/apiTypes.d.ts index 6919ce3f75..c0d664e6a6 100644 --- a/typings/apiTypes.d.ts +++ b/typings/apiTypes.d.ts @@ -125,6 +125,7 @@ type InstitutionResponseType = { account_verification_is_enabled: boolean account_identification_is_enabled: boolean brand_color_hex_code?: string | null + client_status?: number code: string forgot_password_credential_recovery_url?: string | null forgot_username_credential_recovery_url?: string | null @@ -140,6 +141,7 @@ type InstitutionResponseType = { name: string oauth_predirect_instructions?: number[] popularity?: number + status?: number supports_oauth: boolean tax_statement_is_enabled: boolean trouble_signing_credential_recovery_url?: string | null diff --git a/typings/mxTypes.d.ts b/typings/mxTypes.d.ts index eb30575362..6f37fbad0f 100644 --- a/typings/mxTypes.d.ts +++ b/typings/mxTypes.d.ts @@ -66,6 +66,7 @@ type InstitutionResponseType = { account_verification_is_enabled: boolean account_identification_is_enabled: boolean brand_color_hex_code?: string | null + client_status?: number code: string forgot_password_credential_recovery_url?: string | null forgot_username_credential_recovery_url?: string | null @@ -81,6 +82,7 @@ type InstitutionResponseType = { name: string oauth_predirect_instructions?: number[] popularity?: number + status?: number supports_oauth: boolean tax_statement_is_enabled: boolean trouble_signing_credential_recovery_url?: string | null