Skip to content

Commit 3611198

Browse files
authored
Merge pull request #52614 from callstack-internal/feat/50902-GR-step-6-agreements-and-finish-screen
Feat/50902 gr step 6 agreements and finish screen
2 parents e9e1857 + 209edaf commit 3611198

File tree

8 files changed

+216
-40
lines changed

8 files changed

+216
-40
lines changed

src/languages/en.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,10 +2371,25 @@ const translations = {
23712371
agreementsStep: {
23722372
agreements: 'Agreements',
23732373
pleaseConfirm: 'Please confirm the agreements below',
2374+
regulationRequiresUs: 'Regulation requires us to verify the identity of any individual who owns more than 25% of the business.',
2375+
iAmAuthorized: 'I am authorized to use the business bank account for business spend.',
2376+
iCertify: 'I certify that the information provided is true and accurate.',
2377+
termsAndConditions: 'terms and conditions.',
23742378
accept: 'Accept and add bank account',
2379+
error: {
2380+
authorized: 'You must be a controlling officer with authorization to operate the business bank account',
2381+
certify: 'Please certify that the information is true and accurate',
2382+
},
23752383
},
23762384
finishStep: {
23772385
connect: 'Connect bank account',
2386+
letsFinish: "Let's finish in chat!",
2387+
thanksFor:
2388+
"Thanks for those details. A dedicated support agent will now review your information. We'll circle back if we need anything else from you, but in the meantime, feel free to reach out to us with any questions.",
2389+
iHaveA: 'I have a question',
2390+
enable2FA: 'Enable two-factor authentication (2FA) to prevent fraud',
2391+
weTake: 'We take your security seriously. Please set up 2FA now to add an extra layer of protection to your account.',
2392+
secure: 'Secure your account',
23782393
},
23792394
reimbursementAccountLoadingAnimation: {
23802395
oneMoment: 'One moment',

src/languages/es.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2381,7 +2381,7 @@ const translations = {
23812381
uploadID: 'Subir documento de identidad y prueba de domicilio',
23822382
id: 'Identificación (licencia de conducir o pasaporte)',
23832383
personalAddress: 'Prueba de domicilio personal (por ejemplo, factura de servicios públicos)',
2384-
letsDoubleCheck: 'Vamos a comprobar que todo está bien.',
2384+
letsDoubleCheck: 'Vamos a verificar que todo esté correcto.',
23852385
legalName: 'Nombre legal',
23862386
proofOf: 'Comprobante de domicilio personal',
23872387
enterOneEmail: 'Introduce el correo electrónico del director o alto funcionario en',
@@ -2395,10 +2395,25 @@ const translations = {
23952395
agreementsStep: {
23962396
agreements: 'Acuerdos',
23972397
pleaseConfirm: 'Por favor confirme los acuerdos a continuación',
2398-
accept: 'Aceptar y añadir cuenta bancaria',
2398+
regulationRequiresUs: 'La normativa requiere que verifiquemos la identidad de cualquier individuo que posea más del 25% del negocio.',
2399+
iAmAuthorized: 'Estoy autorizado para usar la cuenta bancaria para gastos del negocio.',
2400+
iCertify: 'Certifico que la información proporcionada es verdadera y correcta.',
2401+
termsAndConditions: 'términos y condiciones.',
2402+
accept: 'Agregar y aceptar cuenta bancaria',
2403+
error: {
2404+
authorized: 'Debe ser un funcionario controlador con autorización para operar la cuenta bancaria comercial',
2405+
certify: 'Por favor certifique que la información es verdadera y exacta',
2406+
},
23992407
},
24002408
finishStep: {
24012409
connect: 'Conectar cuenta bancaria',
2410+
letsFinish: '¡Terminemos en el chat!',
2411+
thanksFor:
2412+
'Gracias por esos detalles. Un agente de soporte dedicado revisará ahora tu información. Nos pondremos en contacto si necesitamos algo más de tu parte, pero mientras tanto, no dudes en comunicarte con nosotros si tienes alguna pregunta.',
2413+
iHaveA: 'Tengo una pregunta',
2414+
enable2FA: 'Habilite la autenticación de dos factores (2FA) para prevenir fraudes',
2415+
weTake: 'Nos tomamos su seguridad en serio. Por favor, configure 2FA ahora para agregar una capa adicional de protección a su cuenta.',
2416+
secure: 'Asegure su cuenta',
24022417
},
24032418
reimbursementAccountLoadingAnimation: {
24042419
oneMoment: 'Un momento',

src/pages/ReimbursementAccount/NonUSD/Agreements/substeps/Confirmation.tsx

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,116 @@
1-
import React from 'react';
1+
import React, {useCallback} from 'react';
2+
import {useOnyx} from 'react-native-onyx';
3+
import CheckboxWithLabel from '@components/CheckboxWithLabel';
24
import FormProvider from '@components/Form/FormProvider';
5+
import InputWrapper from '@components/Form/InputWrapper';
6+
import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
37
import Text from '@components/Text';
8+
import TextLink from '@components/TextLink';
49
import useLocalize from '@hooks/useLocalize';
510
import type {SubStepProps} from '@hooks/useSubStep/types';
611
import useThemeStyles from '@hooks/useThemeStyles';
12+
import * as ValidationUtils from '@libs/ValidationUtils';
713
import ONYXKEYS from '@src/ONYXKEYS';
14+
import INPUT_IDS from '@src/types/form/ReimbursementAccountForm';
15+
16+
const {AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT, PROVIDE_TRUTHFUL_INFORMATION, AGREE_TO_TERMS_AND_CONDITIONS} = INPUT_IDS.ADDITIONAL_DATA.CORPAY;
17+
const STEP_FIELDS = [AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT, PROVIDE_TRUTHFUL_INFORMATION, AGREE_TO_TERMS_AND_CONDITIONS];
18+
19+
function IsAuthorizedToUseBankAccountLabel() {
20+
const {translate} = useLocalize();
21+
return <Text>{translate('agreementsStep.iAmAuthorized')}</Text>;
22+
}
23+
24+
function CertifyTrueAndAccurateLabel() {
25+
const {translate} = useLocalize();
26+
return <Text>{translate('agreementsStep.iCertify')}</Text>;
27+
}
28+
29+
function TermsAndConditionsLabel() {
30+
const {translate} = useLocalize();
31+
return (
32+
<Text>
33+
{translate('common.iAcceptThe')}
34+
<TextLink href="https://cross-border.corpay.com/tc/">{`${translate('agreementsStep.termsAndConditions')}`}</TextLink>
35+
</Text>
36+
);
37+
}
838

939
function Confirmation({onNext}: SubStepProps) {
1040
const {translate} = useLocalize();
1141
const styles = useThemeStyles();
1242

43+
const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT);
44+
const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT);
45+
46+
const defaultValues = {
47+
[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT]:
48+
!!reimbursementAccount?.achData?.additionalData?.corpay?.[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT] ?? reimbursementAccountDraft?.[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT] ?? '',
49+
[PROVIDE_TRUTHFUL_INFORMATION]:
50+
!!reimbursementAccount?.achData?.additionalData?.corpay?.[PROVIDE_TRUTHFUL_INFORMATION] ?? reimbursementAccountDraft?.[PROVIDE_TRUTHFUL_INFORMATION] ?? '',
51+
[AGREE_TO_TERMS_AND_CONDITIONS]:
52+
!!reimbursementAccount?.achData?.additionalData?.corpay?.[AGREE_TO_TERMS_AND_CONDITIONS] ?? reimbursementAccountDraft?.[AGREE_TO_TERMS_AND_CONDITIONS] ?? '',
53+
};
54+
55+
const validate = useCallback(
56+
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM> => {
57+
const errors = ValidationUtils.getFieldRequiredErrors(values, STEP_FIELDS);
58+
59+
if (!ValidationUtils.isRequiredFulfilled(values[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT])) {
60+
errors[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT] = translate('agreementsStep.error.authorized');
61+
}
62+
63+
if (!ValidationUtils.isRequiredFulfilled(values[PROVIDE_TRUTHFUL_INFORMATION])) {
64+
errors[PROVIDE_TRUTHFUL_INFORMATION] = translate('agreementsStep.error.certify');
65+
}
66+
67+
if (!ValidationUtils.isRequiredFulfilled(values[AGREE_TO_TERMS_AND_CONDITIONS])) {
68+
errors[AGREE_TO_TERMS_AND_CONDITIONS] = translate('common.error.acceptTerms');
69+
}
70+
71+
return errors;
72+
},
73+
[translate],
74+
);
75+
1376
return (
1477
<FormProvider
1578
formID={ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM}
1679
onSubmit={onNext}
80+
validate={validate}
1781
submitButtonText={translate('agreementsStep.accept')}
1882
style={[styles.mh5, styles.flexGrow1]}
1983
enabledWhenOffline={false}
2084
>
2185
<Text style={[styles.textHeadlineLineHeightXXL]}>{translate('agreementsStep.pleaseConfirm')}</Text>
86+
<Text style={[styles.pv3, styles.textSupporting]}>{translate('agreementsStep.regulationRequiresUs')}</Text>
87+
<InputWrapper
88+
InputComponent={CheckboxWithLabel}
89+
accessibilityLabel={translate('agreementsStep.iAmAuthorized')}
90+
inputID={AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT}
91+
style={styles.mt6}
92+
LabelComponent={IsAuthorizedToUseBankAccountLabel}
93+
defaultValue={defaultValues[AUTHORIZED_TO_BIND_CLIENT_TO_AGREEMENT]}
94+
shouldSaveDraft
95+
/>
96+
<InputWrapper
97+
InputComponent={CheckboxWithLabel}
98+
accessibilityLabel={translate('agreementsStep.iCertify')}
99+
inputID={PROVIDE_TRUTHFUL_INFORMATION}
100+
style={styles.mt6}
101+
LabelComponent={CertifyTrueAndAccurateLabel}
102+
defaultValue={defaultValues[PROVIDE_TRUTHFUL_INFORMATION]}
103+
shouldSaveDraft
104+
/>
105+
<InputWrapper
106+
InputComponent={CheckboxWithLabel}
107+
accessibilityLabel={`${translate('common.iAcceptThe')} ${translate('agreementsStep.termsAndConditions')}`}
108+
inputID={AGREE_TO_TERMS_AND_CONDITIONS}
109+
style={styles.mt6}
110+
LabelComponent={TermsAndConditionsLabel}
111+
defaultValue={defaultValues[AGREE_TO_TERMS_AND_CONDITIONS]}
112+
shouldSaveDraft
113+
/>
22114
</FormProvider>
23115
);
24116
}

src/pages/ReimbursementAccount/NonUSD/Finish/Finish.tsx

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import React from 'react';
2+
import {View} from 'react-native';
3+
import {useOnyx} from 'react-native-onyx';
4+
import Button from '@components/Button';
5+
import HeaderWithBackButton from '@components/HeaderWithBackButton';
6+
import * as Expensicons from '@components/Icon/Expensicons';
7+
import * as Illustrations from '@components/Icon/Illustrations';
8+
import ScreenWrapper from '@components/ScreenWrapper';
9+
import ScrollView from '@components/ScrollView';
10+
import Section from '@components/Section';
11+
import Text from '@components/Text';
12+
import useLocalize from '@hooks/useLocalize';
13+
import useThemeStyles from '@hooks/useThemeStyles';
14+
import Navigation from '@navigation/Navigation';
15+
import * as Report from '@userActions/Report';
16+
import ONYXKEYS from '@src/ONYXKEYS';
17+
import ROUTES from '@src/ROUTES';
18+
19+
function Finish() {
20+
const styles = useThemeStyles();
21+
const {translate} = useLocalize();
22+
23+
const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT);
24+
const policyID = reimbursementAccount?.achData?.policyID ?? '-1';
25+
26+
const handleBackButtonPress = () => {
27+
Navigation.goBack();
28+
};
29+
const handleNavigateToConciergeChat = () => Report.navigateToConciergeChat(true);
30+
31+
return (
32+
<ScreenWrapper
33+
testID={Finish.displayName}
34+
includeSafeAreaPaddingBottom={false}
35+
shouldEnablePickerAvoiding={false}
36+
shouldEnableMaxHeight
37+
>
38+
<HeaderWithBackButton
39+
title={translate('finishStep.connect')}
40+
onBackButtonPress={handleBackButtonPress}
41+
/>
42+
<ScrollView style={[styles.flex1]}>
43+
<Section
44+
title={translate('finishStep.letsFinish')}
45+
icon={Illustrations.ConciergeBubble}
46+
containerStyles={[styles.mb8, styles.mh5]}
47+
titleStyles={[styles.mb3, styles.textHeadline]}
48+
>
49+
<Text style={[styles.mb6, styles.mt3, styles.textLabelSupportingEmptyValue]}>{translate('finishStep.thanksFor')}</Text>
50+
<Button
51+
text={translate('finishStep.iHaveA')}
52+
onPress={handleNavigateToConciergeChat}
53+
icon={Expensicons.ChatBubble}
54+
success
55+
large
56+
innerStyles={[styles.h13]}
57+
/>
58+
</Section>
59+
<Section
60+
title={translate('finishStep.enable2FA')}
61+
icon={Illustrations.ShieldYellow}
62+
titleStyles={[styles.mb4, styles.textHeadline]}
63+
containerStyles={[styles.mh5]}
64+
menuItems={[
65+
{
66+
title: translate('finishStep.secure'),
67+
onPress: () => {
68+
Navigation.navigate(ROUTES.SETTINGS_2FA.getRoute(ROUTES.BANK_ACCOUNT_WITH_STEP_TO_OPEN.getRoute('', policyID)));
69+
},
70+
icon: Expensicons.Shield,
71+
shouldShowRightIcon: true,
72+
iconRight: Expensicons.NewWindow,
73+
wrapperStyle: [styles.cardMenuItem],
74+
},
75+
]}
76+
>
77+
<View style={styles.mb6}>
78+
<Text style={[styles.mt3, styles.textLabelSupportingEmptyValue]}>{translate('finishStep.weTake')}</Text>
79+
</View>
80+
</Section>
81+
</ScrollView>
82+
</ScreenWrapper>
83+
);
84+
}
85+
86+
Finish.displayName = 'Finish';
87+
88+
export default Finish;

src/pages/ReimbursementAccount/NonUSD/SignerInfo/EnterEmail.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ function EnterEmail({onSubmit, isUserDirector}: EnterEmailProps) {
5858
style={[styles.mh5, styles.flexGrow1]}
5959
>
6060
<Text style={[styles.textHeadlineLineHeightXXL]}>{translate(shouldGatherBothEmails ? 'signerInfoStep.enterTwoEmails' : 'signerInfoStep.enterOneEmail')}</Text>
61+
{!shouldGatherBothEmails && <Text style={[styles.pv3, styles.textSupporting]}>{translate('signerInfoStep.regulationRequiresOneMoreDirector')}</Text>}
6162
<InputWrapper
6263
InputComponent={TextInput}
6364
label={shouldGatherBothEmails ? `${translate('common.email')} 1` : translate('common.email')}

src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ import CompanyStep from './CompanyStep';
4040
import ConnectBankAccount from './ConnectBankAccount/ConnectBankAccount';
4141
import ContinueBankAccountSetup from './ContinueBankAccountSetup';
4242
import EnableBankAccount from './EnableBankAccount/EnableBankAccount';
43-
import Agreements from './NonUSD/Agreements/Agreements';
43+
import Agreements from './NonUSD/Agreements';
4444
import BankInfo from './NonUSD/BankInfo/BankInfo';
4545
import BeneficialOwnerInfo from './NonUSD/BeneficialOwnerInfo/BeneficialOwnerInfo';
4646
import BusinessInfo from './NonUSD/BusinessInfo/BusinessInfo';
4747
import Country from './NonUSD/Country/Country';
48-
import Finish from './NonUSD/Finish/Finish';
48+
import Finish from './NonUSD/Finish';
4949
import SignerInfo from './NonUSD/SignerInfo';
5050
import RequestorStep from './RequestorStep';
5151

0 commit comments

Comments
 (0)