Skip to content

Commit fdf965c

Browse files
authored
Merge pull request Expensify#62391 from callstack-internal/plaid-connection
[Internal QA]: Plaid bank connection, Card Assign flow, Commercial Feed
2 parents 437acdd + 1b17bdf commit fdf965c

38 files changed

Lines changed: 577 additions & 79 deletions
Lines changed: 6 additions & 0 deletions
Loading
Lines changed: 11 additions & 0 deletions
Loading

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"assetlinks",
4545
"attributes.accountid",
4646
"attributes.reportid",
47+
"authorised",
4748
"Authy",
4849
"AUTOAPPROVE",
4950
"autocompletions",

src/CONST.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,7 @@ const CONST = {
10761076
EXPENSIFY_ICON_URL: `${CLOUDFRONT_URL}/images/favicon-2019.png`,
10771077
CONCIERGE_ICON_URL_2021: `${CLOUDFRONT_URL}/images/icons/concierge_2021.png`,
10781078
CONCIERGE_ICON_URL: `${CLOUDFRONT_URL}/images/icons/concierge_2022.png`,
1079+
COMPANY_CARD_PLAID: `${CLOUDFRONT_URL}/images/plaid/`,
10791080
UPWORK_URL: 'https://github.com/Expensify/App/issues?q=is%3Aopen+is%3Aissue+label%3A%22Help+Wanted%22',
10801081
DEEP_DIVE_EXPENSIFY_CARD: 'https://community.expensify.com/discussion/4848/deep-dive-expensify-card-and-quickbooks-online-auto-reconciliation-how-it-works',
10811082
DEEP_DIVE_ERECEIPTS: 'https://community.expensify.com/discussion/5542/deep-dive-what-are-ereceipts/',
@@ -3237,6 +3238,7 @@ const CONST = {
32373238
ICON_TYPE_ICON: 'icon',
32383239
ICON_TYPE_AVATAR: 'avatar',
32393240
ICON_TYPE_WORKSPACE: 'workspace',
3241+
ICON_TYPE_PLAID: 'plaid',
32403242

32413243
ACTIVITY_INDICATOR_SIZE: {
32423244
LARGE: 'large',
@@ -3280,6 +3282,7 @@ const CONST = {
32803282
STEP_NAMES: ['1', '2', '3', '4'],
32813283
STEP: {
32823284
BANK_CONNECTION: 'BankConnection',
3285+
PLAID_CONNECTION: 'PlaidConnection',
32833286
ASSIGNEE: 'Assignee',
32843287
CARD: 'Card',
32853288
CARD_NAME: 'CardName',

src/components/FeedSelector.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type IconAsset from '@src/types/utils/IconAsset';
77
import CaretWrapper from './CaretWrapper';
88
import Icon from './Icon';
99
import * as Expensicons from './Icon/Expensicons';
10+
import PlaidCardFeedIcon from './PlaidCardFeedIcon';
1011
import {PressableWithFeedback} from './Pressable';
1112
import Text from './Text';
1213

@@ -28,9 +29,12 @@ type Props = {
2829

2930
/** Whether the RBR indicator should be shown */
3031
shouldShowRBR?: boolean;
32+
33+
/** Image url for plaid bank account */
34+
plaidUrl?: string | null;
3135
};
3236

33-
function FeedSelector({onFeedSelect, cardIcon, shouldChangeLayout, feedName, supportingText, shouldShowRBR = false}: Props) {
37+
function FeedSelector({onFeedSelect, cardIcon, shouldChangeLayout, feedName, supportingText, shouldShowRBR = false, plaidUrl = null}: Props) {
3438
const styles = useThemeStyles();
3539
const theme = useTheme();
3640

@@ -40,14 +44,18 @@ function FeedSelector({onFeedSelect, cardIcon, shouldChangeLayout, feedName, sup
4044
style={[styles.flexRow, styles.alignItemsCenter, styles.gap3, shouldChangeLayout && styles.mb3]}
4145
accessibilityLabel={feedName ?? ''}
4246
>
43-
<Icon
44-
src={cardIcon}
45-
height={variables.cardIconHeight}
46-
width={variables.cardIconWidth}
47-
additionalStyles={styles.cardIcon}
48-
/>
47+
{plaidUrl ? (
48+
<PlaidCardFeedIcon plaidUrl={plaidUrl} />
49+
) : (
50+
<Icon
51+
src={cardIcon}
52+
height={variables.cardIconHeight}
53+
width={variables.cardIconWidth}
54+
additionalStyles={styles.cardIcon}
55+
/>
56+
)}
4957
<View style={styles.flex1}>
50-
<View style={[styles.flexRow, styles.gap1]}>
58+
<View style={[styles.flexRow, styles.gap1, styles.alignItemsCenter]}>
5159
<CaretWrapper style={styles.flex1}>
5260
<Text style={[styles.textStrong, styles.flexShrink1]}>{feedName}</Text>
5361
</CaretWrapper>

src/components/Icon/Illustrations.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import CapitalOneCompanyCardDetail from '@assets/images/companyCards/card-capita
66
import ChaseCompanyCardDetail from '@assets/images/companyCards/card-chase.svg';
77
import CitibankCompanyCardDetail from '@assets/images/companyCards/card-citi.svg';
88
import MasterCardCompanyCardDetail from '@assets/images/companyCards/card-mastercard.svg';
9+
import PlaidCompanyCardDetail from '@assets/images/companyCards/card-plaid.svg';
910
import StripeCompanyCardDetail from '@assets/images/companyCards/card-stripe.svg';
1011
import VisaCompanyCardDetail from '@assets/images/companyCards/card-visa.svg';
1112
import WellsFargoCompanyCardDetail from '@assets/images/companyCards/card-wellsfargo.svg';
@@ -17,6 +18,7 @@ import CapitalOneCompanyCardDetailLarge from '@assets/images/companyCards/large/
1718
import ChaseCompanyCardDetailLarge from '@assets/images/companyCards/large/card-chase-large.svg';
1819
import CitibankCompanyCardDetailLarge from '@assets/images/companyCards/large/card-citi-large.svg';
1920
import MasterCardCompanyCardDetailLarge from '@assets/images/companyCards/large/card-mastercard-large.svg';
21+
import PlaidCompanyCardDetailLarge from '@assets/images/companyCards/large/card-plaid-large.svg';
2022
import StripeCompanyCardDetailLarge from '@assets/images/companyCards/large/card-stripe-large.svg';
2123
import VisaCompanyCardDetailLarge from '@assets/images/companyCards/large/card-visa-large.svg';
2224
import WellsFargoCompanyCardDetailLarge from '@assets/images/companyCards/large/card-wellsfargo-large.svg';
@@ -314,4 +316,6 @@ export {
314316
Flash,
315317
ExpensifyMobileApp,
316318
ReportReceipt,
319+
PlaidCompanyCardDetailLarge,
320+
PlaidCompanyCardDetail,
317321
};

src/components/MenuItem.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import * as Expensicons from './Icon/Expensicons';
3333
import * as defaultWorkspaceAvatars from './Icon/WorkspaceDefaultAvatars';
3434
import {MenuItemGroupContext} from './MenuItemGroup';
3535
import MultipleAvatars from './MultipleAvatars';
36+
import PlaidCardFeedIcon from './PlaidCardFeedIcon';
3637
import type {PressableRef} from './Pressable/GenericPressable/types';
3738
import PressableWithSecondaryInteraction from './PressableWithSecondaryInteraction';
3839
import RenderHTML from './RenderHTML';
@@ -50,7 +51,7 @@ type IconProps = {
5051
};
5152

5253
type AvatarProps = {
53-
iconType?: typeof CONST.ICON_TYPE_AVATAR | typeof CONST.ICON_TYPE_WORKSPACE;
54+
iconType?: typeof CONST.ICON_TYPE_AVATAR | typeof CONST.ICON_TYPE_WORKSPACE | typeof CONST.ICON_TYPE_PLAID;
5455

5556
icon: AvatarSource | IconType[];
5657
};
@@ -375,6 +376,9 @@ type MenuItemBaseProps = {
375376

376377
/** The value to copy on secondary interaction */
377378
copyValue?: string;
379+
380+
/** Plaid image for the bank */
381+
plaidUrl?: string;
378382
};
379383

380384
type MenuItemProps = (IconProps | AvatarProps | NoIcon) & MenuItemBaseProps;
@@ -495,6 +499,7 @@ function MenuItem(
495499
pressableTestID,
496500
shouldTeleportPortalToModalLayer,
497501
copyValue,
502+
plaidUrl,
498503
}: MenuItemProps,
499504
ref: PressableRef,
500505
) {
@@ -785,6 +790,7 @@ function MenuItem(
785790
type={CONST.ICON_TYPE_AVATAR}
786791
/>
787792
)}
793+
{iconType === CONST.ICON_TYPE_PLAID && !!plaidUrl && <PlaidCardFeedIcon plaidUrl={plaidUrl} />}
788794
</View>
789795
)}
790796
{!!secondaryIcon && (
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import {View} from 'react-native';
3+
import type {StyleProp, ViewStyle} from 'react-native';
4+
import useThemeStyles from '@hooks/useThemeStyles';
5+
import variables from '@styles/variables';
6+
import Icon from './Icon';
7+
import * as Illustrations from './Icon/Illustrations';
8+
import Image from './Image';
9+
10+
type PlaidCardFeedIconProps = {
11+
plaidUrl: string;
12+
style?: StyleProp<ViewStyle>;
13+
isLarge?: boolean;
14+
};
15+
16+
function PlaidCardFeedIcon({plaidUrl, style, isLarge}: PlaidCardFeedIconProps) {
17+
const styles = useThemeStyles();
18+
return (
19+
<View style={[style]}>
20+
<Image
21+
source={{uri: plaidUrl}}
22+
style={isLarge ? styles.plaidIcon : styles.plaidIconSmall}
23+
cachePolicy="memory-disk"
24+
/>
25+
<Icon
26+
src={isLarge ? Illustrations.PlaidCompanyCardDetailLarge : Illustrations.PlaidCompanyCardDetail}
27+
height={isLarge ? variables.cardPreviewHeight : variables.cardIconHeight}
28+
width={isLarge ? variables.cardPreviewWidth : variables.cardIconWidth}
29+
/>
30+
</View>
31+
);
32+
}
33+
34+
export default PlaidCardFeedIcon;

src/languages/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3898,6 +3898,8 @@ const translations = {
38983898
assignedCard: ({assignee, link}: AssignedCardParams) => `assigned ${assignee} a ${link}! Imported transactions will appear in this chat.`,
38993899
companyCard: 'company card',
39003900
chooseCardFeed: 'Choose card feed',
3901+
ukRegulation:
3902+
'Expensify Limited is an agent of Plaid Financial Ltd., an authorised payment institution regulated by the Financial Conduct Authority under the Payment Services Regulations 2017 (Firm Reference Number: 804718). Plaid provides you with regulated account information services through Expensify Limited as its agent.',
39013903
},
39023904
expensifyCard: {
39033905
issueAndManageCards: 'Issue and manage your Expensify Cards',

src/languages/es.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3938,6 +3938,8 @@ const translations = {
39383938
assignedCard: ({assignee, link}: AssignedCardParams) => `ha asignado a ${assignee} una ${link}! Las transacciones importadas aparecerán en este chat.`,
39393939
companyCard: 'tarjeta de empresa',
39403940
chooseCardFeed: 'Elige feed de tarjetas',
3941+
ukRegulation:
3942+
'Expensify Limited es un agente de Plaid Financial Ltd., una institución de pago autorizada y regulada por la Financial Conduct Authority conforme al Reglamento de Servicios de Pago de 2017 (Número de Referencia de la Firma: 804718). Plaid te proporciona servicios regulados de información de cuentas a través de Expensify Limited como su agente.',
39413943
},
39423944
expensifyCard: {
39433945
issueAndManageCards: 'Emitir y gestionar Tarjetas Expensify',

0 commit comments

Comments
 (0)