Feat: existing personal cards#79562
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@ShridharGoel Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
Found few issues, reconverting to draft, will open as soon as I fix it |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
🚧 @joekaufmanexpensify has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / SafariScreen.Recording.2026-01-30.at.5.30.48.AM.mov |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
| */ | ||
| const filterPersonalCards = (cards: OnyxEntry<CardList>): CardList => { | ||
| return filterObject(cards ?? {}, (key, card) => isPersonalCard(card)); | ||
| const filterOutPersonalCards = (cards: OnyxEntry<CardList>): CardList => { |
There was a problem hiding this comment.
I have a question about this one, i am a bit confused why we are duplicating this function here once and another time in the cardUtils file .. it looks like the one in the cardUtils is not used. Can I remove it? let me know what u think
|
🚀 Deployed to staging by https://github.com/amyevans in version: 9.3.11-16 🚀
|
|
🚀 Deployed to production by https://github.com/Julesssss in version: 9.3.12-1 🚀
|
| <MenuItemWithTopDescription | ||
| description={translate('workspace.moreFeatures.companyCards.cardNumber')} | ||
| title={customCardNames?.[cardID] ?? getDefaultCardName(cardholder?.firstName)} |
There was a problem hiding this comment.
This was overlooked. The description should be card name, NOT card number.
Issue: #88555
| <HeaderWithBackButton | ||
| title={translate('workspace.moreFeatures.companyCards.cardNumber')} | ||
| onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS_WALLET_PERSONAL_CARD_DETAILS.getRoute(cardID))} | ||
| /> | ||
| <Text style={[styles.mh5, styles.mt3, styles.mb5]}>{translate('workspace.moreFeatures.companyCards.giveItNameInstruction')}</Text> | ||
| <FormProvider | ||
| formID={ONYXKEYS.FORMS.EDIT_PERSONAL_CARD_NAME_FORM} | ||
| submitButtonText={translate('common.save')} | ||
| onSubmit={submit} | ||
| style={[styles.flex1, styles.mh5]} | ||
| enabledWhenOffline | ||
| validate={validate} | ||
| shouldHideFixErrorsAlert | ||
| > | ||
| <InputWrapper | ||
| InputComponent={TextInput} | ||
| inputID={INPUT_IDS.NAME} | ||
| label={translate('workspace.moreFeatures.companyCards.cardNumber')} | ||
| aria-label={translate('workspace.moreFeatures.companyCards.cardNumber')} |
There was a problem hiding this comment.
Same here. This is card name edit page, NOT card number
| <ImageSVG | ||
| contentFit="contain" | ||
| src={getCardIconSource()} | ||
| pointerEvents="none" | ||
| height={variables.cardPreviewHeight} | ||
| width={variables.cardPreviewWidth} | ||
| /> |
There was a problem hiding this comment.
This page calls getCardFeedIcon() for the card art, but didn't use the Plaid-aware rendering (getPlaidInstitutionIconUrl → PlaidCardFeedIcon) that the wallet list in PaymentMethodList.tsx already had in the same PR.
Issue: [Personal Card Import] Incorrect card art on card details for Plaid personal card

Details
This PR introduces personal cards to the Wallet page
Fixed Issues
$ #78384
Tests
Prerequisites: You need to add testing personal card in the OldDot:
Test:
Test 2:
Offline tests
N/A
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)myBool && <MyComponent />.src/languages/*files and using the translation methodWaiting for Copylabel for a copy review on the original GH to get the correct copy.STYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)/** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG))Avataris modified, I verified thatAvataris working as expected in all cases)ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Details