Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Display banner to enable 2FA when setting up VBBA #12424

Merged
merged 13 commits into from
Dec 1, 2022
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions src/components/Icon/Illustrations.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 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';
Expand Down Expand Up @@ -54,6 +55,7 @@ export {
TadaYellow,
TadaBlue,
GpsTrackOrange,
ShieldYellow,
MoneyReceipts,
PinkBill,
CreditCardsNew,
Expand Down
3 changes: 3 additions & 0 deletions src/languages/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,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 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',
},
beneficialOwnersStep: {
additionalInformation: 'Additional information',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/es.js
Original file line number Diff line number Diff line change
Expand Up @@ -793,6 +793,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: 'Evita fraudes, activa la autenticación de dos factores!',
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',
Expand Down
46 changes: 46 additions & 0 deletions src/pages/ReimbursementAccount/Enable2FAPrompt.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
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';
import themeColors from '../../styles/themes/default';

const propTypes = {
...withLocalizePropTypes,
};
const Enable2FAPrompt = props => (
<Section
title={props.translate('validationStep.enable2FATitle')}
icon={Illustrations.ShieldYellow}
menuItems={[
{
title: props.translate('validationStep.secureYourAccount'),
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,
iconFill: themeColors.success,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👋 Heads-up that this has caused a small visual issue in #20932
This icon wasn't changing color on hover, since we were overriding its color with iconFill prop

wrapperStyle: [styles.cardMenuItem],
},
]}
>
<View style={[styles.mv3]}>
<Text>
{props.translate('validationStep.enable2FAText')}
</Text>
</View>
</Section>
);

Enable2FAPrompt.propTypes = propTypes;
Enable2FAPrompt.displayName = 'Enable2FAPrompt';

export default withLocalize(Enable2FAPrompt);
32 changes: 28 additions & 4 deletions src/pages/ReimbursementAccount/ValidationStep.js
Original file line number Diff line number Diff line change
@@ -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 themeColors from '../../styles/themes/default';
import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize';
Expand All @@ -27,12 +28,20 @@ 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,

/** Bank account currently in setup */
reimbursementAccount: reimbursementAccountPropTypes,

/** User's account who is setting up bank account */
account: PropTypes.shape({
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The guidelines mention: "All props are defined accurately and each prop has a /** comment above it */"


/** If user has Two factor authentication enabled */
requiresTwoFactorAuth: PropTypes.bool,
}),
};

const defaultProps = {
Expand All @@ -41,6 +50,9 @@ const defaultProps = {
errors: {},
maxAttemptsReached: false,
},
account: {
requiresTwoFactorAuth: false,
},
};

class ValidationStep extends React.Component {
Expand Down Expand Up @@ -117,6 +129,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 (
<View style={[styles.flex1, styles.justifyContentBetween]}>
Expand Down Expand Up @@ -160,7 +173,7 @@ class ValidationStep extends React.Component {
{this.props.translate('validationStep.descriptionCTA')}
</Text>
</View>
<View style={[styles.mv5, styles.flex1]}>
<View style={[styles.mv5]}>
<TextInput
inputID="amount1"
shouldSaveDraft
Expand All @@ -183,10 +196,15 @@ class ValidationStep extends React.Component {
keyboardType="decimal-pad"
/>
</View>
{!requiresTwoFactorAuth && (
<View style={[styles.mln5, styles.mrn5]}>
<Enable2FAPrompt />
</View>
)}
</Form>
)}
{isVerifying && (
<View style={[styles.flex1]}>
<ScrollView style={[styles.flex1]}>
<Section
title={this.props.translate('workspace.bankAccount.letsFinishInChat')}
icon={Illustrations.ConciergeBubble}
Expand All @@ -213,7 +231,10 @@ class ValidationStep extends React.Component {
wrapperStyle={[styles.cardMenuItem, styles.mv3]}
/>
</Section>
</View>
{!requiresTwoFactorAuth && (
<Enable2FAPrompt />
)}
</ScrollView>
)}
</View>
);
Expand All @@ -229,5 +250,8 @@ export default compose(
reimbursementAccount: {
key: ONYXKEYS.REIMBURSEMENT_ACCOUNT,
},
account: {
key: ONYXKEYS.ACCOUNT,
},
}),
)(ValidationStep);
Loading