From 3d414f7a72a10465c805503911b0f9328082e50b Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 11:00:29 -0600 Subject: [PATCH 01/16] loadMemberByGuid and pollMember now take clientLocale --- docs/APIDOCUMENTATION.md | 15 ++++++++------- src/context/ApiContext.tsx | 2 +- src/hooks/useLoadConnect.tsx | 15 +++++++++++---- src/utilities/pollers.js | 4 ++-- src/views/connecting/Connecting.js | 10 ++++++---- src/views/credentials/CreateMemberForm.js | 7 +++++-- src/views/manualAccount/ManualAccountForm.tsx | 7 +++++-- typings/apiTypes.d.ts | 7 +++++++ 8 files changed, 45 insertions(+), 22 deletions(-) diff --git a/docs/APIDOCUMENTATION.md b/docs/APIDOCUMENTATION.md index a814eded00..6110f53156 100644 --- a/docs/APIDOCUMENTATION.md +++ b/docs/APIDOCUMENTATION.md @@ -121,16 +121,17 @@ ##### Parameters -> | name | type | data type | description | -> | ------------ | -------- | --------- | ------------------------ | -> | `memberGuid` | required | string | The specific member guid | +> | name | type | data type | description | +> | -------------- | -------- | --------- | ------------------------- | +> | `memberGuid` | required | string | The specific member guid | +> | `clientLocale` | optional | string | The locale for the widget | ##### Responses -> | http code | content-type | response | -> | --------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -> | `200` | `application/json` | `{"member": { "aggregated_at": "2016-10-13T18:07:57.000Z","background_aggregation_is_disabled": false"connection_status":"CONNECTED","guid": "MBR-123","id": "unique_id","institution_code": "testbank","is_being_aggregated": false,"is_managed_by_user": false,"is_manual": false,"is_oauth": false,"metadata": "\\\"credentials_last_refreshed_at\\\": \\\"2015-10-15\\\"","most_recent_job_detail_code": null,"most_recent_job_detail_text": "","name": "Test Bank","oauth_window_uri": "https://testbank.com/oauth/authorize?client_id=b8OikQ4Ep3NuSUrQ13DdvFuwpNx-qqoAsJDVAQCy&redirect_uri=https%3A%2F%2Ftest.com%2Foauth%2Fredirect_from&response_type=code&scope=openid&state=d745bd4ee6f0f9c184757f574bcc2df2""successfully_aggregated_at": "2016-10-13T17:57:38.000Z","user_guid": "USR-123","user_id": "user123"}}` | -> | `40#` | `application/json` | `{"response": {"status": 40#, "data": {"message": "Test message here"}}}` | +> | http code | content-type | response | +> | --------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +> | `200` | `application/json` | `{"member": { "aggregated_at": "2016-10-13T18:07:57.000Z","background_aggregation_is_disabled": false"connection_status":"CONNECTED", "error": { "error_code": 1000, "error_message": "Test error message.", "error_type": "MEMBER", "locale": "en", "user_message": "Test user message." }, "guid": "MBR-123","id": "unique_id","institution_code": "testbank","is_being_aggregated": false,"is_managed_by_user": false,"is_manual": false,"is_oauth": false,"metadata": "\\\"credentials_last_refreshed_at\\\": \\\"2015-10-15\\\"","most_recent_job_detail_code": null,"most_recent_job_detail_text": "","name": "Test Bank","oauth_window_uri": "https://testbank.com/oauth/authorize?client_id=b8OikQ4Ep3NuSUrQ13DdvFuwpNx-qqoAsJDVAQCy&redirect_uri=https%3A%2F%2Ftest.com%2Foauth%2Fredirect_from&response_type=code&scope=openid&state=d745bd4ee6f0f9c184757f574bcc2df2""successfully_aggregated_at": "2016-10-13T17:57:38.000Z","user_guid": "USR-123","user_id": "user123"}}` | +> | `40#` | `application/json` | `{"response": {"status": 40#, "data": {"message": "Test message here"}}}` | diff --git a/src/context/ApiContext.tsx b/src/context/ApiContext.tsx index bfd2fda85d..684a9a0d55 100644 --- a/src/context/ApiContext.tsx +++ b/src/context/ApiContext.tsx @@ -12,7 +12,7 @@ export type ApiContextTypes = { ) => Promise<{ member: MemberResponseType }> deleteMember: (member: MemberDeleteType) => Promise getMemberCredentials: (memberGuid: string) => Promise - loadMemberByGuid?: (guid: string) => Promise + loadMemberByGuid?: (guid: string, clientLocale: string) => Promise loadMembers: () => Promise updateMember: ( member: object, diff --git a/src/hooks/useLoadConnect.tsx b/src/hooks/useLoadConnect.tsx index 0763ac07f1..f8d4f1fac7 100644 --- a/src/hooks/useLoadConnect.tsx +++ b/src/hooks/useLoadConnect.tsx @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { useEffect, useState, useCallback } from 'react' +import { useEffect, useState, useCallback, useMemo } from 'react' import { useSelector, useDispatch } from 'react-redux' import { from, of, defer } from 'rxjs' import { catchError, mergeMap, map } from 'rxjs/operators' @@ -47,6 +47,9 @@ export const getErrorResource = (err: { config: { url: string | string[] } }) => const useLoadConnect = () => { const { api } = useApi() const profiles = useSelector((state: RootState) => state.profiles) + const clientLocale = useMemo(() => { + return document.querySelector('html')?.getAttribute('lang') || 'en' + }, [document.querySelector('html')?.getAttribute('lang')]) const [config, setConfig] = useState({} as ClientConfigType) const dispatch = useDispatch() @@ -58,7 +61,7 @@ const useLoadConnect = () => { let request$ if (config.current_member_guid) { - request$ = loadConnectFromMemberConfig(config, api) + request$ = loadConnectFromMemberConfig(config, api, clientLocale) } else if (config.current_institution_guid || config.current_institution_code) { request$ = loadConnectFromInstitutionConfig(config, api) } else if (config.mode === VERIFY_MODE && config.current_microdeposit_guid) { @@ -139,8 +142,12 @@ export default useLoadConnect * Load the data for the configured member. Dispatch an error if * member's institution does not support the requested products */ -function loadConnectFromMemberConfig(config: ClientConfigType, api: ApiContextTypes) { - return from(api.loadMemberByGuid!(config.current_member_guid as string)).pipe( +function loadConnectFromMemberConfig( + config: ClientConfigType, + api: ApiContextTypes, + clientLocale: string, +) { + return from(api.loadMemberByGuid!(config.current_member_guid as string, clientLocale)).pipe( mergeMap((member: any) => { return defer(() => api.loadInstitutionByGuid(member.institution_guid)).pipe( map((institution) => { diff --git a/src/utilities/pollers.js b/src/utilities/pollers.js index 0c4ec344a4..7402dc0423 100644 --- a/src/utilities/pollers.js +++ b/src/utilities/pollers.js @@ -26,12 +26,12 @@ export const DEFAULT_POLLING_STATE = { userMessage: CONNECTING_MESSAGES.STARTING, // message to show the end user } -export function pollMember(memberGuid, api, onPostMessage, sendPosthogEvent) { +export function pollMember(memberGuid, api, onPostMessage, sendPosthogEvent, clientLocale) { return interval(3000).pipe( switchMap(() => // Poll the currentMember. Catch errors but don't handle it here // the scan will handle it below - defer(() => api.loadMemberByGuid(memberGuid)).pipe( + defer(() => api.loadMemberByGuid(memberGuid, clientLocale)).pipe( mergeMap((member) => defer(() => api.loadJob(member.most_recent_job_guid)).pipe( map((job) => { diff --git a/src/views/connecting/Connecting.js b/src/views/connecting/Connecting.js index 366892e4c0..8bfc192a2c 100644 --- a/src/views/connecting/Connecting.js +++ b/src/views/connecting/Connecting.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useRef, useContext } from 'react' +import React, { useEffect, useState, useRef, useContext, useMemo } from 'react' import PropTypes from 'prop-types' import { defer, of } from 'rxjs' import { @@ -60,7 +60,9 @@ export const Connecting = (props) => { const selectedInstitution = useSelector(getSelectedInstitution) const sendPosthogEvent = useAnalyticsEvent() - + const clientLocale = useMemo(() => { + return document.querySelector('html')?.getAttribute('lang') || 'en' + }, [document.querySelector('html')?.getAttribute('lang')]) const currentMember = useSelector(getCurrentMember) const isComboJobsEnabled = useSelector(isConnectComboJobsEnabled) const jobSchedule = useSelector((state) => state.connect.jobSchedule) @@ -245,7 +247,7 @@ export const Connecting = (props) => { const startJob$ = defer(() => api.runJob(activeJob?.type, currentMember.guid, connectConfig, true), ).pipe( - mergeMap(() => api.loadMemberByGuid(currentMember.guid)), + mergeMap(() => api.loadMemberByGuid(currentMember.guid, clientLocale)), catchError((error) => { // We control the scenarios of a 409 error (job already running, or member already exists). @@ -268,7 +270,7 @@ export const Connecting = (props) => { }) .pipe( concatMap((member) => - pollMember(member.guid, api, onPostMessage, sendPosthogEvent).pipe( + pollMember(member.guid, api, onPostMessage, sendPosthogEvent, clientLocale).pipe( tap((pollingState) => handleMemberPoll(pollingState)), filter((pollingState) => pollingState.jobIsDone), pluck('currentResponse'), diff --git a/src/views/credentials/CreateMemberForm.js b/src/views/credentials/CreateMemberForm.js index 9f4171dd35..833b7642b7 100644 --- a/src/views/credentials/CreateMemberForm.js +++ b/src/views/credentials/CreateMemberForm.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useContext } from 'react' +import React, { useEffect, useState, useContext, useMemo } from 'react' import PropTypes from 'prop-types' import { defer, of } from 'rxjs' import { catchError, delay, map, mergeMap } from 'rxjs/operators' @@ -32,6 +32,9 @@ export const CreateMemberForm = (props) => { const config = useSelector(selectConfig) const isHuman = useSelector((state) => state.app.humanEvent) const currentMembers = useSelector((state) => state.connect.members) + const clientLocale = useMemo(() => { + return document.querySelector('html')?.getAttribute('lang') || 'en' + }, [document.querySelector('html')?.getAttribute('lang')]) const [isCreatingMember, setIsCreatingMember] = useState(false) const [memberCreateError, setMemberCreateError] = useState(null) @@ -127,7 +130,7 @@ export const CreateMemberForm = (props) => { } }), ) - return defer(() => api.loadMemberByGuid(memberGuid)).pipe( + return defer(() => api.loadMemberByGuid(memberGuid, clientLocale)).pipe( mergeMap((member) => { const shouldStepToMFA = member.connection_status === ReadableStatuses.CHALLENGED return shouldStepToMFA ? stepToMFA$(member) : updateMember$ diff --git a/src/views/manualAccount/ManualAccountForm.tsx b/src/views/manualAccount/ManualAccountForm.tsx index c6f30b789d..c7fb975890 100644 --- a/src/views/manualAccount/ManualAccountForm.tsx +++ b/src/views/manualAccount/ManualAccountForm.tsx @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { MutableRefObject, useEffect, useState, useRef } from 'react' +import React, { MutableRefObject, useEffect, useState, useRef, useMemo } from 'react' import { useSelector, useDispatch } from 'react-redux' import { from, of, zip, defer } from 'rxjs' @@ -51,6 +51,9 @@ export const ManualAccountForm = React.forwardRef { + return document.querySelector('html')?.getAttribute('lang') || 'en' + }, [document.querySelector('html')?.getAttribute('lang')]) const [saving, setSaving] = useState(false) const [isPersonal, setIsPersonal] = useState(true) const [returnField, setReturnField] = useState(null) @@ -168,7 +171,7 @@ export const ManualAccountForm = React.forwardRef { diff --git a/typings/apiTypes.d.ts b/typings/apiTypes.d.ts index 8109a4fd05..ee10e144bf 100644 --- a/typings/apiTypes.d.ts +++ b/typings/apiTypes.d.ts @@ -81,6 +81,13 @@ type MemberDeleteType = { type MemberResponseType = { aggregation_status: number connection_status: number + error: { + error_code: number + error_message: string + error_type: string + locale: string + user_message: string + } guid: string institution_guid: string institution_name?: string | null From f7ac8da4adb51e799abc26949c434f9bdec666f9 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 11:54:10 -0600 Subject: [PATCH 02/16] Added clientLocale to loadMembers and loadMemberByGuid --- docs/APIDOCUMENTATION.md | 20 +++++++++++++------- src/context/ApiContext.tsx | 2 +- src/hooks/useLoadConnect.tsx | 2 +- src/services/mockedData.ts | 1 + typings/apiTypes.d.ts | 2 +- typings/mxTypes.d.ts | 7 +++++++ 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/docs/APIDOCUMENTATION.md b/docs/APIDOCUMENTATION.md index 6110f53156..ba46953af9 100644 --- a/docs/APIDOCUMENTATION.md +++ b/docs/APIDOCUMENTATION.md @@ -97,24 +97,30 @@ --- -#### loadMembers() +#### loadMembers(clientLocale)
Returns an array of members associated with a specific user +##### Parameters + +> | name | type | data type | description | +> | -------------- | -------- | --------- | ------------------------- | +> | `clientLocale` | optional | string | The locale for the widget | + ##### Responses -> | http code | content-type | response | -> | ------------------ | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -> | `200` | `application/json` | `{"members": [{ "aggregated_at": "2016-10-13T18:07:57.000Z","background_aggregation_is_disabled": false"connection_status":"CONNECTED","guid": "MBR-123","id": "unique_id","institution_code": "testbank","is_being_aggregated": false,"is_managed_by_user": false,"is_manual": false,"is_oauth": false,"metadata": "\\\"credentials_last_refreshed_at\\\": \\\"2015-10-15\\\"","most_recent_job_detail_code": null,"most_recent_job_detail_text": "","name": "Test Bank","oauth_window_uri": "https://testbank.com/oauth/authorize?client_id=b8OikQ4Ep3NuSUrQ13DdvFuwpNx-qqoAsJDVAQCy&redirect_uri=https%3A%2F%2Ftest.com%2Foauth%2Fredirect_from&response_type=code&scope=openid&state=d745bd4ee6f0f9c184757f574bcc2df2""successfully_aggregated_at": "2016-10-13T17:57:38.000Z","user_guid": "USR-123","user_id": "user123"}]}` | -> | `40#` | `application/json` | `{"response": {"status": 40#, "data": {}}}` | -> | `VerifyNotEnabled` | `application/json` | `instanceof Error + {"entity_type": "member", "name": "VerifyNotEnabled", "message": "This connection doesn't support verification."}` | +> | http code | content-type | response | +> | ------------------ | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +> | `200` | `application/json` | `{"members": [{ "aggregated_at": "2016-10-13T18:07:57.000Z","background_aggregation_is_disabled": false"connection_status":"CONNECTED", "error": { "error_code": 1000, "error_message": "Test error message.", "error_type": "MEMBER", "locale": "en", "user_message": "Test user message." }, "guid": "MBR-123","id": "unique_id","institution_code": "testbank","is_being_aggregated": false,"is_managed_by_user": false,"is_manual": false,"is_oauth": false,"metadata": "\\\"credentials_last_refreshed_at\\\": \\\"2015-10-15\\\"","most_recent_job_detail_code": null,"most_recent_job_detail_text": "","name": "Test Bank","oauth_window_uri": "https://testbank.com/oauth/authorize?client_id=b8OikQ4Ep3NuSUrQ13DdvFuwpNx-qqoAsJDVAQCy&redirect_uri=https%3A%2F%2Ftest.com%2Foauth%2Fredirect_from&response_type=code&scope=openid&state=d745bd4ee6f0f9c184757f574bcc2df2""successfully_aggregated_at": "2016-10-13T17:57:38.000Z","user_guid": "USR-123","user_id": "user123"}]}` | +> | `40#` | `application/json` | `{"response": {"status": 40#, "data": {}}}` | +> | `VerifyNotEnabled` | `application/json` | `instanceof Error + {"entity_type": "member", "name": "VerifyNotEnabled", "message": "This connection doesn't support verification."}` |
--- -#### loadMemberByGuid(memberGuid) +#### loadMemberByGuid(memberGuid, clientLocale)
Returns a specific member by its guid diff --git a/src/context/ApiContext.tsx b/src/context/ApiContext.tsx index 684a9a0d55..0eb34dcb65 100644 --- a/src/context/ApiContext.tsx +++ b/src/context/ApiContext.tsx @@ -13,7 +13,7 @@ export type ApiContextTypes = { deleteMember: (member: MemberDeleteType) => Promise getMemberCredentials: (memberGuid: string) => Promise loadMemberByGuid?: (guid: string, clientLocale: string) => Promise - loadMembers: () => Promise + loadMembers: (clientLocale: string) => Promise updateMember: ( member: object, config: ClientConfigType, diff --git a/src/hooks/useLoadConnect.tsx b/src/hooks/useLoadConnect.tsx index f8d4f1fac7..fee33597a5 100644 --- a/src/hooks/useLoadConnect.tsx +++ b/src/hooks/useLoadConnect.tsx @@ -74,7 +74,7 @@ const useLoadConnect = () => { .pipe( mergeMap((dependencies) => { if (clientSupportRequestedProducts(config, profiles.clientProfile)) { - return from(api.loadMembers()).pipe( + return from(api.loadMembers(clientLocale)).pipe( map((members) => loadConnectSuccess({ members, diff --git a/src/services/mockedData.ts b/src/services/mockedData.ts index 7a65a46f39..cad138f685 100644 --- a/src/services/mockedData.ts +++ b/src/services/mockedData.ts @@ -126,6 +126,7 @@ export const member = { member: { aggregation_status: 0, connection_status: 0, + error: null, guid: 'MBR-123', institution_guid: 'INS-123', institution_name: null, diff --git a/typings/apiTypes.d.ts b/typings/apiTypes.d.ts index ee10e144bf..5dd8f027d4 100644 --- a/typings/apiTypes.d.ts +++ b/typings/apiTypes.d.ts @@ -81,7 +81,7 @@ type MemberDeleteType = { type MemberResponseType = { aggregation_status: number connection_status: number - error: { + error?: { error_code: number error_message: string error_type: string diff --git a/typings/mxTypes.d.ts b/typings/mxTypes.d.ts index 535cf86ba6..589e2d8b55 100644 --- a/typings/mxTypes.d.ts +++ b/typings/mxTypes.d.ts @@ -22,6 +22,13 @@ type MemberDeleteType = { type MemberResponseType = { aggregation_status: number connection_status: number + error?: { + error_code: number + error_message: string + error_type: string + locale: string + user_message: string + } guid: string institution_guid: string institution_name?: string | null From ef075255ca9af37a857bc4e06039b11e992aa361 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 13:31:29 -0600 Subject: [PATCH 03/16] For ActionableError we now use error object instead of most_recent_job_detail_code --- src/components/RenderConnectStep.js | 2 +- src/redux/reducers/Connect.js | 5 ++--- src/redux/reducers/__tests__/Connect-test.js | 9 ++++++++- src/views/actionableError/ActionableError.tsx | 9 ++------- .../__tests__/ActionableError-test.tsx | 14 ++++++++++---- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/components/RenderConnectStep.js b/src/components/RenderConnectStep.js index 709c99d5cf..229955344e 100644 --- a/src/components/RenderConnectStep.js +++ b/src/components/RenderConnectStep.js @@ -292,7 +292,7 @@ const RenderConnectStep = (props) => { ) } else if (step === STEPS.ACTIONABLE_ERROR) { // We are slowly adding codes and statuses to use ActionableError instead of LoginError. - const jobDetailCode = currentMember?.most_recent_job_detail_code ?? null + const errorCode = currentMember?.error?.error_code ?? null connectStepView = canHandleActionableError(jobDetailCode) ? ( ) : ( diff --git a/src/redux/reducers/Connect.js b/src/redux/reducers/Connect.js index e89ae311da..3750a938de 100644 --- a/src/redux/reducers/Connect.js +++ b/src/redux/reducers/Connect.js @@ -66,7 +66,7 @@ const loadConnectSuccess = (state, action) => { selectedInstitution: institution, updateCredentials: member?.connection_status === ReadableStatuses.DENIED || state.updateCredentials, - members, + members: upsertMember(state, { payload: member }), } } @@ -518,8 +518,7 @@ function getStepFromMember(member) { const connection_status = member.connection_status if ( - (member?.most_recent_job_detail_code && - canHandleActionableError(member?.most_recent_job_detail_code)) || + (member?.error?.error_code && canHandleActionableError(member?.error?.error_code)) || hasNoSingleAccountSelectOptions(member) ) // They configured connect with a member in error or missing SAS options. diff --git a/src/redux/reducers/__tests__/Connect-test.js b/src/redux/reducers/__tests__/Connect-test.js index 6cf64e744f..3205a189b3 100644 --- a/src/redux/reducers/__tests__/Connect-test.js +++ b/src/redux/reducers/__tests__/Connect-test.js @@ -404,13 +404,20 @@ describe('Connect redux store', () => { STEPS.ACTIONABLE_ERROR, ) }) + // TODO: Key test here it('should load connect in ACTIONABLE_ERROR step if it is a member with no dda accounts', () => { const config = { mode: VERIFY_MODE, current_member_guid: 'MBR-1' } const member = { connection_status: ReadableStatuses.CONNECTED, + error: { + error_code: 1000, + error_message: 'Test', + error_type: 'MEMBER', + locale: 'en', + user_message: 'Test', + }, is_oauth: false, guid: 'MBR-1', - most_recent_job_detail_code: 1000, } const members = [member] const afterState = reducer( diff --git a/src/views/actionableError/ActionableError.tsx b/src/views/actionableError/ActionableError.tsx index dbdac4fedf..2cfc752380 100644 --- a/src/views/actionableError/ActionableError.tsx +++ b/src/views/actionableError/ActionableError.tsx @@ -19,7 +19,7 @@ export const ActionableError = () => { const institution = useSelector((state: RootState) => state.connect.selectedInstitution) const currentMember = useSelector(getCurrentMember) const initialConfig = useSelector(selectInitialConfig) - const jobDetailCode = currentMember.most_recent_job_detail_code + const jobDetailCode = currentMember.error.error_code const tokens = useTokens() const styles = getStyles(tokens) const getNextDelay = getDelay() @@ -30,11 +30,6 @@ export const ActionableError = () => { () => ({ [ACTIONABLE_ERROR_CODES.NO_ELIGIBLE_ACCOUNTS]: { title: __('No eligible accounts'), - userMessage: (institution: InstitutionResponseType) => - __( - 'Only checking or savings accounts can be used for transfers. If you have one at %1, make sure to select it when connecting. Otherwise, try connecting a different institution.', - institution.name, - ), primaryAction: { label: __('Log in again'), action: () => dispatch({ type: ActionTypes.ACTIONABLE_ERROR_LOG_IN_AGAIN }), @@ -95,7 +90,7 @@ export const ActionableError = () => { truncate={false} variant="Paragraph" > - {messagingMap[jobDetailCode].userMessage(institution)} + {currentMember.error.user_message} diff --git a/src/views/actionableError/__tests__/ActionableError-test.tsx b/src/views/actionableError/__tests__/ActionableError-test.tsx index 1da8cc5582..1a47d3ec82 100644 --- a/src/views/actionableError/__tests__/ActionableError-test.tsx +++ b/src/views/actionableError/__tests__/ActionableError-test.tsx @@ -4,7 +4,6 @@ import { render, screen } from 'src/utilities/testingLibrary' import { ActionableError } from 'src/views/actionableError/ActionableError' import { initialState as defaultState } from 'src/services/mockedData' import { STEPS } from 'src/const/Connect' -import { ACTIONABLE_ERROR_CODES } from '../consts' const institutionMock = { name: 'Institution', @@ -13,13 +12,20 @@ const institutionMock = { const membersMock = [ { guid: 'MEM-123', + error: { + error_code: 1000, + error_message: 'This Member has no eligible checking, savings, or money market accounts.', + error_type: 'MEMBER', + locale: 'en', + user_message: + "We couldn't find any accounts eligible for transfers. Please link a checking or savings account.", + }, name: 'Member', - most_recent_job_detail_code: ACTIONABLE_ERROR_CODES.NO_ELIGIBLE_ACCOUNTS, }, { guid: 'MEM-456', + error: null, name: 'Member', - most_recent_job_detail_code: null, }, ] @@ -54,7 +60,7 @@ describe('ActionableError', () => { expect(screen.getByText('No eligible accounts')).toBeInTheDocument() expect( screen.getByText( - `Only checking or savings accounts can be used for transfers. If you have one at ${institutionMock.name}, make sure to select it when connecting. Otherwise, try connecting a different institution.`, + "We couldn't find any accounts eligible for transfers. Please link a checking or savings account.", ), ).toBeInTheDocument() }) From 9837825de77ef099955b0306b1874b99ba5ebbb7 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 13:31:47 -0600 Subject: [PATCH 04/16] Cleaned up translations 1374 --- src/const/language/es.json | 1 - src/const/language/es.po | 15 +++-------- src/const/language/frCa.json | 4 +-- src/const/language/frCa.po | 48 +++++++++++++++++++++++++++--------- 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/const/language/es.json b/src/const/language/es.json index 559160ca55..9e60f47317 100644 --- a/src/const/language/es.json +++ b/src/const/language/es.json @@ -394,7 +394,6 @@ "Log in again": "Inicie sesión nuevamente", "Connect a different institution": "Conecte una institución diferente", "No eligible accounts": "No hay cuentas elegibles", - "Only checking or savings accounts can be used for transfers. If you have one at %1, make sure to select it when connecting. Otherwise, try connecting a different institution.": "Solo se pueden usar cuentas de control o ahorro para transferencias. Si tiene uno en %1, asegúrese de seleccionarlo al conectarlo. De lo contrario, intente conectar una institución diferente.", "Required": "Requerido", "Add financial management?": "¿Añadir gestión financiera?", "Yes, add financial management": "Sí, añadir gestión financiera", diff --git a/src/const/language/es.po b/src/const/language/es.po index f8d854b9d2..8b981169ec 100644 --- a/src/const/language/es.po +++ b/src/const/language/es.po @@ -1964,18 +1964,9 @@ msgstr "Conecte una institución diferente" msgid "No eligible accounts" msgstr "No hay cuentas elegibles" -#: src/views/actionableError/ActionableError.tsx -msgid "" -"Only checking or savings accounts can be used for transfers. If you have one " -"at %1, make sure to select it when connecting. Otherwise, try connecting a " -"different institution." -msgstr "" -"Solo se pueden usar cuentas de control o ahorro para transferencias. Si " -"tiene uno en %1, asegúrese de seleccionarlo al conectarlo. De lo contrario, " -"intente conectar una institución diferente." - -#: src/components/DeleteMemberSurvey.js src/components/RequiredFieldNote.tsx -#: src/views/mfa/MFAOptions.js +#: src/components/DeleteMemberSurvey.js src/views/mfa/MFAOptions.js +#: src/views/microdeposits/PersonalInfoForm.js +#: src/views/microdeposits/RoutingNumber.js msgid "Required" msgstr "Requerido" diff --git a/src/const/language/frCa.json b/src/const/language/frCa.json index ffb106f914..1fb2b0750c 100644 --- a/src/const/language/frCa.json +++ b/src/const/language/frCa.json @@ -387,7 +387,6 @@ "Send feedback": "Envoyer des commentaires", "Give feedback": "Donnez votre avis", "Close": "Fermer", - "Disconnect institution": "Déconnecter l'institution", "Mode not enabled": "Mode non activé", "This mode isn’t available in your current plan. Please contact your representative to explore options.": "Ce mode n'est pas disponible avec votre forfait actuel. Veuillez contacter votre représentant pour explorer les options.", "Feature not available": "Fonctionnalité non disponible", @@ -395,12 +394,13 @@ "Log in again": "Connectez-vous à nouveau", "Connect a different institution": "Mettre en relation un autre établissement", "No eligible accounts": "Aucun compte admissible", - "Only checking or savings accounts can be used for transfers. If you have one at %1, make sure to select it when connecting. Otherwise, try connecting a different institution.": "Seuls les comptes chèques ou d’épargne peuvent être utilisés pour les transferts. Si vous en avez un à %1, assurez-vous de le sélectionner lors de la connexion. Sinon, essayez de connecter une autre institution.", "Required": "Requis", "Add financial management?": "Ajouter la gestion financière ?", + "You are connecting this account for payments and transfers. Would you also like to connect it for financial management to track income and spending?": "Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous également le connecter pour la gestion financière afin de suivre vos revenus et vos dépenses ?", "Yes, add financial management": "Oui, ajoutez la gestion financière", "No, just transfers and payment": "Non, juste des virements et des paiements", "Add transfers and payments?": "Ajouter des transferts et des paiements ?", + "You are connecting this account for financial management. Would you also like to connect it for transfers and payments to quickly move money to and from this institution?": "Vous connectez ce compte pour la gestion financière. Souhaitez-vous également le connecter pour effectuer des virements et des paiements afin de transférer rapidement des fonds vers et depuis cette institution ?", "Yes, add transfers and payments": "Oui, ajouter des transferts et des paiements", "Select an account to connect": "Sélectionnez un compte pour vous connecter", "You're connecting this account for payments and transfers. Would you like to also enable financial management so you can track your income and spending?": "Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous également activer la gestion financière afin de suivre vos revenus et vos dépenses ?", diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index 350e9c54e3..87af8687d6 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2000,10 +2000,6 @@ msgstr "Donnez votre avis" msgid "Close" msgstr "Fermer" -#: src/components/DeleteMemberSurvey.js -msgid "Disconnect institution" -msgstr "Déconnecter l'institution" - #: src/hooks/useLoadConnect.tsx msgid "Mode not enabled" msgstr "Mode non activé" @@ -2040,15 +2036,45 @@ msgstr "Mettre en relation un autre établissement" msgid "No eligible accounts" msgstr "Aucun compte admissible" -#: src/views/actionableError/ActionableError.tsx +#: src/components/DeleteMemberSurvey.js src/views/mfa/MFAOptions.js +#: src/views/microdeposits/PersonalInfoForm.js +#: src/views/microdeposits/RoutingNumber.js +msgid "Required" +msgstr "Requis" + +#: src/views/additionalProduct/AdditionalProductStep.tsx +msgid "Add financial management?" +msgstr "Ajouter la gestion financière ?" + +#: src/views/additionalProduct/AdditionalProductStep.tsx +msgid "" +"You are connecting this account for payments and transfers. Would you also " +"like to connect it for financial management to track income and spending?" +msgstr "" +"Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous " +"également le connecter pour la gestion financière afin de suivre vos revenus " +"et vos dépenses ?" + +#: src/views/additionalProduct/AdditionalProductStep.tsx +msgid "Yes, add financial management" +msgstr "Oui, ajoutez la gestion financière" + +msgid "No, just transfers and payment" +msgstr "Non, juste des virements et des paiements" + +#: src/views/additionalProduct/AdditionalProductStep.tsx +msgid "Add transfers and payments?" +msgstr "Ajouter des transferts et des paiements ?" + +#: src/views/additionalProduct/AdditionalProductStep.tsx msgid "" -"Only checking or savings accounts can be used for transfers. If you have one " -"at %1, make sure to select it when connecting. Otherwise, try connecting a " -"different institution." +"You are connecting this account for financial management. Would you also " +"like to connect it for transfers and payments to quickly move money to and " +"from this institution?" msgstr "" -"Seuls les comptes chèques ou d’épargne peuvent être utilisés pour les " -"transferts. Si vous en avez un à %1, assurez-vous de le sélectionner lors de " -"la connexion. Sinon, essayez de connecter une autre institution." +"Vous connectez ce compte pour la gestion financière. Souhaitez-vous " +"également le connecter pour effectuer des virements et des paiements afin de " +"transférer rapidement des fonds vers et depuis cette institution ?" #: src/components/DeleteMemberSurvey.js src/components/RequiredFieldNote.tsx #: src/views/mfa/MFAOptions.js From 66623842e70892db825602d0d91e51dd0f72594b Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 14:04:28 -0600 Subject: [PATCH 05/16] refactor: actionableError now reads from member.error object for user message ActionableError used to read member.most_recent_job_detail_code. We now read member.error which includes the code, user message, etc. The user message also comes back translated based off the "Accept-Language" header when hitting the GET member(s) endpoints. BREAKING CHANGE: ActionableError is reading an new field from the API. Consumers will need to update their API to provide this new field before updating. --- src/const/language/frCa.po | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index 87af8687d6..c183a9e796 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2000,6 +2000,10 @@ msgstr "Donnez votre avis" msgid "Close" msgstr "Fermer" +#: src/components/DeleteMemberSurvey.js +msgid "Disconnect institution" +msgstr "Desconectar institución" + #: src/hooks/useLoadConnect.tsx msgid "Mode not enabled" msgstr "Mode non activé" From 673e264cf19473ec6a36da36fc4e6e6b7b2f21a0 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 14:07:58 -0600 Subject: [PATCH 06/16] Updated translations --- src/const/language/frCa.json | 1 + src/const/language/frCa.po | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/const/language/frCa.json b/src/const/language/frCa.json index 1fb2b0750c..a34a8cf657 100644 --- a/src/const/language/frCa.json +++ b/src/const/language/frCa.json @@ -387,6 +387,7 @@ "Send feedback": "Envoyer des commentaires", "Give feedback": "Donnez votre avis", "Close": "Fermer", + "Disconnect institution": "Déconnecter l'institution", "Mode not enabled": "Mode non activé", "This mode isn’t available in your current plan. Please contact your representative to explore options.": "Ce mode n'est pas disponible avec votre forfait actuel. Veuillez contacter votre représentant pour explorer les options.", "Feature not available": "Fonctionnalité non disponible", diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index c183a9e796..62f2d23a61 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2002,7 +2002,7 @@ msgstr "Fermer" #: src/components/DeleteMemberSurvey.js msgid "Disconnect institution" -msgstr "Desconectar institución" +msgstr "Déconnecter l'institution" #: src/hooks/useLoadConnect.tsx msgid "Mode not enabled" From cbe1fa1ab579d6bc1e0d76cf6d910ac82e8d4801 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 14:15:04 -0600 Subject: [PATCH 07/16] Updated loadMember(s) params --- src/context/ApiContext.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/context/ApiContext.tsx b/src/context/ApiContext.tsx index 0eb34dcb65..f08bf99116 100644 --- a/src/context/ApiContext.tsx +++ b/src/context/ApiContext.tsx @@ -12,8 +12,8 @@ export type ApiContextTypes = { ) => Promise<{ member: MemberResponseType }> deleteMember: (member: MemberDeleteType) => Promise getMemberCredentials: (memberGuid: string) => Promise - loadMemberByGuid?: (guid: string, clientLocale: string) => Promise - loadMembers: (clientLocale: string) => Promise + loadMemberByGuid?: (guid: string, clientLocale?: string) => Promise + loadMembers: (clientLocale?: string) => Promise updateMember: ( member: object, config: ClientConfigType, From f016d8c2ca77a294747347aa1493d0e1abbf370c Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 15:35:58 -0600 Subject: [PATCH 08/16] Added default members array --- src/hooks/useLoadConnect.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useLoadConnect.tsx b/src/hooks/useLoadConnect.tsx index fee33597a5..d2e17724b7 100644 --- a/src/hooks/useLoadConnect.tsx +++ b/src/hooks/useLoadConnect.tsx @@ -75,7 +75,7 @@ const useLoadConnect = () => { mergeMap((dependencies) => { if (clientSupportRequestedProducts(config, profiles.clientProfile)) { return from(api.loadMembers(clientLocale)).pipe( - map((members) => + map((members = []) => loadConnectSuccess({ members, widgetProfile: profiles.widgetProfile, From 26f9a2553842481625984158d5d15abfcddc98a6 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 15:38:23 -0600 Subject: [PATCH 09/16] Only upsert member if one exists --- src/redux/reducers/Connect.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/redux/reducers/Connect.js b/src/redux/reducers/Connect.js index 3750a938de..deab3ead0e 100644 --- a/src/redux/reducers/Connect.js +++ b/src/redux/reducers/Connect.js @@ -66,7 +66,8 @@ const loadConnectSuccess = (state, action) => { selectedInstitution: institution, updateCredentials: member?.connection_status === ReadableStatuses.DENIED || state.updateCredentials, - members: upsertMember(state, { payload: member }), + members: member ? upsertMember({ members }, { payload: member }) : members, // This is a temporary work around until CT-1552 is fixed. + // members // Remove above line and revert to this line when CT-1552 is fixed. } } From 4924ccee57afaf7bba6266471e77537e7a3ab042 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 27 May 2025 15:40:11 -0600 Subject: [PATCH 10/16] Removed dev comment --- src/redux/reducers/Connect.js | 2 +- src/redux/reducers/__tests__/Connect-test.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/redux/reducers/Connect.js b/src/redux/reducers/Connect.js index deab3ead0e..bc6eaf0001 100644 --- a/src/redux/reducers/Connect.js +++ b/src/redux/reducers/Connect.js @@ -45,7 +45,7 @@ const loadConnect = (state, { payload }) => { const loadConnectSuccess = (state, action) => { const { - members, + members = [], member, microdeposit, config = {}, diff --git a/src/redux/reducers/__tests__/Connect-test.js b/src/redux/reducers/__tests__/Connect-test.js index 3205a189b3..d3709b5b33 100644 --- a/src/redux/reducers/__tests__/Connect-test.js +++ b/src/redux/reducers/__tests__/Connect-test.js @@ -404,7 +404,6 @@ describe('Connect redux store', () => { STEPS.ACTIONABLE_ERROR, ) }) - // TODO: Key test here it('should load connect in ACTIONABLE_ERROR step if it is a member with no dda accounts', () => { const config = { mode: VERIFY_MODE, current_member_guid: 'MBR-1' } const member = { From 1a5970360f23c3477f3a369c9a47606c6c8ac434 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Mon, 23 Jun 2025 08:29:05 -0600 Subject: [PATCH 11/16] Updated translations --- src/const/language/es.po | 5 ++--- src/const/language/frCa.json | 6 +----- src/const/language/frCa.po | 35 ++--------------------------------- 3 files changed, 5 insertions(+), 41 deletions(-) diff --git a/src/const/language/es.po b/src/const/language/es.po index 8b981169ec..168719c465 100644 --- a/src/const/language/es.po +++ b/src/const/language/es.po @@ -1964,9 +1964,8 @@ msgstr "Conecte una institución diferente" msgid "No eligible accounts" msgstr "No hay cuentas elegibles" -#: src/components/DeleteMemberSurvey.js src/views/mfa/MFAOptions.js -#: src/views/microdeposits/PersonalInfoForm.js -#: src/views/microdeposits/RoutingNumber.js +#: src/components/DeleteMemberSurvey.js src/components/RequiredFieldNote.tsx +#: src/views/mfa/MFAOptions.js msgid "Required" msgstr "Requerido" diff --git a/src/const/language/frCa.json b/src/const/language/frCa.json index a34a8cf657..bd6b201883 100644 --- a/src/const/language/frCa.json +++ b/src/const/language/frCa.json @@ -399,15 +399,11 @@ "Add financial management?": "Ajouter la gestion financière ?", "You are connecting this account for payments and transfers. Would you also like to connect it for financial management to track income and spending?": "Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous également le connecter pour la gestion financière afin de suivre vos revenus et vos dépenses ?", "Yes, add financial management": "Oui, ajoutez la gestion financière", - "No, just transfers and payment": "Non, juste des virements et des paiements", "Add transfers and payments?": "Ajouter des transferts et des paiements ?", "You are connecting this account for financial management. Would you also like to connect it for transfers and payments to quickly move money to and from this institution?": "Vous connectez ce compte pour la gestion financière. Souhaitez-vous également le connecter pour effectuer des virements et des paiements afin de transférer rapidement des fonds vers et depuis cette institution ?", + "No, just transfers and payment": "Non, juste des virements et des paiements", "Yes, add transfers and payments": "Oui, ajouter des transferts et des paiements", "Select an account to connect": "Sélectionnez un compte pour vous connecter", - "You're connecting this account for payments and transfers. Would you like to also enable financial management so you can track your income and spending?": "Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous également activer la gestion financière afin de suivre vos revenus et vos dépenses ?", - "No, only add transfers and payments": "Non, ajoutez uniquement les virements et les paiements", - "You're connecting this account for financial management. Would you like to also enable transfers and payments so you can quickly move money to and from this institution?": "Vous connectez ce compte à des fins de gestion financière. Souhaitez-vous également activer les virements et les paiements afin de transférer rapidement de l'argent vers et depuis cette institution ?", - "No, only add financial management": "Non, ajoutez uniquement la gestion financière", "connect/disclosure/policy/text\u0004By clicking Continue, you agree to the ": "En cliquant sur Continuer, vous acceptez la ", "connect/disclosure/policy/link\u0004MX Privacy Policy.": "Politique de confidentialité de MX.", "connect/disclosure/policy/link\u0004MX Privacy Policy": "Politique de confidentialité de MX.", diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index 62f2d23a61..b156398211 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2040,9 +2040,8 @@ msgstr "Mettre en relation un autre établissement" msgid "No eligible accounts" msgstr "Aucun compte admissible" -#: src/components/DeleteMemberSurvey.js src/views/mfa/MFAOptions.js -#: src/views/microdeposits/PersonalInfoForm.js -#: src/views/microdeposits/RoutingNumber.js +#: src/components/DeleteMemberSurvey.js src/components/RequiredFieldNote.tsx +#: src/views/mfa/MFAOptions.js msgid "Required" msgstr "Requis" @@ -2063,9 +2062,6 @@ msgstr "" msgid "Yes, add financial management" msgstr "Oui, ajoutez la gestion financière" -msgid "No, just transfers and payment" -msgstr "Non, juste des virements et des paiements" - #: src/views/additionalProduct/AdditionalProductStep.tsx msgid "Add transfers and payments?" msgstr "Ajouter des transferts et des paiements ?" @@ -2107,30 +2103,3 @@ msgstr "Oui, ajouter des transferts et des paiements" #: src/views/mfa/MFAOptions.js msgid "Select an account to connect" msgstr "Sélectionnez un compte pour vous connecter" - -#: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "" -"You're connecting this account for payments and transfers. Would you like to " -"also enable financial management so you can track your income and spending?" -msgstr "" -"Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous " -"également activer la gestion financière afin de suivre vos revenus et vos " -"dépenses ?" - -#: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "No, only add transfers and payments" -msgstr "Non, ajoutez uniquement les virements et les paiements" - -#: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "" -"You're connecting this account for financial management. Would you like to " -"also enable transfers and payments so you can quickly move money to and from " -"this institution?" -msgstr "" -"Vous connectez ce compte à des fins de gestion financière. Souhaitez-vous " -"également activer les virements et les paiements afin de transférer " -"rapidement de l'argent vers et depuis cette institution ?" - -#: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "No, only add financial management" -msgstr "Non, ajoutez uniquement la gestion financière" From d85a66e5d59f1ac5c9973768f4c229564b055e63 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Mon, 23 Jun 2025 08:30:46 -0600 Subject: [PATCH 12/16] Minor fix in translation --- src/const/language/frCa.po | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index b156398211..999c6d1aee 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2103,3 +2103,7 @@ msgstr "Oui, ajouter des transferts et des paiements" #: src/views/mfa/MFAOptions.js msgid "Select an account to connect" msgstr "Sélectionnez un compte pour vous connecter" + +#: src/views/additionalProduct/AdditionalProductStep.tsx +msgid "No, just financial management" +msgstr "Non, juste la gestion financière" From 192adb19b6e16c0fadf262d06d2b208587a2570a Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Mon, 23 Jun 2025 08:32:44 -0600 Subject: [PATCH 13/16] One more translation fix --- src/const/language/frCa.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index 999c6d1aee..66715b6bea 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2100,10 +2100,10 @@ msgstr "Ajouter des transferts et des paiements ?" msgid "Yes, add transfers and payments" msgstr "Oui, ajouter des transferts et des paiements" -#: src/views/mfa/MFAOptions.js -msgid "Select an account to connect" -msgstr "Sélectionnez un compte pour vous connecter" - #: src/views/additionalProduct/AdditionalProductStep.tsx msgid "No, just financial management" msgstr "Non, juste la gestion financière" + +#: src/views/mfa/MFAOptions.js +msgid "Select an account to connect" +msgstr "Sélectionnez un compte pour vous connecter" From 04bf8f202c7ab016756bda84251c7aa1a771ba5f Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Mon, 23 Jun 2025 10:12:44 -0600 Subject: [PATCH 14/16] Fixed typo in name change --- src/components/RenderConnectStep.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/RenderConnectStep.js b/src/components/RenderConnectStep.js index 229955344e..9a5ba14e34 100644 --- a/src/components/RenderConnectStep.js +++ b/src/components/RenderConnectStep.js @@ -293,7 +293,7 @@ const RenderConnectStep = (props) => { } else if (step === STEPS.ACTIONABLE_ERROR) { // We are slowly adding codes and statuses to use ActionableError instead of LoginError. const errorCode = currentMember?.error?.error_code ?? null - connectStepView = canHandleActionableError(jobDetailCode) ? ( + connectStepView = canHandleActionableError(errorCode) ? ( ) : ( Date: Mon, 14 Jul 2025 10:08:03 -0600 Subject: [PATCH 15/16] Fixed translation conflicts --- src/const/language/frCa.json | 7 ++-- src/const/language/frCa.po | 62 +++++++++++++----------------------- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/const/language/frCa.json b/src/const/language/frCa.json index bd6b201883..5e5d916fa3 100644 --- a/src/const/language/frCa.json +++ b/src/const/language/frCa.json @@ -397,13 +397,14 @@ "No eligible accounts": "Aucun compte admissible", "Required": "Requis", "Add financial management?": "Ajouter la gestion financière ?", - "You are connecting this account for payments and transfers. Would you also like to connect it for financial management to track income and spending?": "Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous également le connecter pour la gestion financière afin de suivre vos revenus et vos dépenses ?", "Yes, add financial management": "Oui, ajoutez la gestion financière", "Add transfers and payments?": "Ajouter des transferts et des paiements ?", - "You are connecting this account for financial management. Would you also like to connect it for transfers and payments to quickly move money to and from this institution?": "Vous connectez ce compte pour la gestion financière. Souhaitez-vous également le connecter pour effectuer des virements et des paiements afin de transférer rapidement des fonds vers et depuis cette institution ?", - "No, just transfers and payment": "Non, juste des virements et des paiements", "Yes, add transfers and payments": "Oui, ajouter des transferts et des paiements", "Select an account to connect": "Sélectionnez un compte pour vous connecter", + "You're connecting this account for payments and transfers. Would you like to also enable financial management so you can track your income and spending?": "Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous également activer la gestion financière afin de suivre vos revenus et vos dépenses ?", + "No, only add transfers and payments": "Non, ajoutez uniquement les virements et les paiements", + "You're connecting this account for financial management. Would you like to also enable transfers and payments so you can quickly move money to and from this institution?": "Vous connectez ce compte à des fins de gestion financière. Souhaitez-vous également activer les virements et les paiements afin de transférer rapidement de l'argent vers et depuis cette institution ?", + "No, only add financial management": "Non, ajoutez uniquement la gestion financière", "connect/disclosure/policy/text\u0004By clicking Continue, you agree to the ": "En cliquant sur Continuer, vous acceptez la ", "connect/disclosure/policy/link\u0004MX Privacy Policy.": "Politique de confidentialité de MX.", "connect/disclosure/policy/link\u0004MX Privacy Policy": "Politique de confidentialité de MX.", diff --git a/src/const/language/frCa.po b/src/const/language/frCa.po index 66715b6bea..2033e79cf4 100644 --- a/src/const/language/frCa.po +++ b/src/const/language/frCa.po @@ -2049,15 +2049,6 @@ msgstr "Requis" msgid "Add financial management?" msgstr "Ajouter la gestion financière ?" -#: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "" -"You are connecting this account for payments and transfers. Would you also " -"like to connect it for financial management to track income and spending?" -msgstr "" -"Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous " -"également le connecter pour la gestion financière afin de suivre vos revenus " -"et vos dépenses ?" - #: src/views/additionalProduct/AdditionalProductStep.tsx msgid "Yes, add financial management" msgstr "Oui, ajoutez la gestion financière" @@ -2067,43 +2058,36 @@ msgid "Add transfers and payments?" msgstr "Ajouter des transferts et des paiements ?" #: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "" -"You are connecting this account for financial management. Would you also " -"like to connect it for transfers and payments to quickly move money to and " -"from this institution?" -msgstr "" -"Vous connectez ce compte pour la gestion financière. Souhaitez-vous " -"également le connecter pour effectuer des virements et des paiements afin de " -"transférer rapidement des fonds vers et depuis cette institution ?" +msgid "Yes, add transfers and payments" +msgstr "Oui, ajouter des transferts et des paiements" -#: src/components/DeleteMemberSurvey.js src/components/RequiredFieldNote.tsx #: src/views/mfa/MFAOptions.js -msgid "Required" -msgstr "Requis" - -#: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "Add financial management?" -msgstr "Ajouter la gestion financière ?" +msgid "Select an account to connect" +msgstr "Sélectionnez un compte pour vous connecter" #: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "Yes, add financial management" -msgstr "Oui, ajoutez la gestion financière" - -msgid "No, just transfers and payment" -msgstr "Non, juste des virements et des paiements" +msgid "" +"You're connecting this account for payments and transfers. Would you like to " +"also enable financial management so you can track your income and spending?" +msgstr "" +"Vous connectez ce compte pour les paiements et les virements. Souhaitez-vous " +"également activer la gestion financière afin de suivre vos revenus et vos " +"dépenses ?" #: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "Add transfers and payments?" -msgstr "Ajouter des transferts et des paiements ?" +msgid "No, only add transfers and payments" +msgstr "Non, ajoutez uniquement les virements et les paiements" #: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "Yes, add transfers and payments" -msgstr "Oui, ajouter des transferts et des paiements" +msgid "" +"You're connecting this account for financial management. Would you like to " +"also enable transfers and payments so you can quickly move money to and from " +"this institution?" +msgstr "" +"Vous connectez ce compte à des fins de gestion financière. Souhaitez-vous " +"également activer les virements et les paiements afin de transférer " +"rapidement de l'argent vers et depuis cette institution ?" #: src/views/additionalProduct/AdditionalProductStep.tsx -msgid "No, just financial management" -msgstr "Non, juste la gestion financière" - -#: src/views/mfa/MFAOptions.js -msgid "Select an account to connect" -msgstr "Sélectionnez un compte pour vous connecter" +msgid "No, only add financial management" +msgstr "Non, ajoutez uniquement la gestion financière" From 3da84e6f0f9e4ff7b7f542028f65b5f0a77d9eb4 Mon Sep 17 00:00:00 2001 From: Jameson Brown Date: Tue, 15 Jul 2025 10:49:00 -0600 Subject: [PATCH 16/16] Reverted temporary workaround --- src/redux/reducers/Connect.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/redux/reducers/Connect.js b/src/redux/reducers/Connect.js index bc6eaf0001..456ebd90eb 100644 --- a/src/redux/reducers/Connect.js +++ b/src/redux/reducers/Connect.js @@ -66,8 +66,7 @@ const loadConnectSuccess = (state, action) => { selectedInstitution: institution, updateCredentials: member?.connection_status === ReadableStatuses.DENIED || state.updateCredentials, - members: member ? upsertMember({ members }, { payload: member }) : members, // This is a temporary work around until CT-1552 is fixed. - // members // Remove above line and revert to this line when CT-1552 is fixed. + members, } }