From 1caa16086106b6cfea6b4f4acd4b83999c0f902a Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Thu, 3 Nov 2022 16:01:40 +0530 Subject: [PATCH 01/10] Add a new component to display banner --- src/languages/en.js | 3 ++ src/languages/es.js | 3 ++ .../ReimbursementAccount/Enable2FAPrompt.js | 41 +++++++++++++++++++ .../ReimbursementAccount/ValidationStep.js | 5 +++ 4 files changed, 52 insertions(+) create mode 100644 src/pages/ReimbursementAccount/Enable2FAPrompt.js diff --git a/src/languages/en.js b/src/languages/en.js index efbd19b9a360..4bfaca0276ed 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -771,6 +771,9 @@ export default { letsChatCTA: 'Yes, let\'s chat', letsChatText: 'Thanks for doing that. We need your help verifying a few pieces of information, but we can work this out quickly over chat. Ready?', letsChatTitle: 'Let\'s chat!', + enable2FATitle: 'Prevent fraud, enable two-factor security!', + enable2FAText: 'We take your security seriously, so please set up two-factor authentication for your account now. That will allow us to dispute Expensify Card digital transactions, and will reduce your risk for fraud.', + secureYourAccount: 'Secure your account', }, beneficialOwnersStep: { additionalInformation: 'Additional information', diff --git a/src/languages/es.js b/src/languages/es.js index f66f0942a02a..d7d418528810 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -773,6 +773,9 @@ export default { letsChatCTA: 'Sí, vamos a chatear', letsChatText: 'Gracias. Necesitamos tu ayuda para verificar la información, pero podemos hacerlo rápidamente a través del chat. ¿Estás listo?', letsChatTitle: '¡Vamos a chatear!', + enable2FATitle: '¡Evite el fraude, habilite la seguridad de dos factores!', + enable2FAText: 'Nos tomamos muy en serio su seguridad, así que configure la autenticación de dos factores para su cuenta ahora. Eso nos permitirá disputar las transacciones digitales de Expensify Card y reducirá su riesgo de fraude.', + secureYourAccount: 'Asegure su cuenta', }, beneficialOwnersStep: { additionalInformation: 'Información adicional', diff --git a/src/pages/ReimbursementAccount/Enable2FAPrompt.js b/src/pages/ReimbursementAccount/Enable2FAPrompt.js new file mode 100644 index 000000000000..fd2a8566b50a --- /dev/null +++ b/src/pages/ReimbursementAccount/Enable2FAPrompt.js @@ -0,0 +1,41 @@ +import React from 'react'; +import {View} from 'react-native'; +import Text from '../../components/Text'; +import styles from '../../styles/styles'; +import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize'; +import * as Expensicons from '../../components/Icon/Expensicons'; +import * as Illustrations from '../../components/Icon/Illustrations'; +import Section from '../../components/Section'; +import * as Link from '../../libs/actions/Link'; +import CONFIG from '../../CONFIG'; +import ROUTES from '../../ROUTES'; + +const propTypes = { + ...withLocalizePropTypes, +}; +const Enable2FAPrompt = props => ( +
Link.openOldDotLink(`settings?param={"section":"account","action":"enableTwoFactorAuth","exitTo":"${CONFIG.EXPENSIFY.NEW_EXPENSIFY_URL}${ROUTES.BANK_ACCOUNT}"}`), + icon: Expensicons.Send, + shouldShowRightIcon: true, + iconRight: Expensicons.NewWindow, + }, + ]} + > + + + {props.translate('validationStep.enable2FAText')} + + +
+); + +Enable2FAPrompt.propTypes = propTypes; +Enable2FAPrompt.displayName = 'Enable2FAPrompt'; + +export default withLocalize(Enable2FAPrompt); diff --git a/src/pages/ReimbursementAccount/ValidationStep.js b/src/pages/ReimbursementAccount/ValidationStep.js index 131b3add37d1..2974f4514295 100644 --- a/src/pages/ReimbursementAccount/ValidationStep.js +++ b/src/pages/ReimbursementAccount/ValidationStep.js @@ -26,6 +26,7 @@ import Section from '../../components/Section'; import CONST from '../../CONST'; import Button from '../../components/Button'; import MenuItem from '../../components/MenuItem'; +import Enable2FAPrompt from './Enable2FAPrompt'; const propTypes = { ...withLocalizePropTypes, @@ -182,6 +183,9 @@ class ValidationStep extends React.Component { keyboardType="decimal-pad" /> + + + )} {isVerifying && ( @@ -210,6 +214,7 @@ class ValidationStep extends React.Component { onPress={BankAccounts.requestResetFreePlanBankAccount} shouldShowRightIcon /> + )} From 686d711513edbb0219f837578f1a78e4ca293d8e Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Fri, 4 Nov 2022 17:55:45 +0530 Subject: [PATCH 02/10] Update copy --- src/languages/en.js | 2 +- src/languages/es.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/languages/en.js b/src/languages/en.js index 4bfaca0276ed..fe300cb94d12 100755 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -771,7 +771,7 @@ export default { letsChatCTA: 'Yes, let\'s chat', letsChatText: 'Thanks for doing that. We need your help verifying a few pieces of information, but we can work this out quickly over chat. Ready?', letsChatTitle: 'Let\'s chat!', - enable2FATitle: 'Prevent fraud, enable two-factor security!', + enable2FATitle: 'Prevent fraud, enable two-factor authentication!', enable2FAText: 'We take your security seriously, so please set up two-factor authentication for your account now. That will allow us to dispute Expensify Card digital transactions, and will reduce your risk for fraud.', secureYourAccount: 'Secure your account', }, diff --git a/src/languages/es.js b/src/languages/es.js index d7d418528810..90cc8a5f1e61 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -773,8 +773,8 @@ export default { letsChatCTA: 'Sí, vamos a chatear', letsChatText: 'Gracias. Necesitamos tu ayuda para verificar la información, pero podemos hacerlo rápidamente a través del chat. ¿Estás listo?', letsChatTitle: '¡Vamos a chatear!', - enable2FATitle: '¡Evite el fraude, habilite la seguridad de dos factores!', - enable2FAText: 'Nos tomamos muy en serio su seguridad, así que configure la autenticación de dos factores para su cuenta ahora. Eso nos permitirá disputar las transacciones digitales de Expensify Card y reducirá su riesgo de fraude.', + enable2FATitle: 'Evita fraudes, activa la autenticación de dos factores!', + enable2FAText: 'Tu seguridad es importante para nosotros, por favor configura la autenticación de dos factores ahora. Eso nos permitirá disputar transacciones de la Tarjeta Expensify y reducirá tu riesgo de fraude.', secureYourAccount: 'Asegure su cuenta', }, beneficialOwnersStep: { From 8e4d306ce098f10cfb8e171c744e2ded62961f1d Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Mon, 7 Nov 2022 23:44:02 +0530 Subject: [PATCH 03/10] Add new assets --- .../user-verify--blue.svg | 25 +++++++++++++++++++ assets/images/shield.svg | 10 ++++++++ src/components/Icon/Expensicons.js | 2 ++ src/components/Icon/Illustrations.js | 2 ++ .../ReimbursementAccount/Enable2FAPrompt.js | 4 +-- 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 assets/images/product-illustrations/user-verify--blue.svg create mode 100644 assets/images/shield.svg diff --git a/assets/images/product-illustrations/user-verify--blue.svg b/assets/images/product-illustrations/user-verify--blue.svg new file mode 100644 index 000000000000..0f9f07437754 --- /dev/null +++ b/assets/images/product-illustrations/user-verify--blue.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + diff --git a/assets/images/shield.svg b/assets/images/shield.svg new file mode 100644 index 000000000000..9af2b4f6bdfd --- /dev/null +++ b/assets/images/shield.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/components/Icon/Expensicons.js b/src/components/Icon/Expensicons.js index f3f8f77ccbe8..8c9ff0c80694 100644 --- a/src/components/Icon/Expensicons.js +++ b/src/components/Icon/Expensicons.js @@ -72,6 +72,7 @@ import ReceiptSearch from '../../../assets/images/receipt-search.svg'; import Rotate from '../../../assets/images/rotate.svg'; import RotateLeft from '../../../assets/images/rotate-left.svg'; import Send from '../../../assets/images/send.svg'; +import Shield from '../../../assets/images/shield.svg'; import Sync from '../../../assets/images/sync.svg'; import ThreeDots from '../../../assets/images/three-dots.svg'; import Transfer from '../../../assets/images/transfer.svg'; @@ -162,6 +163,7 @@ export { Rotate, RotateLeft, Send, + Shield, Sync, ThreeDots, Transfer, diff --git a/src/components/Icon/Illustrations.js b/src/components/Icon/Illustrations.js index 273f5854a3d7..1c9518bb1d7a 100644 --- a/src/components/Icon/Illustrations.js +++ b/src/components/Icon/Illustrations.js @@ -17,6 +17,7 @@ import RocketOrange from '../../../assets/images/product-illustrations/rocket--o import TadaYellow from '../../../assets/images/product-illustrations/tada--yellow.svg'; import TadaBlue from '../../../assets/images/product-illustrations/tada--blue.svg'; import GpsTrackOrange from '../../../assets/images/product-illustrations/gps-track--orange.svg'; +import UserVerifyBlue from '../../../assets/images/product-illustrations/user-verify--blue.svg'; export { BankArrowPink, @@ -38,4 +39,5 @@ export { TadaYellow, TadaBlue, GpsTrackOrange, + UserVerifyBlue, }; diff --git a/src/pages/ReimbursementAccount/Enable2FAPrompt.js b/src/pages/ReimbursementAccount/Enable2FAPrompt.js index fd2a8566b50a..6a4142bf67c0 100644 --- a/src/pages/ReimbursementAccount/Enable2FAPrompt.js +++ b/src/pages/ReimbursementAccount/Enable2FAPrompt.js @@ -16,12 +16,12 @@ const propTypes = { const Enable2FAPrompt = props => (
Link.openOldDotLink(`settings?param={"section":"account","action":"enableTwoFactorAuth","exitTo":"${CONFIG.EXPENSIFY.NEW_EXPENSIFY_URL}${ROUTES.BANK_ACCOUNT}"}`), - icon: Expensicons.Send, + icon: Expensicons.Shield, shouldShowRightIcon: true, iconRight: Expensicons.NewWindow, }, From 20d9506a6d6a36f4e3ee35cf324cdc6fdf8fce10 Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Tue, 8 Nov 2022 00:02:53 +0530 Subject: [PATCH 04/10] Display banner conditionally --- .../ReimbursementAccount/ValidationStep.js | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/pages/ReimbursementAccount/ValidationStep.js b/src/pages/ReimbursementAccount/ValidationStep.js index 2974f4514295..cf0e7e199621 100644 --- a/src/pages/ReimbursementAccount/ValidationStep.js +++ b/src/pages/ReimbursementAccount/ValidationStep.js @@ -27,12 +27,19 @@ import CONST from '../../CONST'; import Button from '../../components/Button'; import MenuItem from '../../components/MenuItem'; import Enable2FAPrompt from './Enable2FAPrompt'; +import PropTypes from 'prop-types'; const propTypes = { ...withLocalizePropTypes, /** Bank account currently in setup */ reimbursementAccount: reimbursementAccountPropTypes, + + account: PropTypes.shape({ + + /** If user has Two factor authentication enabled */ + requiresTwoFactorAuth: PropTypes.bool, + }), }; const defaultProps = { @@ -41,6 +48,9 @@ const defaultProps = { errors: {}, maxAttemptsReached: false, }, + account: { + requiresTwoFactorAuth: false, + }, }; class ValidationStep extends React.Component { @@ -117,6 +127,7 @@ class ValidationStep extends React.Component { const maxAttemptsReached = lodashGet(this.props, 'reimbursementAccount.maxAttemptsReached'); const isVerifying = !maxAttemptsReached && state === BankAccount.STATE.VERIFYING; + const requiresTwoFactorAuth = lodashGet(this.props, 'account.requiresTwoFactorAuth'); return ( @@ -183,9 +194,11 @@ class ValidationStep extends React.Component { keyboardType="decimal-pad" /> - - - + {!requiresTwoFactorAuth && ( + + + + )} )} {isVerifying && ( @@ -214,7 +227,9 @@ class ValidationStep extends React.Component { onPress={BankAccounts.requestResetFreePlanBankAccount} shouldShowRightIcon /> - + {!requiresTwoFactorAuth && ( + + )} )} @@ -231,5 +246,8 @@ export default compose( reimbursementAccount: { key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, }, + account: { + key: ONYXKEYS.ACCOUNT, + }, }), )(ValidationStep); From 534d2769e8133c0165ef84630d179445ce31afc2 Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Tue, 8 Nov 2022 17:09:24 +0530 Subject: [PATCH 05/10] Fix some styles --- src/pages/ReimbursementAccount/ValidationStep.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/ReimbursementAccount/ValidationStep.js b/src/pages/ReimbursementAccount/ValidationStep.js index cf0e7e199621..6ff8d3a3a9b6 100644 --- a/src/pages/ReimbursementAccount/ValidationStep.js +++ b/src/pages/ReimbursementAccount/ValidationStep.js @@ -1,9 +1,10 @@ import lodashGet from 'lodash/get'; import React from 'react'; -import {View} from 'react-native'; +import {ScrollView, View} from 'react-native'; import {withOnyx} from 'react-native-onyx'; import Str from 'expensify-common/lib/str'; import _ from 'underscore'; +import PropTypes from 'prop-types'; import styles from '../../styles/styles'; import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize'; import * as BankAccounts from '../../libs/actions/BankAccounts'; @@ -27,7 +28,6 @@ import CONST from '../../CONST'; import Button from '../../components/Button'; import MenuItem from '../../components/MenuItem'; import Enable2FAPrompt from './Enable2FAPrompt'; -import PropTypes from 'prop-types'; const propTypes = { ...withLocalizePropTypes, @@ -171,7 +171,7 @@ class ValidationStep extends React.Component { {this.props.translate('validationStep.descriptionCTA')} - + )} {isVerifying && ( - +
)} - + )} ); From 8a17d4555703cd037ba80ba306efb270c5eba07f Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Thu, 10 Nov 2022 19:10:42 +0530 Subject: [PATCH 06/10] Fix Lint warning --- src/pages/ReimbursementAccount/Enable2FAPrompt.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/ReimbursementAccount/Enable2FAPrompt.js b/src/pages/ReimbursementAccount/Enable2FAPrompt.js index 6a4142bf67c0..9afce461e87d 100644 --- a/src/pages/ReimbursementAccount/Enable2FAPrompt.js +++ b/src/pages/ReimbursementAccount/Enable2FAPrompt.js @@ -20,7 +20,9 @@ const Enable2FAPrompt = props => ( menuItems={[ { title: props.translate('validationStep.secureYourAccount'), - onPress: () => Link.openOldDotLink(`settings?param={"section":"account","action":"enableTwoFactorAuth","exitTo":"${CONFIG.EXPENSIFY.NEW_EXPENSIFY_URL}${ROUTES.BANK_ACCOUNT}"}`), + onPress: () => { + Link.openOldDotLink(`settings?param={"section":"account","action":"enableTwoFactorAuth","exitTo":"${CONFIG.EXPENSIFY.NEW_EXPENSIFY_URL}${ROUTES.BANK_ACCOUNT}"}`); + }, icon: Expensicons.Shield, shouldShowRightIcon: true, iconRight: Expensicons.NewWindow, From 1f96747e535d3555697169d333938b83cd86a104 Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Tue, 29 Nov 2022 23:52:22 +0530 Subject: [PATCH 07/10] Use new styling --- src/pages/ReimbursementAccount/Enable2FAPrompt.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/ReimbursementAccount/Enable2FAPrompt.js b/src/pages/ReimbursementAccount/Enable2FAPrompt.js index 9afce461e87d..bd3effd47c0f 100644 --- a/src/pages/ReimbursementAccount/Enable2FAPrompt.js +++ b/src/pages/ReimbursementAccount/Enable2FAPrompt.js @@ -9,6 +9,7 @@ import Section from '../../components/Section'; import * as Link from '../../libs/actions/Link'; import CONFIG from '../../CONFIG'; import ROUTES from '../../ROUTES'; +import themeColors from '../../styles/themes/default'; const propTypes = { ...withLocalizePropTypes, @@ -26,10 +27,12 @@ const Enable2FAPrompt = props => ( icon: Expensicons.Shield, shouldShowRightIcon: true, iconRight: Expensicons.NewWindow, + iconFill: themeColors.success, + wrapperStyle: [styles.cardMenuItem], }, ]} > - + {props.translate('validationStep.enable2FAText')} From cd6f2a9347093dec90ecab4328b690c01cf9d03d Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Wed, 30 Nov 2022 14:55:31 +0530 Subject: [PATCH 08/10] Use new icon --- .../user-verify--blue.svg | 25 ------ .../simple-illustration__shield.svg | 77 +++++++++++++++++++ src/components/Icon/Illustrations.js | 4 +- .../ReimbursementAccount/Enable2FAPrompt.js | 2 +- 4 files changed, 80 insertions(+), 28 deletions(-) delete mode 100644 assets/images/product-illustrations/user-verify--blue.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__shield.svg diff --git a/assets/images/product-illustrations/user-verify--blue.svg b/assets/images/product-illustrations/user-verify--blue.svg deleted file mode 100644 index 0f9f07437754..000000000000 --- a/assets/images/product-illustrations/user-verify--blue.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/images/simple-illustrations/simple-illustration__shield.svg b/assets/images/simple-illustrations/simple-illustration__shield.svg new file mode 100644 index 000000000000..5d56b9c3acb2 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__shield.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Icon/Illustrations.js b/src/components/Icon/Illustrations.js index 21c4073859e6..ebfd86846692 100644 --- a/src/components/Icon/Illustrations.js +++ b/src/components/Icon/Illustrations.js @@ -17,7 +17,7 @@ import RocketOrange from '../../../assets/images/product-illustrations/rocket--o import TadaYellow from '../../../assets/images/product-illustrations/tada--yellow.svg'; import TadaBlue from '../../../assets/images/product-illustrations/tada--blue.svg'; import GpsTrackOrange from '../../../assets/images/product-illustrations/gps-track--orange.svg'; -import UserVerifyBlue from '../../../assets/images/product-illustrations/user-verify--blue.svg'; +import ShieldYellow from '../../../assets/images/simple-illustrations/simple-illustration__shield.svg'; import MoneyReceipts from '../../../assets/images/simple-illustrations/simple-illustration__money-receipts.svg'; import PinkBill from '../../../assets/images/simple-illustrations/simple-illustration__bill.svg'; import CreditCardsNew from '../../../assets/images/simple-illustrations/simple-illustration__credit-cards.svg'; @@ -55,7 +55,7 @@ export { TadaYellow, TadaBlue, GpsTrackOrange, - UserVerifyBlue, + ShieldYellow, MoneyReceipts, PinkBill, CreditCardsNew, diff --git a/src/pages/ReimbursementAccount/Enable2FAPrompt.js b/src/pages/ReimbursementAccount/Enable2FAPrompt.js index bd3effd47c0f..6b89006bb43d 100644 --- a/src/pages/ReimbursementAccount/Enable2FAPrompt.js +++ b/src/pages/ReimbursementAccount/Enable2FAPrompt.js @@ -17,7 +17,7 @@ const propTypes = { const Enable2FAPrompt = props => (
Date: Wed, 30 Nov 2022 15:02:17 +0530 Subject: [PATCH 09/10] Update copy --- src/languages/es.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/es.js b/src/languages/es.js index 13e6f5ad3806..50e01d980f74 100644 --- a/src/languages/es.js +++ b/src/languages/es.js @@ -794,8 +794,8 @@ export default { letsChatText: 'Gracias. Necesitamos tu ayuda para verificar la información, pero podemos hacerlo rápidamente a través del chat. ¿Estás listo?', letsChatTitle: '¡Vamos a chatear!', enable2FATitle: 'Evita fraudes, activa la autenticación de dos factores!', - enable2FAText: 'Tu seguridad es importante para nosotros, por favor configura la autenticación de dos factores ahora. Eso nos permitirá disputar transacciones de la Tarjeta Expensify y reducirá tu riesgo de fraude.', - secureYourAccount: 'Asegure su cuenta', + enable2FAText: 'Tu seguridad es importante para nosotros, por favor configura ahora la autenticación de dos factores. Eso nos permitirá disputar las transacciones de la Tarjeta Expensify y reducirá tu riesgo de fraude.', + secureYourAccount: 'Asegura tu cuenta', }, beneficialOwnersStep: { additionalInformation: 'Información adicional', From 57ed7a539844c20c55fcfc4c10977d5170bbee39 Mon Sep 17 00:00:00 2001 From: Monil Bhavsar Date: Thu, 1 Dec 2022 17:33:37 +0530 Subject: [PATCH 10/10] Address review --- src/pages/ReimbursementAccount/ValidationStep.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/ReimbursementAccount/ValidationStep.js b/src/pages/ReimbursementAccount/ValidationStep.js index 796884de0793..6279cca7519c 100644 --- a/src/pages/ReimbursementAccount/ValidationStep.js +++ b/src/pages/ReimbursementAccount/ValidationStep.js @@ -36,6 +36,7 @@ const propTypes = { /** Bank account currently in setup */ reimbursementAccount: reimbursementAccountPropTypes, + /** User's account who is setting up bank account */ account: PropTypes.shape({ /** If user has Two factor authentication enabled */